From d5e097ef64b158422ea9c3efbc5fdc1fe4224b67 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sat, 5 Mar 2016 19:36:43 +0000 Subject: [PATCH 001/369] initial import --- Zend/zend_API.c | 12 +- Zend/zend_API.h | 1 + Zend/zend_ast.h | 2 +- Zend/zend_compile.c | 77 ++- Zend/zend_compile.h | 2 + Zend/zend_language_parser.y | 8 +- Zend/zend_vm_def.h | 54 ++ Zend/zend_vm_execute.h | 918 ++++++++++++++++++++++++++++++++ ext/opcache/zend_persist.c | 4 + ext/opcache/zend_persist_calc.c | 3 + 10 files changed, 1071 insertions(+), 10 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] todos and whatever --- Zend/zend_API.c | 1 + Zend/zend_vm_def.h | 29 +- Zend/zend_vm_execute.h | 684 ++++++++++++++++++++++++++++++++++------- 3 files changed, 600 insertions(+), 114 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] remove note --- Zend/zend_compile.c | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 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/369] exception on uninitialized property access --- Zend/zend_vm_def.h | 16 ++ Zend/zend_vm_execute.h | 402 ++++++++++++++++++++++++++++++++++++++++- 2 files changed, 409 insertions(+), 9 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] be tidy, don't leak, use flags ... other things, probably --- Zend/zend_API.c | 2 + Zend/zend_inheritance.c | 8 ++ Zend/zend_vm_def.h | 15 ++- Zend/zend_vm_execute.h | 268 ++++++++++++++++++++++++++++------------ 4 files changed, 207 insertions(+), 86 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] some tests ... --- .../typed_properties_001.phpt | 38 ++++++++++ .../typed_properties_002.phpt | 17 +++++ .../typed_properties_003.phpt | 17 +++++ .../typed_properties_004.phpt | 20 +++++ Zend/zend_vm_def.h | 5 +- Zend/zend_vm_execute.h | 75 ++++++++----------- 6 files changed, 124 insertions(+), 48 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_001.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_002.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_003.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_004.phpt diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt new file mode 100644 index 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/369] fixed todo --- Zend/zend_API.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] set flags correctly, remove todo --- Zend/zend_API.c | 4 +++- Zend/zend_vm_def.h | 1 - 2 files changed, 3 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] unused var --- Zend/tests/type_declarations/typed_properties_004.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 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/369] another test --- .../typed_properties_005.phpt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_005.phpt diff --git a/Zend/tests/type_declarations/typed_properties_005.phpt b/Zend/tests/type_declarations/typed_properties_005.phpt new file mode 100644 index 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/369] rename function so it makes sense --- Zend/zend_API.c | 4 ++-- Zend/zend_API.h | 4 +++- Zend/zend_compile.c | 2 +- 3 files changed, 6 insertions(+), 4 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] use flags here --- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 42 ++++++++++++++++++------------------------ 2 files changed, 20 insertions(+), 25 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] unexpected --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] more words in error message --- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 504 +++++++++++++----- 4 files changed, 374 insertions(+), 157 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 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/369] inheritance checks --- .../typed_properties_006.phpt | 15 ++ .../typed_properties_007.phpt | 19 ++ Zend/zend_inheritance.c | 23 +++ Zend/zend_vm_execute.h | 180 ------------------ 4 files changed, 57 insertions(+), 180 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_006.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_007.phpt diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt new file mode 100644 index 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/369] a todo --- Zend/zend_inheritance.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] nope --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] some more resolution stuff --- Zend/zend_inheritance.c | 30 +++++++++++++++-- Zend/zend_inheritance.h | 2 ++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 72 ++++++++++++++++++++--------------------- 4 files changed, 66 insertions(+), 40 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] more inheritance stuff --- .../typed_properties_008.phpt | 16 ++++++++++++++++ Zend/zend_inheritance.c | 19 ++++++++++++++++++- 2 files changed, 34 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_008.phpt diff --git a/Zend/tests/type_declarations/typed_properties_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt new file mode 100644 index 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/369] fix ast pretty printer --- Zend/zend_ast.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 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/369] refactor a little --- Zend/zend_vm_def.h | 71 +- Zend/zend_vm_execute.h | 2052 ++++++++++++++++++++-------------------- 2 files changed, 1080 insertions(+), 1043 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] add unset test --- .../typed_properties_009.phpt | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_009.phpt diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt new file mode 100644 index 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/369] abominable reading ahead of the unknown ... in the dark, scarily .... boo --- Zend/zend_vm_def.h | 19 ++--- Zend/zend_vm_execute.h | 171 ++++++++++++++++++++++------------------- 2 files changed, 100 insertions(+), 90 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] some mo tests --- .../typed_properties_010.phpt | 22 + .../typed_properties_011.phpt | 19 + .../typed_properties_012.phpt | 18 + Zend/zend_vm_def.h | 47 +- Zend/zend_vm_execute.h | 473 ++++++++++++++---- 5 files changed, 479 insertions(+), 100 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_010.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_011.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_012.phpt diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt new file mode 100644 index 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/369] fixes and more stuff --- Zend/zend_object_handlers.c | 8 ++++++++ Zend/zend_vm_def.h | 5 +++-- Zend/zend_vm_execute.h | 18 +++++++++--------- 3 files changed, 20 insertions(+), 11 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] woops --- Zend/zend_ast.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 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/369] don't check private property types during inheritance --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] check type on declaration --- Zend/zend_API.c | 49 +++++++++++++++++++++++++++++++++++++++++++++ Zend/zend_compile.c | 2 +- 2 files changed, 50 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] more tests, check initial value types --- .../type_declarations/typed_properties_013.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_014.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_015.phpt | 13 +++++++++++++ .../type_declarations/typed_properties_016.phpt | 17 +++++++++++++++++ Zend/zend_API.c | 12 ++++++------ 5 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_013.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_014.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_015.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_016.phpt diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt new file mode 100644 index 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/369] remove todo --- Zend/zend_API.c | 1 - 1 file changed, 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] @TazeTSchnitzel rescued me from hell ... --- Zend/zend_compile.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 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/369] better error messages --- .../typed_properties_002.phpt | 2 +- .../typed_properties_003.phpt | 2 +- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- .../typed_properties_009.phpt | 2 +- .../typed_properties_010.phpt | 2 +- .../typed_properties_011.phpt | 2 +- .../typed_properties_012.phpt | 2 +- .../typed_properties_013.phpt | 2 +- .../typed_properties_014.phpt | 2 +- .../typed_properties_015.phpt | 2 +- Zend/zend_API.c | 46 +-- Zend/zend_vm_def.h | 16 +- Zend/zend_vm_execute.h | 275 +++++++++--------- 14 files changed, 176 insertions(+), 183 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt index 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/369] cache class entry in property info --- Zend/zend_compile.h | 1 + Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 144 ++++++++++++++++++++--------------------- 3 files changed, 75 insertions(+), 74 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 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/369] nothing --- Zend/zend_API.c | 1 + ext/opcache/zend_persist.c | 2 ++ 2 files changed, 3 insertions(+) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] resolve property type --- Zend/zend_vm_def.h | 12 +- Zend/zend_vm_execute.h | 432 ++++++++++++++++++++++++++++++----------- 2 files changed, 333 insertions(+), 111 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] add void check during compile --- .../type_declarations/typed_properties_017.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 10 ++++++++++ 2 files changed, 26 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_017.phpt diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt new file mode 100644 index 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/369] tidy --- Zend/zend_vm_def.h | 28 +- Zend/zend_vm_execute.h | 936 ++++++++++++++++++++--------------------- 2 files changed, 482 insertions(+), 482 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] allow overflow of int->long, deref container in fetch_obj_w --- .../typed_properties_013.phpt | 4 +- Zend/zend_API.c | 51 +- Zend/zend_vm_def.h | 119 +- Zend/zend_vm_execute.h | 2963 ++++++++++------- 4 files changed, 1853 insertions(+), 1284 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 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/369] functions are good ? --- Zend/zend_API.c | 37 +- Zend/zend_execute.c | 26 + Zend/zend_execute.h | 2 + Zend/zend_inheritance.c | 20 +- Zend/zend_inheritance.h | 2 +- Zend/zend_vm_def.h | 61 +- Zend/zend_vm_execute.h | 2196 ++++++++++++++------------------------- 7 files changed, 831 insertions(+), 1513 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] more refactor --- .../typed_properties_015.phpt | 2 +- Zend/zend_API.c | 20 +- Zend/zend_execute.c | 50 +- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 24 +- Zend/zend_vm_execute.h | 864 ++---------------- 6 files changed, 124 insertions(+), 838 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_015.phpt b/Zend/tests/type_declarations/typed_properties_015.phpt index 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/369] urm ... we'll want a return value that makes sense --- Zend/zend_execute.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] remove todo --- Zend/zend_inheritance.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] ... --- Zend/zend_inheritance.h | 2 +- Zend/zend_vm_def.h | 59 ++-- Zend/zend_vm_execute.h | 585 ++++++++++++++++------------------------ 3 files changed, 251 insertions(+), 395 deletions(-) diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index 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/369] betterness --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] restrict declaration groups --- .../type_declarations/typed_properties_018.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 8 +++++++- 2 files changed, 23 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_018.phpt diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt new file mode 100644 index 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/369] comments --- Zend/zend_vm_def.h | 4 +++- Zend/zend_vm_execute.h | 18 ++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] nulling these seems like a good idea --- Zend/zend_inheritance.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] use flags here --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] use flags here too --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] test widening, fix uninitialized access check --- .../typed_properties_019.phpt | 21 ++++++++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 38 +++++++++---------- 3 files changed, 41 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_019.phpt diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt new file mode 100644 index 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/369] description corrections --- Zend/tests/type_declarations/typed_properties_009.phpt | 2 +- Zend/tests/type_declarations/typed_properties_010.phpt | 2 +- Zend/tests/type_declarations/typed_properties_011.phpt | 2 +- Zend/tests/type_declarations/typed_properties_012.phpt | 2 +- Zend/tests/type_declarations/typed_properties_013.phpt | 2 +- Zend/tests/type_declarations/typed_properties_014.phpt | 2 +- Zend/tests/type_declarations/typed_properties_015.phpt | 2 +- Zend/tests/type_declarations/typed_properties_016.phpt | 2 +- Zend/tests/type_declarations/typed_properties_017.phpt | 2 +- Zend/tests/type_declarations/typed_properties_018.phpt | 2 +- Zend/tests/type_declarations/typed_properties_019.phpt | 2 +- 11 files changed, 11 insertions(+), 11 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 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/369] can never be an object at compile time --- Zend/zend_execute.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] more verify in fetch_obj_r --- Zend/zend_vm_def.h | 17 +-- Zend/zend_vm_execute.h | 255 ++++++++++++++++++++++++----------------- 2 files changed, 160 insertions(+), 112 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] add tests for obj_read_r coerced value --- .../typed_properties_020.phpt | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_020.phpt diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt new file mode 100644 index 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/369] fix binary assign helper --- .../typed_properties_020.phpt | 7 +- Zend/zend_vm_def.h | 10 +++ Zend/zend_vm_execute.h | 90 +++++++++++++++++++ 3 files changed, 103 insertions(+), 4 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] woops --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] update test desc --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] delay check for constant/ast during compile --- Zend/zend_API.c | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] add test for that^ --- .../typed_properties_021.phpt | 20 +++++++++++++++++++ 1 file changed, 20 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_021.phpt diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt new file mode 100644 index 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/369] moar tests --- .../typed_properties_021.phpt | 2 +- .../typed_properties_022.phpt | 20 +++++++++++++++++++ 2 files changed, 21 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_022.phpt diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt index 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/369] refactor switch --- Zend/zend_API.c | 21 +++++++++++---------- 1 file changed, 11 insertions(+), 10 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] squish branches --- Zend/zend_API.c | 7 ++----- 1 file changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] disallow typed static properties, throw core errors for internal class stuff --- .../typed_properties_023.phpt | 21 +++++++++++++ Zend/zend_API.c | 30 ++++++++++++------- Zend/zend_compile.c | 7 +++++ Zend/zend_execute.c | 4 +-- 4 files changed, 49 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_023.phpt diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt new file mode 100644 index 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/369] makes no sense --- Zend/zend_compile.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 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/369] add tests for inheritance of private props --- .../typed_properties_024.phpt | 21 +++++++++++++++++++ Zend/zend_inheritance.c | 2 +- Zend/zend_vm_def.h | 3 +++ 3 files changed, 25 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_024.phpt diff --git a/Zend/tests/type_declarations/typed_properties_024.phpt b/Zend/tests/type_declarations/typed_properties_024.phpt new file mode 100644 index 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/369] export type from ast ... note that there are still outstanding bugs in AST exporter not connected to this RFC --- Zend/zend_ast.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 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/369] cleanup tests --- Zend/tests/type_declarations/typed_properties_020.phpt | 2 -- Zend/tests/type_declarations/typed_properties_021.phpt | 2 -- Zend/tests/type_declarations/typed_properties_022.phpt | 2 -- Zend/tests/type_declarations/typed_properties_023.phpt | 4 ---- 4 files changed, 10 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] fix func arg fetch handler --- Zend/zend_vm_def.h | 6 ++---- Zend/zend_vm_execute.h | 45 ++++++++++++++++++++++++++++-------------- 2 files changed, 32 insertions(+), 19 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] fix mixing typed and untyped properties, add another test for that --- .../type_declarations/typed_properties_018.phpt | 2 +- .../type_declarations/typed_properties_025.phpt | 16 ++++++++++++++++ Zend/zend_compile.c | 9 ++++++++- 3 files changed, 25 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_025.phpt diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index 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/369] reflection changes --- ext/reflection/php_reflection.c | 119 ++++++++++++++++--- ext/reflection/tests/ReflectionType_001.phpt | 29 +++++ 2 files changed, 129 insertions(+), 19 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 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/369] the same changes, but nicer --- ext/reflection/php_reflection.c | 31 ++++++++++++++++++------------- 1 file changed, 18 insertions(+), 13 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 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/369] better if this makes sense ... I think --- ext/reflection/tests/ReflectionType_001.phpt | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index 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/369] ReflectionProperty::hasType --- ext/reflection/php_reflection.c | 18 ++++++++++++++++++ ext/reflection/tests/ReflectionType_001.phpt | 8 ++++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 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/369] fix trait inheritance --- .../typed_properties_026.phpt | 25 +++++++++++++++++++ Zend/zend_inheritance.c | 7 +++--- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_026.phpt diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt new file mode 100644 index 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/369] woops --- Zend/zend_inheritance.c | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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/369] typed properties need to be undef initial value --- Zend/tests/type_declarations/typed_properties_026.phpt | 6 +++++- Zend/zend_inheritance.c | 3 +++ 2 files changed, 8 insertions(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt index 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/369] only allow widening int to float at runtime --- .../type_declarations/typed_properties_027.phpt | 17 +++++++++++++++++ Zend/zend_execute.c | 2 +- 2 files changed, 18 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_027.phpt diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt new file mode 100644 index 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/369] with much regret and sadness ... use strict types directive --- .../typed_properties_013.phpt | 3 +- .../typed_properties_014.phpt | 2 +- .../typed_properties_015.phpt | 3 +- .../typed_properties_020.phpt | 11 +- .../typed_properties_027.phpt | 3 +- .../typed_properties_028.phpt | 15 +++ .../typed_properties_029.phpt | 18 +++ Zend/zend_API.c | 18 --- Zend/zend_compile.c | 22 ++++ Zend/zend_execute.c | 14 +- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 6 +- Zend/zend_vm_execute.h | 120 +++++++++--------- 13 files changed, 145 insertions(+), 92 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_028.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_029.phpt diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 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/369] fix binary assign op surpriseness --- .../typed_properties_020.phpt | 2 +- Zend/zend_vm_def.h | 58 +- Zend/zend_vm_execute.h | 522 +++++++++--------- 3 files changed, 301 insertions(+), 281 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] stuff --- Zend/zend_execute.c | 10 + Zend/zend_vm_def.h | 82 +++-- Zend/zend_vm_execute.h | 720 +++++++++++++++++++++++++---------------- 3 files changed, 512 insertions(+), 300 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] an woops --- Zend/zend_vm_def.h | 30 +++-- Zend/zend_vm_execute.h | 288 +++++++++++++++++++++++++---------------- 2 files changed, 198 insertions(+), 120 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] lift unset restriction, possibly temporarily while we argue about stuff ... --- .../typed_properties_009.phpt | 15 ++- Zend/zend_object_handlers.c | 7 +- Zend/zend_vm_def.h | 13 -- Zend/zend_vm_execute.h | 117 ------------------ 4 files changed, 18 insertions(+), 134 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 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/369] add test --- .../typed_properties_030.phpt | 25 +++++++++++++++++++ 1 file changed, 25 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_030.phpt diff --git a/Zend/tests/type_declarations/typed_properties_030.phpt b/Zend/tests/type_declarations/typed_properties_030.phpt new file mode 100644 index 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/369] tidy up vm stuff --- Zend/zend_execute.c | 30 + Zend/zend_execute.h | 21 + Zend/zend_vm_def.h | 112 ++- Zend/zend_vm_execute.h | 1619 +++++++++++++++++----------------------- 4 files changed, 778 insertions(+), 1004 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] some consistency --- .../typed_properties_019.phpt | 18 +- .../typed_properties_031.phpt | 22 + Zend/zend_execute.c | 12 +- Zend/zend_vm_def.h | 42 +- Zend/zend_vm_execute.h | 378 +++++++++++++++++- 5 files changed, 452 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_031.phpt diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt index 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/369] this kind of type verification only happens at runtime --- Zend/zend_execute.c | 59 +++++-------- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 14 +-- Zend/zend_vm_execute.h | 192 ++++++++++++++++++++--------------------- 4 files changed, 124 insertions(+), 143 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] info always available --- Zend/zend_execute.c | 32 +++---- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 14 +-- Zend/zend_vm_execute.h | 192 ++++++++++++++++++++--------------------- 4 files changed, 118 insertions(+), 122 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] improve error message to distinguish between arg by reference and by reference assignment --- .../typed_properties_010.phpt | 2 +- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 30 +++++++++---------- 3 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 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/369] not needed --- Zend/zend_vm_def.h | 12 ----- Zend/zend_vm_execute.h | 108 ----------------------------------------- 2 files changed, 120 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] check in rw fetch, not sure about this ? --- Zend/zend_vm_def.h | 23 +++- Zend/zend_vm_execute.h | 213 +++++++++++++++++++++++++++++++------ ext/opcache/zend_persist.c | 2 +- 3 files changed, 201 insertions(+), 37 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] just make travis run again --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] the next opline always exists --- Zend/zend_vm_def.h | 40 +++-- Zend/zend_vm_execute.h | 360 +++++++++++++++++++---------------------- 2 files changed, 180 insertions(+), 220 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] require guard here too --- Zend/zend_vm_def.h | 8 ++++++++ Zend/zend_vm_execute.h | 32 ++++++++++++++++++++++++++++++++ 2 files changed, 40 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] delay fetching iterator until after guard --- Zend/zend_vm_def.h | 4 +++- Zend/zend_vm_execute.h | 16 ++++++++++++---- 2 files changed, 15 insertions(+), 5 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] --indentation --- Zend/zend_vm_def.h | 27 ++--- Zend/zend_vm_execute.h | 243 +++++++++++++++++++++-------------------- 2 files changed, 140 insertions(+), 130 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] fix return by ref --- .../typed_properties_032.phpt | 21 +++++++++++++++++++ Zend/zend_vm_def.h | 2 ++ Zend/zend_vm_execute.h | 18 ++++++++++++++++ 3 files changed, 41 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_032.phpt diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt new file mode 100644 index 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/369] do not allow send ref --- Zend/zend_vm_def.h | 2 ++ Zend/zend_vm_execute.h | 18 ++++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] add yield by reference guard --- .../typed_properties_033.phpt | 19 +++++++ Zend/zend_vm_def.h | 6 ++- Zend/zend_vm_execute.h | 54 ++++++++++++------- 3 files changed, 59 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_033.phpt diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt new file mode 100644 index 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/369] guard add array element --- .../typed_properties_034.phpt | 24 +++++++++++++++++++ Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 9 +++++++ 3 files changed, 35 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_034.phpt diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt new file mode 100644 index 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/369] use api for stuff ... doh --- Zend/zend_execute.c | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] inheritance fixes --- .../typed_properties_035.phpt | 14 +++++ Zend/zend_inheritance.c | 52 +++++++++++-------- 2 files changed, 44 insertions(+), 22 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_035.phpt diff --git a/Zend/tests/type_declarations/typed_properties_035.phpt b/Zend/tests/type_declarations/typed_properties_035.phpt new file mode 100644 index 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/369] woops --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] separate proeprty type verification and error routine, fix display of private member names --- Zend/zend_execute.c | 44 +++++++++++-------- Zend/zend_execute.h | 1 + Zend/zend_vm_def.h | 7 +++ Zend/zend_vm_execute.h | 96 ++++++++++++++++++++++++++++++++++++++++++ 4 files changed, 130 insertions(+), 18 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] better detection --- Zend/zend_execute.c | 23 +++ Zend/zend_vm_def.h | 37 ++--- Zend/zend_vm_execute.h | 333 +++++++++++++---------------------------- 3 files changed, 143 insertions(+), 250 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] caches and things ... Thanks Dmitry :) --- Zend/zend_compile.c | 14 +- Zend/zend_execute.c | 9 +- Zend/zend_object_handlers.c | 2 + Zend/zend_vm_def.h | 20 +- Zend/zend_vm_execute.h | 258 +++++++++++------------ ext/opcache/Optimizer/compact_literals.c | 6 +- ext/opcache/Optimizer/zend_optimizer.c | 6 +- 7 files changed, 164 insertions(+), 151 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 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/369] fix foreach, possibly ... --- .../typed_properties_036.phpt | 20 ++++++++++++++ Zend/zend_execute.c | 27 ++++++++++++++----- Zend/zend_execute.h | 1 + Zend/zend_vm_def.h | 15 +++++++++++ Zend/zend_vm_execute.h | 15 +++++++++++ 5 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_036.phpt diff --git a/Zend/tests/type_declarations/typed_properties_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt new file mode 100644 index 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/369] fix foreach clean non persistent type info --- Zend/zend_execute.h | 4 +++- Zend/zend_execute_API.c | 22 ++++++++++++++++++++++ Zend/zend_vm_def.h | 3 +++ 3 files changed, 28 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 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/369] change decl groups --- .../typed_properties_018.phpt | 10 ++++- .../typed_properties_025.phpt | 5 ++- .../typed_properties_036.phpt | 7 ++-- Zend/zend_ast.c | 25 +++++++++---- Zend/zend_ast.h | 5 ++- Zend/zend_compile.c | 37 ++++++++----------- Zend/zend_language_parser.y | 13 ++++--- 7 files changed, 56 insertions(+), 46 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index 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/369] overflow consistency --- Zend/zend_execute.c | 11 ++- Zend/zend_vm_def.h | 31 +++--- Zend/zend_vm_execute.h | 210 ++++++++++++++++++++++------------------- 3 files changed, 137 insertions(+), 115 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] moar consistent ... even if strange --- Zend/zend_vm_def.h | 11 +- Zend/zend_vm_execute.h | 468 ++++++++++++++++++++++------------------- 2 files changed, 258 insertions(+), 221 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] make var_dump more acceptable --- .../type_declarations/typed_properties_037.phpt | 17 +++++++++++++++++ ext/standard/var.c | 17 ++++++++++++++--- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_037.phpt diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt new file mode 100644 index 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/369] better --- ext/standard/var.c | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index 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/369] haaaaaands --- Zend/zend_execute.c | 80 +- Zend/zend_object_handlers.c | 22 + Zend/zend_vm_def.h | 107 +-- Zend/zend_vm_execute.h | 1544 ++++++++++------------------------- 4 files changed, 521 insertions(+), 1232 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] add overflowingness test --- .../typed_properties_038.phpt | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_038.phpt diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt new file mode 100644 index 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/369] make travis run --- Zend/tests/type_declarations/typed_properties_038.phpt | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index 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/369] fix test [ci skip] --- .../tests/type_declarations/typed_properties_027.phpt | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 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/369] fix memory error in std_write_property --- Zend/zend_object_handlers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] fix another possible memory error --- Zend/zend_object_handlers.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] better guard here and use _ex to avoid ever reading type info, we know its an object --- Zend/zend_object_handlers.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] don't perform check on inline properties on read, only for magic fix binary op handler add case to zend_vm_is_fetching_reference optimize zend_verify_property_type for most common case in first branch remove useless undef --- Zend/zend_execute.c | 22 ++++++++++++++-------- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 30 +++++++++++++++--------------- 3 files changed, 30 insertions(+), 24 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] use more efficient macro when possible --- Zend/zend_vm_def.h | 16 ++-- Zend/zend_vm_execute.h | 174 ++++++++++++++++++++--------------------- 2 files changed, 95 insertions(+), 95 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] fix test case given by dmitry ... --- Zend/zend_execute.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] only need null check here --- Zend/zend_execute.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] use more efficient stuff here --- Zend/zend_execute.c | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] this was checked on write too --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 30 +++++++++++++++--------------- 2 files changed, 17 insertions(+), 17 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] safety for non standard objects, remove pointless check --- Zend/zend_object_handlers.c | 11 - Zend/zend_vm_def.h | 12 + Zend/zend_vm_execute.h | 432 ++++++++++++++++++++++++++++++++++++ 3 files changed, 444 insertions(+), 11 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] some more improvements ... haaaands --- .../typed_properties_020.phpt | 16 +++++--------- Zend/zend_execute.c | 22 +++++++++++++++++-- 2 files changed, 26 insertions(+), 12 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 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/369] use api stuff here --- Zend/zend_object_handlers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] catch more cases here --- Zend/zend_execute.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] nothin to see here ... --- Zend/zend_execute.c | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] improve performance --- Zend/zend_execute.c | 69 +++++++++++++-------------------------------- Zend/zend_execute.h | 49 ++++++++++++++++++++++++++++++-- Zend/zend_types.h | 1 + 3 files changed, 67 insertions(+), 52 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] cold error path --- Zend/zend_execute.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 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/369] optimize all the things, thanks @bwoebi --- Zend/zend_execute.c | 8 +- Zend/zend_types.h | 3 + Zend/zend_vm_def.h | 8 +- Zend/zend_vm_execute.h | 176 ++++++++++++++++++++--------------------- 4 files changed, 97 insertions(+), 98 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] more perf stuff --- Zend/zend_execute.c | 2 +- Zend/zend_vm_def.h | 16 +- Zend/zend_vm_execute.h | 352 ++++++++++++++++++++--------------------- 3 files changed, 185 insertions(+), 185 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] dtor correct thing --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] dtor tmp --- Zend/zend_execute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] check correct variable --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Optimize & fix value reassign --- .../typed_properties_039.phpt | 31 + Zend/zend_execute.c | 35 +- Zend/zend_execute.h | 38 +- Zend/zend_object_handlers.c | 5 +- Zend/zend_vm_def.h | 29 +- Zend/zend_vm_execute.h | 817 +++++++++--------- 6 files changed, 496 insertions(+), 459 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_039.phpt diff --git a/Zend/tests/type_declarations/typed_properties_039.phpt b/Zend/tests/type_declarations/typed_properties_039.phpt new file mode 100644 index 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/369] Easy optimization: constant assignment to objects will always succeed after it succeeded at least once --- Zend/zend_vm_def.h | 4 ++ Zend/zend_vm_execute.h | 144 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 148 insertions(+) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Optimize property fetching and fix edge cases with __get() --- .../typed_properties_003.phpt | 7 +- .../typed_properties_009.phpt | 9 +- .../typed_properties_036.phpt | 12 +- .../typed_properties_040.phpt | 26 + Zend/zend_API.c | 2 +- Zend/zend_execute.c | 129 +- Zend/zend_execute.h | 23 +- Zend/zend_object_handlers.c | 37 +- Zend/zend_types.h | 4 - Zend/zend_vm_def.h | 100 +- Zend/zend_vm_execute.h | 1033 +++++------------ ext/standard/var.c | 56 +- 12 files changed, 484 insertions(+), 954 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_040.phpt diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index 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/369] Disallow functions to set references and bad types --- Zend/zend_API.c | 16 ++- Zend/zend_execute.c | 2 - Zend/zend_object_handlers.c | 4 +- ext/standard/basic_functions.c | 4 + ext/standard/basic_functions.h | 1 + .../tests/serialize/typed_property_refs.phpt | 29 +++++ ext/standard/var.c | 12 +- ext/standard/var_unserializer.c | 111 ++++++++++++------ ext/standard/var_unserializer.re | 46 +++++++- 9 files changed, 172 insertions(+), 53 deletions(-) create mode 100644 ext/standard/tests/serialize/typed_property_refs.phpt diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] missing colons --- Zend/zend_vm_def.h | 4 ++-- Zend/zend_vm_execute.h | 36 ++++++++++++++++++------------------ 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Fixed white-spaces --- .../typed_properties_001.phpt | 2 +- .../typed_properties_004.phpt | 2 +- .../typed_properties_005.phpt | 2 +- .../typed_properties_034.phpt | 4 ++-- Zend/zend_API.c | 2 +- Zend/zend_ast.c | 2 +- Zend/zend_compile.c | 6 +++--- Zend/zend_execute.c | 12 +++++------ Zend/zend_execute.h | 2 +- Zend/zend_execute_API.c | 4 ++-- Zend/zend_inheritance.c | 7 +++---- Zend/zend_language_parser.y | 2 +- Zend/zend_vm_def.h | 2 +- ext/reflection/php_reflection.c | 20 +++++++++---------- ext/reflection/tests/ReflectionType_001.phpt | 2 +- .../tests/serialize/typed_property_refs.phpt | 4 ++-- ext/standard/var.c | 12 +++++------ 17 files changed, 42 insertions(+), 45 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt index 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/369] Revert insignificant formatting changes to minimize the patch against master --- Zend/zend_execute.c | 2 - Zend/zend_vm_def.h | 41 ++-- Zend/zend_vm_execute.h | 434 ++++++++++++++++------------------------- 3 files changed, 182 insertions(+), 295 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Fix passed zval reassignments (opcache.protect_memory=1) --- Zend/zend_object_handlers.c | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] Respect also immutable values --- .../typed_properties_027.phpt | 2 +- .../typed_properties_041.phpt | 23 +++++++++++++++++++ Zend/zend_object_handlers.c | 4 ++-- 3 files changed, 26 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_041.phpt diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 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/369] Added tests --- .../typed_properties_042.phpt | 25 +++++++++++++++++++ .../typed_properties_043.phpt | 24 ++++++++++++++++++ 2 files changed, 49 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_042.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt new file mode 100644 index 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/369] Added test (error message should be the same independently of called function) --- .../typed_properties_044.phpt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_044.phpt diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt new file mode 100644 index 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/369] Fixed Zend/tests/type_declarations/typed_properties_044.phpt (error message should be the same independently of called function) --- .../typed_properties_010.phpt | 2 +- .../typed_properties_044.phpt | 2 +- Zend/zend_execute.c | 57 +-- Zend/zend_vm_def.h | 35 +- Zend/zend_vm_execute.h | 369 ++++++------------ 5 files changed, 165 insertions(+), 300 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 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/369] Fixed memory leaks --- .../typed_properties_045.phpt | 15 +++++++ Zend/zend_vm_def.h | 10 +++++ Zend/zend_vm_execute.h | 40 +++++++++++++++++++ 3 files changed, 65 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_045.phpt diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt new file mode 100644 index 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/369] Avoid type check for dynamic properties --- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 252 +++++++++++++++++++++++------------------ 2 files changed, 148 insertions(+), 111 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Removed "safety" code for non standard zend objects. If non-standard objects implement typed properties, they should care about type compatibility checks their seves. --- Zend/zend_vm_def.h | 12 -- Zend/zend_vm_execute.h | 432 ----------------------------------------- 2 files changed, 444 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Fixed memory leaks --- .../typed_properties_046.phpt | 29 +++ Zend/zend_object_handlers.c | 1 + Zend/zend_vm_def.h | 5 +- Zend/zend_vm_execute.h | 180 ++++++++++++++---- 4 files changed, 178 insertions(+), 37 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_046.phpt diff --git a/Zend/tests/type_declarations/typed_properties_046.phpt b/Zend/tests/type_declarations/typed_properties_046.phpt new file mode 100644 index 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/369] Fixed test (NULL is no compatible with "int" and should produce a error) --- Zend/tests/type_declarations/typed_properties_009.phpt | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 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/369] Get rid of zend_verify_scalar_property_type(), use common zend_verify_scalar_property_type() instead. --- Zend/zend_execute.c | 20 +------------------- 1 file changed, 1 insertion(+), 19 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Optimized zend_verify_property_type() --- Zend/zend_execute.c | 54 +++++++++++++++---------------- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 72 +++++++++++++++++++++--------------------- 3 files changed, 63 insertions(+), 65 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Avoid type check for dynamic properties --- Zend/zend_object_handlers.c | 27 ++++++++++++++------------- 1 file changed, 14 insertions(+), 13 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] Added support for nullable typed properties --- .../typed_properties_047.phpt | 60 +++++++++++++++++++ .../typed_properties_048.phpt | 60 +++++++++++++++++++ Zend/zend_API.c | 5 +- Zend/zend_API.h | 2 +- Zend/zend_compile.c | 11 +++- Zend/zend_compile.h | 1 + Zend/zend_execute.c | 2 + Zend/zend_inheritance.c | 18 ++++-- ext/standard/var.c | 6 +- 9 files changed, 152 insertions(+), 13 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_047.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt new file mode 100644 index 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/369] Added test --- .../typed_properties_049.phpt | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_049.phpt diff --git a/Zend/tests/type_declarations/typed_properties_049.phpt b/Zend/tests/type_declarations/typed_properties_049.phpt new file mode 100644 index 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/369] Fix further invalid source zval overwrites --- .../typed_properties_050.phpt | 19 + Zend/zend_object_handlers.c | 28 +- Zend/zend_vm_def.h | 15 +- Zend/zend_vm_execute.h | 540 ++++++++++++++++-- 4 files changed, 554 insertions(+), 48 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_050.phpt diff --git a/Zend/tests/type_declarations/typed_properties_050.phpt b/Zend/tests/type_declarations/typed_properties_050.phpt new file mode 100644 index 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/369] Reverted incomplete fix --- Zend/zend_object_handlers.c | 24 +- Zend/zend_vm_def.h | 15 +- Zend/zend_vm_execute.h | 540 +++--------------------------------- 3 files changed, 41 insertions(+), 538 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 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/369] Fixed test --- Zend/tests/type_declarations/typed_properties_050.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_050.phpt b/Zend/tests/type_declarations/typed_properties_050.phpt index 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/369] A better to fix for source zval separation on type conversion caused by weak property type check. --- .../typed_properties_051.phpt | 27 ++ Zend/zend_API.c | 10 +- Zend/zend_execute.c | 55 ++-- Zend/zend_execute.h | 2 +- Zend/zend_object_handlers.c | 15 +- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 252 +++++++++++++----- ext/standard/var_unserializer.c | 46 ++-- ext/standard/var_unserializer.re | 5 +- 9 files changed, 292 insertions(+), 127 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_051.phpt diff --git a/Zend/tests/type_declarations/typed_properties_051.phpt b/Zend/tests/type_declarations/typed_properties_051.phpt new file mode 100644 index 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/369] Changed behavior of uninitialized nullable properties (accoding to conversation with Joe) --- .../type_declarations/typed_properties_047.phpt | 12 +++++++----- .../type_declarations/typed_properties_048.phpt | 6 ++++-- Zend/zend_API.c | 2 +- Zend/zend_object_handlers.c | 3 ++- 4 files changed, 14 insertions(+), 9 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 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/369] Revert useless changes --- Zend/zend_ast.h | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_ast.h b/Zend/zend_ast.h index 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/369] Removed useless check (references are never fetched using FETCH_OBJ_RW) --- Zend/zend_vm_def.h | 7 ------ Zend/zend_vm_execute.h | 57 ------------------------------------------ 2 files changed, 64 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Removed duplicate code --- Zend/zend_vm_def.h | 12 ++--------- Zend/zend_vm_execute.h | 48 +++++++----------------------------------- 2 files changed, 10 insertions(+), 50 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 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/369] Added support for nullavle types in AST pretty printer --- .../tests/type_declarations/types_in_ast.phpt | 23 +++++++++++++++++++ Zend/zend_ast.c | 9 ++++++++ 2 files changed, 32 insertions(+) create mode 100644 Zend/tests/type_declarations/types_in_ast.phpt diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt new file mode 100644 index 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/369] Revert useless change --- Zend/zend_ast.c | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 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/369] Added test (memory leaks) --- .../typed_properties_052.phpt | 34 +++++++++++++++++++ 1 file changed, 34 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_052.phpt diff --git a/Zend/tests/type_declarations/typed_properties_052.phpt b/Zend/tests/type_declarations/typed_properties_052.phpt new file mode 100644 index 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/369] "string" mat be also a valid "callable" --- .../typed_properties_053.phpt | 26 +++++++++++++++++++ .../typed_properties_054.phpt | 12 +++++++++ Zend/zend_compile.c | 4 +-- 3 files changed, 40 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_053.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_054.phpt diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt new file mode 100644 index 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/369] Removed unused function and macro --- Zend/zend_execute.h | 20 -------------------- 1 file changed, 20 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 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/369] Optimization --- .../typed_properties_003.phpt | 6 +- Zend/zend_compile.c | 56 ++-- Zend/zend_compile.h | 2 +- Zend/zend_execute.c | 92 +++---- Zend/zend_object_handlers.c | 8 - Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 251 +++--------------- 7 files changed, 115 insertions(+), 323 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index 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/369] Removed unused zend_object_fetch_property_type_info() and renamed zend_object_fetch_property_type_info_ex() into zend_object_fetch_property_type_info() --- Zend/zend_execute.h | 16 ++-------------- Zend/zend_object_handlers.c | 8 ++++---- ext/standard/var.c | 4 ++-- 3 files changed, 8 insertions(+), 20 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 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/369] Fixed wrong exception when passing element of typed property by reference. --- .../typed_properties_055.phpt | 27 +++++++++++++++++ Zend/zend_compile.c | 8 ++--- Zend/zend_compile.h | 1 + Zend/zend_execute.c | 4 +-- Zend/zend_vm_def.h | 6 ++-- Zend/zend_vm_execute.h | 30 +++++++++---------- Zend/zend_vm_gen.php | 4 ++- Zend/zend_vm_opcodes.c | 4 +-- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/zend_dump.c | 5 ++++ 10 files changed, 63 insertions(+), 27 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_055.phpt diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt new file mode 100644 index 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/369] Optimisation --- Zend/zend_execute.c | 18 +++++++++++++----- 1 file changed, 13 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Added test (failed with valgrind) --- .../typed_properties_056.phpt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_056.phpt diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt new file mode 100644 index 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/369] Added test (failed with valgrind) --- .../typed_properties_057.phpt | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_057.phpt diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt new file mode 100644 index 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/369] Fixed memory leak --- Zend/zend_opcode.c | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 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/369] Check type after constant resolution --- .../typed_properties_058.phpt | 33 +++++++++++++++++++ Zend/zend_API.c | 11 +++++++ 2 files changed, 44 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_058.phpt diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt new file mode 100644 index 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/369] Support for type checks of named constants in property default values. --- .../typed_properties_058.phpt | 14 +++++++----- Zend/zend_API.c | 22 ++++++++++++------- 2 files changed, 23 insertions(+), 13 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 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/369] Fixed memory leaks --- Zend/zend_execute.c | 76 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 17 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Faster +=/++/-- --- .../typed_properties_057.phpt | 10 +- Zend/zend_vm_def.h | 171 +- Zend/zend_vm_execute.h | 1521 +++++++++++++++-- 3 files changed, 1490 insertions(+), 212 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt index 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/369] Fixed ZTS compatibility --- Zend/zend.c | 25 +++++++++++++++++++++++++ Zend/zend_execute_API.c | 22 ---------------------- 2 files changed, 25 insertions(+), 22 deletions(-) diff --git a/Zend/zend.c b/Zend/zend.c index 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/369] Fixed compilation warning --- Zend/zend.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend.c b/Zend/zend.c index 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/369] fixed white-spaces --- .../typed_properties_042.phpt | 2 +- .../typed_properties_043.phpt | 2 +- .../typed_properties_051.phpt | 2 +- .../typed_properties_052.phpt | 2 +- .../typed_properties_054.phpt | 2 +- .../typed_properties_056.phpt | 2 +- .../tests/type_declarations/types_in_ast.phpt | 46 +++++++++---------- Zend/zend_execute.c | 10 ++-- Zend/zend_vm_def.h | 10 ++-- Zend/zend_vm_execute.h | 36 +++++++-------- 10 files changed, 57 insertions(+), 57 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt index 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/369] Optimization --- Zend/zend_execute.c | 19 +-- Zend/zend_execute.h | 4 +- Zend/zend_vm_def.h | 30 ++--- Zend/zend_vm_execute.h | 270 ++++++++++++++--------------------------- 4 files changed, 109 insertions(+), 214 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Cleanup ext/reflection changes --- ext/reflection/php_reflection.c | 70 +++++++++++++++++++-------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 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/369] Moved BG(unserialize_refs) into php_unserialize_data_t --- ext/standard/basic_functions.c | 4 -- ext/standard/basic_functions.h | 1 - ext/standard/php_var.h | 1 + ext/standard/var.c | 2 - ext/standard/var_unserializer.c | 72 ++++++++++++++++++-------------- ext/standard/var_unserializer.re | 10 ++++- 6 files changed, 50 insertions(+), 40 deletions(-) diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index 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/369] Keep GCC from incorrect over-optimisation --- Zend/zend_operators.h | 16 ++++++++-------- 1 file changed, 8 insertions(+), 8 deletions(-) diff --git a/Zend/zend_operators.h b/Zend/zend_operators.h index 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/369] Removed useles code (default value should be already properly set in trait property) --- .../typed_properties_059.phpt | 29 +++++++++++++++++++ Zend/zend_inheritance.c | 3 -- 2 files changed, 29 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_059.phpt diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt new file mode 100644 index 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/369] Don't mess NULL and UNDEF default value back and force. Set proper value in first place. --- Zend/zend_API.c | 4 ---- Zend/zend_compile.c | 2 ++ 2 files changed, 2 insertions(+), 4 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 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/369] Remove duplicate checks --- Zend/zend_execute.c | 12 ++---------- 1 file changed, 2 insertions(+), 10 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 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/369] Fixed incorrect argument types --- Zend/zend_execute.h | 6 +++--- Zend/zend_object_handlers.c | 8 ++++---- ext/standard/var.c | 4 ++-- 3 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 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/369] Remove bad checks for simple property inheritance --- .../typed_properties_060.phpt | 23 +++++++++++++++++++ Zend/zend_inheritance.c | 20 ---------------- 2 files changed, 23 insertions(+), 20 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_060.phpt diff --git a/Zend/tests/type_declarations/typed_properties_060.phpt b/Zend/tests/type_declarations/typed_properties_060.phpt new file mode 100644 index 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/369] changes prompted by review --- .../typed_properties_053.phpt | 14 +++----------- .../typed_properties_054.phpt | 2 +- Zend/zend.c | 4 +++- Zend/zend_ast.c | 2 +- Zend/zend_compile.c | 19 ++++++++----------- Zend/zend_execute.c | 4 ++-- 6 files changed, 18 insertions(+), 27 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 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/369] make consistent with RFC (nullables) --- .../tests/type_declarations/typed_properties_047.phpt | 4 +--- .../tests/type_declarations/typed_properties_048.phpt | 4 +--- Zend/zend_object_handlers.c | 11 ++++++----- 3 files changed, 8 insertions(+), 11 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 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/369] fix inheritance error --- Zend/zend_inheritance.c | 46 ++++++++++++++++++++--------------------- 1 file changed, 22 insertions(+), 24 deletions(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 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))) { From 1b8bd8856d0888e15d298053869bc44726f70fc3 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 10 Nov 2016 15:11:53 +0100 Subject: [PATCH 199/369] Initial ref types patch Tests and functions outside ext/standard still need patching --- Zend/zend_API.c | 33 +- Zend/zend_API.h | 103 +- Zend/zend_compile.c | 8 +- Zend/zend_execute.c | 69 +- Zend/zend_execute.h | 42 +- Zend/zend_object_handlers.c | 4 +- Zend/zend_types.h | 6 + Zend/zend_vm_def.h | 253 +- Zend/zend_vm_execute.h | 3315 +++++++++++++++++++++++--- Zend/zend_vm_gen.php | 53 +- Zend/zend_vm_opcodes.c | 4 +- Zend/zend_vm_opcodes.h | 1 + ext/intl/formatter/formatter_parse.c | 14 +- ext/standard/basic_functions.c | 7 +- ext/standard/dns.c | 4 +- ext/standard/exec.c | 7 +- ext/standard/file.c | 7 +- ext/standard/fsock.c | 7 +- ext/standard/head.c | 10 +- ext/standard/image.c | 2 +- ext/standard/proc_open.c | 2 +- ext/standard/scanf.c | 34 +- ext/standard/streamsfuncs.c | 51 +- ext/standard/string.c | 17 +- 24 files changed, 3513 insertions(+), 540 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 75bd2c0c85d1a..70449de2d743a 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -500,9 +500,13 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons int check_null = 0; int separate = 0; zval *real_arg = arg; + void *ref_type = NULL; /* scan through modifiers */ - ZVAL_DEREF(arg); + if (UNEXPECTED(Z_ISREF_P(arg))) { + ref_type = Z_REF_P(arg)->type; + arg = Z_REFVAL_P(arg); + } while (1) { if (*spec_walk == '/') { SEPARATE_ZVAL_NOREF(arg); @@ -527,7 +531,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) { + if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L', ref_type)) { return "integer"; } } @@ -542,7 +546,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_double(arg, p, is_null, check_null)) { + if (!zend_parse_arg_double(arg, p, is_null, check_null, ref_type)) { return "float"; } } @@ -552,7 +556,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_string(arg, p, pl, check_null)) { + if (!zend_parse_arg_string(arg, p, pl, check_null, ref_type)) { return "string"; } } @@ -562,7 +566,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_path(arg, p, pl, check_null)) { + if (!zend_parse_arg_path(arg, p, pl, check_null, ref_type)) { return "a valid path"; } } @@ -571,7 +575,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'P': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_path_str(arg, str, check_null)) { + if (!zend_parse_arg_path_str(arg, str, check_null, ref_type)) { return "a valid path"; } } @@ -580,7 +584,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'S': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_str(arg, str, check_null)) { + if (!zend_parse_arg_str(arg, str, check_null, ref_type)) { return "string"; } } @@ -595,7 +599,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_bool(arg, p, is_null, check_null)) { + if (!zend_parse_arg_bool(arg, p, is_null, check_null, ref_type)) { return "boolean"; } } @@ -633,6 +637,17 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons } break; + case 't': + { + zval **p = va_arg(*va, zval **); + + if (ref_type && !zend_verify_ref_type_assignable(ref_type, IS_ARRAY)) { + return "array"; + } + + zend_parse_arg_zval_deref(real_arg, p, check_null); + } + case 'o': { zval **p = va_arg(*va, zval **); @@ -825,7 +840,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': - case 'L': + case 'L': case 't': max_num_args++; break; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 4f8d36fac2afc..de6a86b75e96d 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -678,6 +678,43 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D +static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { + void *ref_type; + if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED((ref_type = Z_REFTYPE_P(zv)) != NULL)) { + zval tmp; + ZVAL_COPY(&tmp, arg); + if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, ZEND_ARG_USES_STRICT_TYPES())) { + zv = Z_REFVAL_P(zv); + zval_ptr_dtor(zv); + ZVAL_COPY_VALUE(zv, &tmp); + } else { + zend_throw_ref_type_error(ref_type, &tmp); + zval_ptr_dtor(&tmp); + return FAILURE; + } + } else { + zval_ptr_dtor(zv); + ZVAL_COPY(zv, arg); + } + + return SUCCESS; +} + +#define ZEND_TRY_ASSIGN(func, zv, ...) \ + do { \ + zval _zv; \ + func(&_zv, ##__VA_ARGS__); \ + zend_try_assign(zv, &_zv); \ + } while (0) + +#define ZEND_TRY_ASSIGN_NULL(zv) ZEND_TRY_ASSIGN(ZVAL_NULL, zv) +#define ZEND_TRY_ASSIGN_LONG(zv, long) ZEND_TRY_ASSIGN(ZVAL_LONG, zv, long) +#define ZEND_TRY_ASSIGN_DOUBLE(zv, double) ZEND_TRY_ASSIGN(ZVAL_DOUBLE, zv, double) +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) ZEND_TRY_ASSIGN(ZVAL_EMPTY_STRING, zv) +#define ZEND_TRY_ASSIGN_STR(zv, str) ZEND_TRY_ASSIGN(ZVAL_STR, zv, str) +#define ZEND_TRY_ASSIGN_STRING(zv, string) ZEND_TRY_ASSIGN(ZVAL_STRING, zv, string) +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) ZEND_TRY_ASSIGN(ZVAL_STRINGL, zv, string, len) + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility @@ -725,6 +762,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in zval *_real_arg, *_arg = NULL; \ zend_expected_type _expected_type = IS_UNDEF; \ char *_error = NULL; \ + void *_ref_type; \ zend_bool _dummy; \ zend_bool _optional = 0; \ int error_code = ZPP_ERROR_OK; \ @@ -733,6 +771,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in ((void)_arg); \ ((void)_expected_type); \ ((void)_error); \ + ((void)_ref_type); \ ((void)_dummy); \ ((void)_optional); \ \ @@ -780,7 +819,12 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in } \ _real_arg++; \ _arg = _real_arg; \ - ZVAL_DEREF(_arg); \ + if (UNEXPECTED(Z_ISREF_P(_arg))) { \ + _ref_type = Z_REF_P(_arg)->type; \ + _arg = Z_REFVAL_P(_arg); \ + } else { \ + _ref_type = NULL; \ + } \ if (separate) { \ SEPARATE_ZVAL_NOREF(_arg); \ } @@ -816,7 +860,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "b" */ #define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_BOOL; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -839,7 +883,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "d" */ #define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_DOUBLE; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -894,7 +938,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "l" */ #define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0, _ref_type))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -906,7 +950,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "L" */ #define Z_PARAM_STRICT_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1, _ref_type))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -948,7 +992,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "p" */ #define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -960,7 +1004,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "P" */ #define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -984,7 +1028,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "s" */ #define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -996,7 +1040,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "S" */ #define Z_PARAM_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \ + if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null, _ref_type))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1005,6 +1049,19 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in #define Z_PARAM_STR(dest) \ Z_PARAM_STR_EX(dest, 0, 0) +/* old "t" */ +#define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ + Z_PARAM_PROLOGUE(separate); \ + if (_ref_type && (((uintptr_t) _ref_type) >> 1) != IS_ARRAY) { \ + _expected_type = Z_EXPECTED_ARRAY; \ + error_code = ZPP_ERROR_WRONG_ARG; \ + break; \ + } \ + zend_parse_arg_zval_deref(_arg, &dest, check_null); + +#define Z_PARAM_ARRAY_ASSIGNABLE(dest) \ + Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, 0, 0) + /* old "z" */ #define Z_PARAM_ZVAL_EX(dest, check_null, separate) \ if (separate) { \ @@ -1063,7 +1120,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest); -static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null) +static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null, void *ref_type) { if (check_null) { *is_null = 0; @@ -1072,6 +1129,8 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze *dest = 1; } else if (EXPECTED(Z_TYPE_P(arg) == IS_FALSE)) { *dest = 0; + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != _IS_BOOL) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1081,13 +1140,15 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap) +static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap, void *ref_type) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { *dest = Z_LVAL_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_LONG) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1099,13 +1160,15 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null) +static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null, void *ref_type) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) { *dest = Z_DVAL_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_DOUBLE) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0.0; @@ -1115,10 +1178,12 @@ static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zen return 1; } -static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null) +static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null, void *ref_type) { if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { *dest = Z_STR_P(arg); + } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_STRING) { + return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *dest = NULL; } else { @@ -1127,11 +1192,11 @@ static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, return 1; } -static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null) +static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) { zend_string *str; - if (!zend_parse_arg_str(arg, &str, check_null)) { + if (!zend_parse_arg_str(arg, &str, check_null, ref_type)) { return 0; } if (check_null && UNEXPECTED(!str)) { @@ -1144,20 +1209,20 @@ static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size return 1; } -static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null) +static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null, void *ref_type) { - if (!zend_parse_arg_str(arg, dest, check_null) || + if (!zend_parse_arg_str(arg, dest, check_null, ref_type) || (*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) { return 0; } return 1; } -static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null) +static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) { zend_string *str; - if (!zend_parse_arg_path_str(arg, &str, check_null)) { + if (!zend_parse_arg_path_str(arg, &str, check_null, ref_type)) { return 0; } if (check_null && UNEXPECTED(!str)) { diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5d895387148ea..0c2355dc9840e 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3081,7 +3081,13 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_error_noreturn(E_COMPILE_ERROR, "Cannot use result of built-in function in write context"); } - opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; + if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { + opline->opcode = ZEND_ASSIGN_OBJ_REF; + zend_emit_op_data(&source_node); + } else { + opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + } if (zend_is_call(source_ast)) { opline->extended_value = ZEND_RETURNS_FUNCTION; diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9f1d572871e06..8a13c4bb55101 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -954,6 +954,37 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } +static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) { + zend_uchar cur_type; + + if (!type) { + return 1; + } + if (Z_TYPE_P(zv) == IS_REFERENCE) { + ZVAL_DEREF(zv); + } + + if (Z_TYPE_P(zv) == IS_OBJECT) { + return ((uintptr_t) type) > 0xFF && instanceof_function(Z_OBJCE_P(zv), (zend_class_entry *) (~0x1 & (uintptr_t) type)); + } + + if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { + return 1; + } + + cur_type = ((uintptr_t) type) >> 1; + if (cur_type == IS_CALLABLE) { + return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); + } + + return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); +} + +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) +{ + return i_zend_verify_ref_type_assignable_zval(type, zv, strict); +} + static zend_never_inline int zend_verify_internal_arg_types(zend_function *fbc, zend_execute_data *call) { uint32_t i; @@ -976,11 +1007,17 @@ static zend_always_inline zend_bool zend_check_type( zval *arg, zend_class_entry **ce, void **cache_slot, zval *default_value, zend_bool is_return_type) { + void *ref_type = NULL; + if (!arg_info->type_hint) { return 1; } - ZVAL_DEREF(arg); + if (UNEXPECTED(Z_ISREF_P(arg))) { + ref_type = Z_REFTYPE_P(arg); + arg = Z_REFVAL_P(arg); + } + if (EXPECTED(arg_info->type_hint == Z_TYPE_P(arg))) { if (arg_info->class_name) { if (EXPECTED(*cache_slot)) { @@ -1022,6 +1059,8 @@ static zend_always_inline zend_bool zend_check_type( } else if (arg_info->type_hint == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { return 1; + } else if (ref_type) { + return 0; /* we cannot have conversions for typed refs */ } else { return zend_verify_scalar_type_hint(arg_info->type_hint, arg, arg, is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES()); @@ -2098,8 +2137,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c return_indirect: ZVAL_INDIRECT(result, ptr); if ((by_ref & ZEND_FETCH_REF) - && (prop_op_type == IS_CONST - || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING))) { + && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) + && Z_TYPE_P(ptr) != IS_REFERENCE) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2108,10 +2147,15 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); } if (UNEXPECTED(prop_info)) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Typed property %s::$%s must not be referenced", - ZSTR_VAL(prop_info->ce->name), Z_STRVAL_P(prop_ptr)); + if (!prop_info->allow_null && Z_TYPE_P(ptr) == IS_NULL) { + zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + return; + } + + ZVAL_NEW_REF(ptr, ptr); + Z_REF_P(ptr)->type = zend_get_prop_info_ref_type(prop_info); } } return; @@ -2156,6 +2200,17 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } +ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference of type %s%s", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + (0x1 & (uintptr_t) type) ? "?" : "", + (0xFF < (uintptr_t) type) ? ZSTR_VAL(((zend_class_entry *) (~0x1 & (uintptr_t) type))->name) : zend_get_type_by_const(((uintptr_t) type) >> 1) + ); +} + + #if ZEND_INTENSIVE_DEBUGGING #define CHECK_SYMBOL_TABLES() \ diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 237535ef696bc..49cdaaee7247f 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -56,7 +56,42 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type) +static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info *prop_info) { + if (prop_info->type == IS_OBJECT && UNEXPECTED(!prop_info->type_ce)) { + if (zend_string_equals_literal_ci(prop_info->type_name, "self")) { + prop_info->type_ce = prop_info->ce; + } else if (zend_string_equals_literal_ci(prop_info->type_name, "parent")) { + if (!prop_info->ce->parent) { + zend_throw_error(NULL, "Cannot access parent:: when current class scope has no parent"); + return (void *) 0xFE; + } + prop_info->type_ce = prop_info->ce->parent; + } else { + prop_info->type_ce = zend_lookup_class(prop_info->type_name); + if (!prop_info->type_ce) { + zend_throw_error(NULL, "Class %s must be loaded when used by reference for property type", ZSTR_VAL(prop_info->type_name)); + return (void *) 0xFE; + } + } + } + + return (void *) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); +} + +/* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ +static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { + if (0xFF >= (uintptr_t) type) { + zend_uchar cur_type = ((uintptr_t) type) >> 1; + return new_type == cur_type || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); + } else { + return (0x1 & (uintptr_t) type) && new_type == IS_NULL; + } +} + +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); +ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv); + +static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { zend_refcounted *ref = NULL; @@ -70,6 +105,11 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { + if (!zend_verify_ref_type_assignable_zval(Z_REF_P(variable_ptr)->type, value, strict)) { + zend_throw_ref_type_error(Z_REF_P(variable_ptr)->type, value); + return Z_REFVAL_P(variable_ptr); + } + variable_ptr = Z_REFVAL_P(variable_ptr); if (EXPECTED(!Z_REFCOUNTED_P(variable_ptr))) { break; diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index eb0f529df1070..4638aaf38825e 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -720,7 +720,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v zval tmp, *val; if (UNEXPECTED(prop_info)) { - val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); goto exit; @@ -728,7 +728,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v value = val; } found: - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); goto exit; } } else if (EXPECTED(zobj->properties != NULL)) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 9d4f6a7d4caa7..736693c931e41 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -292,6 +292,7 @@ struct _zend_resource { struct _zend_reference { zend_refcounted_h gc; zval val; + zend_class_entry *type; }; struct _zend_ast_ref { @@ -572,6 +573,9 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) +#define Z_REFTYPE(zval) &Z_REF(zval)->type +#define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) + #define Z_AST(zval) (zval).value.ast #define Z_AST_P(zval_p) Z_AST(*(zval_p)) @@ -733,6 +737,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { (zend_reference *) emalloc(sizeof(zend_reference)); \ GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -743,6 +748,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 461a33f153b05..7d8a9c2aeb827 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -955,10 +955,30 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1451,6 +1471,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1473,10 +1494,30 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1491,6 +1532,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1513,10 +1555,30 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -1530,7 +1592,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) { USE_OPLINE zend_free_op free_op1; - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1549,12 +1612,23 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -1564,6 +1638,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1582,12 +1657,23 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -2423,7 +2509,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( } ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property, value, OP_DATA_TYPE); + value = zend_assign_to_variable(property, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2545,7 +2631,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE); + value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2620,7 +2706,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL)) ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE); + value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2642,17 +2728,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W); variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP1_TYPE == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - FREE_OP1_VAR_PTR(); - FREE_OP2_VAR_PTR(); - HANDLE_EXCEPTION(); - - } else if (OP2_TYPE == IS_VAR && + if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -2661,7 +2737,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -2687,6 +2763,127 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SRC, SPEC(OP_DATA=VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (OP_DATA_TYPE == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + FREE_UNFETCHED_OP1(); + FREE_UNFETCHED_OP2(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); + } + + property = GET_OP2_ZVAL_PTR(BP_VAR_R); + + container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + FREE_OP2(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if ((OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((OP2_TYPE != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) { zend_execute_data *old_execute_data; @@ -6348,7 +6545,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit): if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3bd2b1982ab97..8f7e318594f44 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15533,6 +15533,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15555,10 +15556,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15573,6 +15594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15595,10 +15617,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15613,6 +15655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15635,10 +15678,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15653,6 +15716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15675,10 +15739,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -15692,7 +15776,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND { USE_OPLINE zend_free_op free_op1; - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15711,12 +15796,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -15726,6 +15822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15744,12 +15841,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND if (IS_VAR == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -16870,7 +16978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); @@ -17635,10 +17743,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -18944,7 +19072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19120,7 +19248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19296,7 +19424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19472,7 +19600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19594,7 +19722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19685,7 +19813,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19777,7 +19905,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19869,7 +19997,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19943,7 +20071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19971,7 +20099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19982,6 +20110,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -20660,7 +21030,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20688,7 +21058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20888,7 +21258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20916,7 +21286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20939,16 +21309,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; - HANDLE_EXCEPTION(); - - } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -20957,7 +21317,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -21543,7 +21903,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21634,7 +21994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21726,7 +22086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21818,7 +22178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22620,10 +22980,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -23929,7 +24309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24105,7 +24485,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24281,7 +24661,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24457,7 +24837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24579,7 +24959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24670,7 +25050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24762,7 +25142,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24854,7 +25234,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24928,7 +25308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24956,7 +25336,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24978,17 +25358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_VAR == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - HANDLE_EXCEPTION(); - - } else if (IS_CV == IS_VAR && + if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -24997,7 +25367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -25022,6 +25392,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -25762,10 +26374,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -27075,7 +27707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27251,7 +27883,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27427,7 +28059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27603,7 +28235,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27725,7 +28357,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27816,7 +28448,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27908,7 +28540,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28000,7 +28632,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28057,6 +28689,248 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -29556,7 +30430,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29732,7 +30606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -29908,7 +30782,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30084,7 +30958,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30172,6 +31046,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -32442,7 +33556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32618,7 +33732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32794,7 +33908,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32970,7 +34084,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33058,6 +34172,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -34534,7 +35888,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34710,7 +36064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34886,7 +36240,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35062,7 +36416,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35150,6 +36504,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = NULL; + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -35624,6 +37218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35646,10 +37241,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35663,6 +37278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35685,10 +37301,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + increment_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35702,6 +37338,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35724,10 +37361,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35741,6 +37398,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35763,10 +37421,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + decrement_function(var_ptr); + } if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -35779,7 +37457,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ { USE_OPLINE - zval *var_ptr; + zval *var_ptr, *val; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35798,12 +37477,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -35812,6 +37502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; + void *type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -35830,12 +37521,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(var_ptr) == IS_UNDEF)) { var_ptr = GET_OP1_UNDEF_CV(var_ptr, BP_VAR_RW); } - ZVAL_DEREF(var_ptr); + + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -38289,10 +39991,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -39870,7 +41592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40046,7 +41768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40222,7 +41944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40398,7 +42120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40520,7 +42242,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40611,7 +42333,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40703,7 +42425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40795,7 +42517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40869,7 +42591,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40897,7 +42619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40908,6 +42630,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = EX_CONSTANT(opline->op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CONST != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -42163,7 +44125,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42191,7 +44153,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42527,7 +44489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42555,7 +44517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42577,17 +44539,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; - HANDLE_EXCEPTION(); - - } else if (IS_VAR == IS_VAR && + if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -42596,7 +44548,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -43665,7 +45617,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43756,7 +45708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43848,7 +45800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -43940,7 +45892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45540,10 +47492,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -46984,7 +48956,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47160,7 +49132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47336,7 +49308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47512,7 +49484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47634,7 +49606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47725,7 +49697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47817,7 +49789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47909,7 +49881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47983,7 +49955,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -48011,7 +49983,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_ ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -48034,16 +50006,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); if (IS_CV == IS_VAR && - UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && - UNEXPECTED(!Z_ISREF_P(EX_VAR(opline->op1.var))) && - UNEXPECTED(!Z_ISERROR_P(EX_VAR(opline->op1.var)))) { - - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - - - HANDLE_EXCEPTION(); - - } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -48052,7 +50014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -48076,6 +50038,246 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + + + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + + + HANDLE_EXCEPTION(); + } + + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if ((IS_CV != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + } + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -49808,10 +52010,30 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); + void *type = NULL; + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { + type = Z_REF_P(var_ptr)->type; + var_ptr = Z_REFVAL_P(var_ptr); + } - binary_op(var_ptr, var_ptr, value); + if (UNEXPECTED(type)) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); + + zval_opt_copy_ctor(var_ptr); + binary_op(var_ptr, var_ptr, value); + + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + zval_ptr_dtor(&old); + } else { + zend_throw_ref_type_error(type, var_ptr); + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + } + } else { + SEPARATE_ZVAL_NOREF(var_ptr); + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -51257,7 +53479,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST); + value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51433,7 +53655,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51609,7 +53831,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR); + value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51785,7 +54007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV); + value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51907,7 +54129,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -51998,7 +54220,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -52089,8 +54311,100 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D goto assign_dim_error; } } - value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR); + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + } else { + if (EXPECTED(Z_ISREF_P(object_ptr))) { + object_ptr = Z_REFVAL_P(object_ptr); + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { + goto try_assign_dim_array; + } + } + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + zend_assign_to_object_dim(object_ptr, dim, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op_data); + } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { + zend_throw_error(NULL, "[] operator not supported for strings"); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + HANDLE_EXCEPTION(); + } else { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + value = _get_zval_ptr_var_deref((opline+1)->op1.var, execute_data, &free_op_data); + zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + zval_ptr_dtor_nogc(free_op_data); + } + } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + ZVAL_NEW_ARR(object_ptr); + zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0); + goto try_assign_dim_array; + } else { + if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) { + zend_error(E_WARNING, "Cannot use a scalar value as an array"); + } + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); +assign_dim_error: + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } + } + } + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + zval_ptr_dtor_nogc(free_op2); + } + + /* assign_dim has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *object_ptr; + zend_free_op free_op2; + zval *value; + zval *variable_ptr; + zval *dim; + + SAVE_OPLINE(); + object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + + if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { +try_assign_dim_array: + SEPARATE_ARRAY(object_ptr); + if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { + variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval)); + if (UNEXPECTED(variable_ptr == NULL)) { + zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied"); + goto assign_dim_error; + } + } else { + dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim); + } else { + variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim); + } + if (UNEXPECTED(variable_ptr == NULL)) { + goto assign_dim_error; + } + } + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -52103,7 +54417,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); zend_assign_to_object_dim(object_ptr, dim, value); @@ -52111,18 +54425,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { zend_throw_error(NULL, "[] operator not supported for strings"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); } else { dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_var_deref((opline+1)->op1.var, execute_data, &free_op_data); + value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, (opline+1)->op1.var); zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); - zval_ptr_dtor_nogc(free_op_data); + } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { ZVAL_NEW_ARR(object_ptr); @@ -52134,7 +54447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); assign_dim_error: - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } @@ -52148,95 +54461,244 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE - - zval *object_ptr; - zend_free_op free_op2; - zval *value; - zval *variable_ptr; - zval *dim; + zend_free_op free_op2, free_op_data; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { -try_assign_dim_array: - SEPARATE_ARRAY(object_ptr); - if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - variable_ptr = zend_hash_next_index_insert(Z_ARRVAL_P(object_ptr), &EG(uninitialized_zval)); - if (UNEXPECTED(variable_ptr == NULL)) { - zend_error(E_WARNING, "Cannot add element to the array as the next element is already occupied"); - goto assign_dim_error; - } - } else { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + if (IS_VAR == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } + + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); + + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + + if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - variable_ptr = zend_fetch_dimension_address_inner_W_CONST(Z_ARRVAL_P(object_ptr), dim); + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - variable_ptr = zend_fetch_dimension_address_inner_W(Z_ARRVAL_P(object_ptr), dim); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); } - if (UNEXPECTED(variable_ptr == NULL)) { - goto assign_dim_error; + + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } } } - value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } - } else { - if (EXPECTED(Z_ISREF_P(object_ptr))) { - object_ptr = Z_REFVAL_P(object_ptr); - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { - goto try_assign_dim_array; - } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); + } + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op2; + zval *property; + zval *container; + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + void *type = NULL; + + SAVE_OPLINE(); + + if (IS_CV == IS_VAR + && opline->extended_value == ZEND_RETURNS_FUNCTION + && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { + zend_error(E_NOTICE, "Only variables should be assigned by reference"); + if (UNEXPECTED(EG(exception) != NULL)) { + + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + HANDLE_EXCEPTION(); } - if (EXPECTED(Z_TYPE_P(object_ptr) == IS_OBJECT)) { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - zend_assign_to_object_dim(object_ptr, dim, value); + ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); + } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); - } + property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { - zend_throw_error(NULL, "[] operator not supported for strings"); + container = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + zend_throw_error(NULL, "Using $this when not in object context"); + zval_ptr_dtor_nogc(free_op2); + HANDLE_EXCEPTION(); + } - HANDLE_EXCEPTION(); - } else { - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - value = _get_zval_ptr_cv_deref_BP_VAR_R(execute_data, (opline+1)->op1.var); - zend_assign_to_string_offset(object_ptr, dim, value, (UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL)); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + + if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR(variable))) { + zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + + if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) + || UNEXPECTED(Z_ISERROR(variable))) { + variable_ptr = &EG(uninitialized_zval); + } else { + variable_ptr = Z_INDIRECT(variable); + + if (((IS_TMP_VAR|IS_VAR) != IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + zend_property_info *prop_info; + + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); } - } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - ZVAL_NEW_ARR(object_ptr); - zend_hash_init(Z_ARRVAL_P(object_ptr), 8, NULL, ZVAL_PTR_DTOR, 0); - goto try_assign_dim_array; - } else { - if (IS_CV != IS_VAR || EXPECTED(!Z_ISERROR_P(object_ptr))) { - zend_error(E_WARNING, "Cannot use a scalar value as an array"); - } - dim = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); -assign_dim_error: - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); + if (UNEXPECTED(prop_info)) { + type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; + zend_bool error = 0; + + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { + error = 1; + } + } + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } + } + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + zend_throw_ref_type_error(type, value_ptr); + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); + } } } + zend_assign_to_variable_reference(variable_ptr, value_ptr); + Z_REF_P(variable_ptr)->type = type; } - if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { - zval_ptr_dtor_nogc(free_op2); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr); } - /* assign_dim has two opcodes! */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); + zval_ptr_dtor_nogc(free_op2); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -61889,6 +64351,131 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER, ZEND_EXT_STMT_SPEC_HANDLER, ZEND_EXT_FCALL_BEGIN_SPEC_HANDLER, ZEND_EXT_FCALL_END_SPEC_HANDLER, @@ -64256,84 +66843,79 @@ void zend_init_opcodes_handlers(void) 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337 | SPEC_RULE_OP1, - 2342 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2367 | SPEC_RULE_OP1, - 2372 | SPEC_RULE_OP2, - 2377 | SPEC_RULE_OP1, - 2382 | SPEC_RULE_OP1, - 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2462 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2487 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2497 | SPEC_RULE_OP1, - 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2527, - 2528 | SPEC_RULE_OP1, - 2533 | SPEC_RULE_OP1, - 2538 | SPEC_RULE_OP1, - 2543 | SPEC_RULE_OP1, - 2548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2573 | SPEC_RULE_OP1, - 2578 | SPEC_RULE_OP1, - 2583 | SPEC_RULE_OP1, - 2588 | SPEC_RULE_OP2, - 2593 | SPEC_RULE_RETVAL, - 2595 | SPEC_RULE_RETVAL, - 2597 | SPEC_RULE_RETVAL, - 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2824, - 2825 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2850, - 2851 | SPEC_RULE_OP2, - 2856, - 2857 | SPEC_RULE_OP1, - 2862 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2887 | SPEC_RULE_OP2, - 2892 | SPEC_RULE_OP2, - 2897, - 2898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3048, - 3049, - 3050, - 3051 | SPEC_RULE_OP1, - 3056 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3081, - 3082, - 3083 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3108, - 3109, - 3110, - 3111 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3136 | SPEC_RULE_OP1, - 3141, - 3142, - 3143, - 3144, - 3145 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3170 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 3245 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3270 | SPEC_RULE_OP1, - 3275 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3300, - 3301 | SPEC_RULE_OP2, - 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2332 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2457, + 2458, + 2459, + 2460, + 2461, + 2462 | SPEC_RULE_OP1, + 2467 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2492 | SPEC_RULE_OP1, + 2497 | SPEC_RULE_OP2, + 2502 | SPEC_RULE_OP1, + 2507 | SPEC_RULE_OP1, + 2512 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2537 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2562 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2587 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2612 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2622 | SPEC_RULE_OP1, + 2627 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2652, + 2653 | SPEC_RULE_OP1, + 2658 | SPEC_RULE_OP1, + 2663 | SPEC_RULE_OP1, + 2668 | SPEC_RULE_OP1, + 2673 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2698 | SPEC_RULE_OP1, + 2703 | SPEC_RULE_OP1, + 2708 | SPEC_RULE_OP1, + 2713 | SPEC_RULE_OP2, + 2718 | SPEC_RULE_RETVAL, + 2720 | SPEC_RULE_RETVAL, + 2722 | SPEC_RULE_RETVAL, + 2724 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2749 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2774 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2799 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2824 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 2949, + 2950 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2975, + 2976 | SPEC_RULE_OP2, + 2981, + 2982 | SPEC_RULE_OP1, + 2987 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3012 | SPEC_RULE_OP2, + 3017 | SPEC_RULE_OP2, + 3022, + 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3148 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3173, + 3174, + 3175, + 3176 | SPEC_RULE_OP1, + 3181 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3206, + 3207, + 3208 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3233, + 3234, + 3235, + 3236 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3261 | SPEC_RULE_OP1, + 3266, + 3267, + 3268, + 3269, + 3270 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3295 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3370 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3395 | SPEC_RULE_OP1, + 3400 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3425, + 3426 | SPEC_RULE_OP2, 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -64341,9 +66923,14 @@ void zend_init_opcodes_handlers(void) 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, 3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596 + 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4721, + 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4721 }; zend_opcode_handlers = labels; zend_handlers_count = sizeof(labels) / sizeof(void*); @@ -64450,7 +67037,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64458,7 +67045,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64466,7 +67053,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64477,17 +67064,17 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -64495,7 +67082,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64503,7 +67090,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64511,7 +67098,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3956 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64522,7 +67109,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 3981 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64530,7 +67117,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64541,7 +67128,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64549,7 +67136,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -64560,12 +67147,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -64573,70 +67160,70 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4431 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4381 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if ((op1_info == MAY_BE_DOUBLE)) { - spec = 4546 | SPEC_RULE_OP1; + spec = 4671 | SPEC_RULE_OP1; } else if ((!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 4551 | SPEC_RULE_OP1; + spec = 4676 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4581 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4466 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4591 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4476 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4601 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4486 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4496 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4621 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4631 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4516 | SPEC_RULE_OP1; + spec = 4641 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4521 | SPEC_RULE_OP1; + spec = 4646 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4526 | SPEC_RULE_OP1; + spec = 4651 | SPEC_RULE_OP1; } break; case ZEND_POST_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4531 | SPEC_RULE_OP1; + spec = 4656 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4536 | SPEC_RULE_OP1; + spec = 4661 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4541 | SPEC_RULE_OP1; + spec = 4666 | SPEC_RULE_OP1; } break; case ZEND_SEND_VAR_EX: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4586 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; + spec = 4711 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; } break; case ZEND_FETCH_DIM_R: if ((!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { - spec = 4556 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4581 | SPEC_RULE_OP1; + spec = 4706 | SPEC_RULE_OP1; } break; default: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 0d21e33b1c806..b231f97f8729b 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -576,6 +576,17 @@ "TMPVARCV" => "???", ); +$op_data_get_zval_ptr_ptr = array( + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", + "TMP" => "NULL", + "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data)", + "CONST" => "NULL", + "UNUSED" => "NULL", + "CV" => "_get_zval_ptr_cv_\\1(execute_data, (opline+1)->op1.var)", + "TMPVAR" => "???", + "TMPVARCV" => "???", +); + $op_data_free_op = array( "ANY" => "FREE_OP(free_op_data)", "TMP" => "zval_ptr_dtor_nogc(free_op_data)", @@ -587,6 +598,17 @@ "TMPVARCV" => "???", ); +$op_data_free_op_var_ptr = array( + "ANY" => "if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}", + "TMP" => "", + "VAR" => "if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}", + "CONST" => "", + "UNUSED" => "", + "CV" => "", + "TMPVAR" => "???", + "TMPVARCV" => "???", +); + $op_data_free_unfetched = array( "ANY" => "FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var)", "TMP" => "zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var))", @@ -642,9 +664,11 @@ function helper_name($name, $spec, $op1, $op2) { return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]; } -function opcode_name($name, $spec, $op1, $op2) { +function opcode_name($name, $spec, $op1, $op2, $extra_spec) { global $prefix, $opnames, $opcodes; + $extra = ""; + if (isset($opnames[$name])) { $opcode = $opcodes[$opnames[$name]]; // If we haven't helper with specified spicialized operands then @@ -657,8 +681,12 @@ function opcode_name($name, $spec, $op1, $op2) { isset($opcode["op2"]["ANY"])) { $op2 = "ANY"; } + /* forward common specs (e.g. in ZEND_VM_DISPATCH_TO_HANDLER) */ + if (isset($extra_spec, $opcode["spec"])) { + $extra = extra_spec_name(array_intersect_key($extra_spec, $opcode["spec"])); + } } - return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2]; + return $name.($spec?"_SPEC":"").$prefix[$op1].$prefix[$op2].$extra; } // Generates code for opcode handler or helper @@ -676,8 +704,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op1_free, $op2_free, $op1_free_unfetched, $op2_free_unfetched, $op1_free_op, $op2_free_op, $op1_free_op_if_var, $op2_free_op_if_var, $op1_free_op_var_ptr, $op2_free_op_var_ptr, $prefix, - $op_data_type, $op_data_get_zval_ptr, $op_data_get_zval_ptr_deref, - $op_data_free_op, $op_data_free_unfetched; + $op_data_type, $op_data_get_zval_ptr, + $op_data_get_zval_ptr_deref, $op_data_get_zval_ptr_ptr, + $op_data_free_op, $op_data_free_op_var_ptr, $op_data_free_unfetched; // Specializing $code = preg_replace( @@ -727,7 +756,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/OP_DATA_TYPE/", "/GET_OP_DATA_ZVAL_PTR\(([^)]*)\)/", "/GET_OP_DATA_ZVAL_PTR_DEREF\(([^)]*)\)/", + "/GET_OP_DATA_ZVAL_PTR_PTR\(([^)]*)\)/", "/FREE_OP_DATA\(\)/", + "/FREE_OP_DATA_VAR_PTR\(\)/", "/FREE_UNFETCHED_OP_DATA\(\)/", "/RETURN_VALUE_USED\(opline\)/", "/arg_num <= MAX_ARG_FLAG_NUM/", @@ -782,7 +813,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp $op_data_type[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_get_zval_ptr_deref[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_get_zval_ptr_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_op[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], + $op_data_free_op_var_ptr[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], $op_data_free_unfetched[isset($extra_spec['OP_DATA']) ? $extra_spec['OP_DATA'] : "ANY"], isset($extra_spec['RETVAL']) ? $extra_spec['RETVAL'] : "RETURN_VALUE_USED(opline)", isset($extra_spec['QUICK_ARG']) ? $extra_spec['QUICK_ARG'] : "arg_num <= MAX_ARG_FLAG_NUM", @@ -816,11 +849,11 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m", "/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*(,[^)]*)?\)/m", ), - function($matches) use ($spec, $prefix, $op1, $op2) { + function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) { if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))"; + return "ZEND_VM_TAIL_CALL(" . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU))"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -840,11 +873,11 @@ function($matches) use ($spec, $prefix, $op1, $op2) { "/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m", "/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*(,[^)]*)?\)/m", ), - function($matches) use ($spec, $prefix, $op1, $op2) { + function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) { if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_LABEL"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_LABEL"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { @@ -864,11 +897,11 @@ function($matches) use ($spec, $prefix, $op1, $op2) { "/ZEND_VM_DISPATCH_TO_HANDLER\(\s*([A-Z_]*)\s*\)/m", "/ZEND_VM_DISPATCH_TO_HELPER\(\s*([A-Za-z_]*)\s*(,[^)]*)?\)/m", ), - function($matches) use ($spec, $prefix, $op1, $op2) { + function($matches) use ($spec, $prefix, $op1, $op2, $extra_spec) { if (strncasecmp($matches[0], "EXECUTE_DATA", strlen("EXECUTE_DATA")) == 0) { return "execute_data"; } else if (strncasecmp($matches[0], "ZEND_VM_DISPATCH_TO_HANDLER", strlen("ZEND_VM_DISPATCH_TO_HANDLER")) == 0) { - return "goto " . opcode_name($matches[1], $spec, $op1, $op2) . "_HANDLER"; + return "goto " . opcode_name($matches[1], $spec, $op1, $op2, $extra_spec) . "_HANDLER"; } else { // ZEND_VM_DISPATCH_TO_HELPER if (isset($matches[2])) { diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 6ad01950d5b63..cd163074aca96 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -122,7 +122,7 @@ static const char *zend_vm_opcodes_names[187] = { "ZEND_FETCH_OBJ_UNSET", "ZEND_FETCH_LIST", "ZEND_FETCH_CONSTANT", - NULL, + "ZEND_ASSIGN_OBJ_REF", "ZEND_EXT_STMT", "ZEND_EXT_FCALL_BEGIN", "ZEND_EXT_FCALL_END", @@ -312,7 +312,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000751, 0x00000707, 0x06000301, - 0x00000000, + 0x0b000751, 0x00000000, 0x00000000, 0x00000000, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 14444977fae3f..5b351bcba4a28 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -168,6 +168,7 @@ END_EXTERN_C() #define ZEND_FETCH_OBJ_UNSET 97 #define ZEND_FETCH_LIST 98 #define ZEND_FETCH_CONSTANT 99 +#define ZEND_ASSIGN_OBJ_REF 100 #define ZEND_EXT_STMT 101 #define ZEND_EXT_FCALL_BEGIN 102 #define ZEND_EXT_FCALL_END 103 diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index 37b28ae558354..9b9705f7b0f83 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -51,7 +51,7 @@ PHP_FUNCTION( numfmt_parse ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|ll!", &object, NumberFormatter_ce_ptr, &str, &str_len, &type, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -60,6 +60,11 @@ PHP_FUNCTION( numfmt_parse ) RETURN_FALSE; } + if(zposition) { + position = (int32_t)Z_LVAL_P( zposition ); + position_p = &position; + } + /* Fetch the object. */ FORMATTER_METHOD_FETCH_OBJECT; @@ -67,13 +72,6 @@ PHP_FUNCTION( numfmt_parse ) intl_convert_utf8_to_utf16(&sstr, &sstr_len, str, str_len, &INTL_DATA_ERROR_CODE(nfo)); INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); - if(zposition) { - ZVAL_DEREF(zposition); - convert_to_long(zposition); - position = (int32_t)Z_LVAL_P( zposition ); - position_p = &position; - } - #if ICU_LOCALE_BUG && defined(LC_NUMERIC) /* need to copy here since setlocale may change it later */ oldlocale = estrdup(setlocale(LC_NUMERIC, NULL)); diff --git a/ext/standard/basic_functions.c b/ext/standard/basic_functions.c index ba616dff2325d..773239eb5488e 100644 --- a/ext/standard/basic_functions.c +++ b/ext/standard/basic_functions.c @@ -4299,14 +4299,13 @@ PHP_FUNCTION(getopt) int optname_len = 0; opt_struct *opts, *orig_opts; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|az/", &options, &options_len, &p_longopts, &zoptind) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|az", &options, &options_len, &p_longopts, &zoptind) == FAILURE) { RETURN_FALSE; } /* Init zoptind to 1 */ if (zoptind) { - zval_dtor(zoptind); - ZVAL_LONG(zoptind, 1); + ZEND_TRY_ASSIGN_LONG(zoptind, 1); } /* Get argv from the global symbol table. We calculate argc ourselves @@ -4452,7 +4451,7 @@ PHP_FUNCTION(getopt) /* Set zoptind to php_optind */ if (zoptind) { - ZVAL_LONG(zoptind, php_optind); + ZEND_TRY_ASSIGN_LONG(zoptind, php_optind); } free_longopts(orig_opts); diff --git a/ext/standard/dns.c b/ext/standard/dns.c index de40649e696ce..1be28bad5c42e 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -785,7 +785,7 @@ PHP_FUNCTION(dns_get_record) int type, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } @@ -1013,7 +1013,7 @@ PHP_FUNCTION(dns_get_mx) struct __res_state *handle = &state; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|z/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st/|t/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } diff --git a/ext/standard/exec.c b/ext/standard/exec.c index d541ff6b4c09a..4cb363a9a122f 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -214,11 +214,11 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ int ret; if (mode) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &cmd, &cmd_len, &ret_code) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &cmd, &cmd_len, &ret_code) == FAILURE) { RETURN_FALSE; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/z/", &cmd, &cmd_len, &ret_array, &ret_code) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|tz", &cmd, &cmd_len, &ret_array, &ret_code) == FAILURE) { RETURN_FALSE; } } @@ -241,8 +241,7 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ ret = php_exec(2, cmd, ret_array, return_value); } if (ret_code) { - zval_dtor(ret_code); - ZVAL_LONG(ret_code, ret); + ZEND_TRY_ASSIGN_LONG(ret_code, ret); } } /* }}} */ diff --git a/ext/standard/file.c b/ext/standard/file.c index c75d2d3fa0d78..cb81072f0f41b 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -341,7 +341,7 @@ PHP_FUNCTION(flock) php_stream *stream; zend_long operation = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &res, &operation, &wouldblock) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &res, &operation, &wouldblock) == FAILURE) { return; } @@ -354,15 +354,14 @@ PHP_FUNCTION(flock) } if (wouldblock) { - zval_dtor(wouldblock); - ZVAL_LONG(wouldblock, 0); + ZEND_TRY_ASSIGN_LONG(wouldblock, 0); } /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */ act = flock_values[act - 1] | (operation & PHP_LOCK_NB ? LOCK_NB : 0); if (php_stream_lock(stream, act)) { if (operation && errno == EWOULDBLOCK && wouldblock) { - ZVAL_LONG(wouldblock, 1); + ZEND_TRY_ASSIGN_LONG(wouldblock, 1); } RETURN_FALSE; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 675e1154a9675..561d259d06815 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -51,7 +51,7 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/z/d", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lzzd", &host, &host_len, &port, &zerrno, &zerrstr, &timeout) == FAILURE) { RETURN_FALSE; } @@ -99,10 +99,9 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { /* no need to dup; we need to efree buf anyway */ diff --git a/ext/standard/head.c b/ext/standard/head.c index eac9159ab9225..bf04f986f3b2e 100644 --- a/ext/standard/head.c +++ b/ext/standard/head.c @@ -234,7 +234,7 @@ PHP_FUNCTION(headers_sent) const char *file=""; int line=0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "|z/z/", &arg1, &arg2) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "|zz", &arg1, &arg2) == FAILURE) return; if (SG(headers_sent)) { @@ -244,14 +244,12 @@ PHP_FUNCTION(headers_sent) switch(ZEND_NUM_ARGS()) { case 2: - zval_dtor(arg2); - ZVAL_LONG(arg2, line); + ZEND_TRY_ASSIGN_LONG(arg2, line); case 1: - zval_dtor(arg1); if (file) { - ZVAL_STRING(arg1, file); + ZEND_TRY_ASSIGN_STRING(arg1, file); } else { - ZVAL_EMPTY_STRING(arg1); + ZEND_TRY_ASSIGN_EMPTY_STRING(arg1); } break; } diff --git a/ext/standard/image.c b/ext/standard/image.c index 4fb8298f7607c..90f2bda270248 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1470,7 +1470,7 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { size_t input_len; const int argc = ZEND_NUM_ARGS(); - if (zend_parse_parameters(argc, "s|z/", &input, &input_len, &info) == FAILURE) { + if (zend_parse_parameters(argc, "s|t", &input, &input_len, &info) == FAILURE) { return; } diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index 95803c9bbd4ac..d9475d11f61d9 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -458,7 +458,7 @@ PHP_FUNCTION(proc_open) php_file_descriptor_t slave_pty = -1; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "saz/|s!a!a!", &command, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sat|s!a!a!", &command, &command_len, &descriptorspec, &pipes, &cwd, &cwd_len, &environment, &other_options) == FAILURE) { RETURN_FALSE; diff --git a/ext/standard/scanf.c b/ext/standard/scanf.c index 703a125bb453d..b5109ae10c26e 100644 --- a/ext/standard/scanf.c +++ b/ext/standard/scanf.c @@ -741,9 +741,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, (zend_long)(string - baseString) ); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, (zend_long) (string - baseString)); } else { add_index_long(return_value, objIndex++, string - baseString); } @@ -860,9 +859,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -901,9 +899,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRINGL(current, string, end-string); + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRINGL(current, string, end - string); } else { add_index_stringl(return_value, objIndex++, string, end-string); } @@ -922,7 +919,7 @@ PHPAPI int php_sscanf_internal( char *string, char *format, char __buf[2]; __buf[0] = sch; __buf[1] = '\0';; - current = args[objIndex++]; + current = args + objIndex++; zval_dtor(*current); ZVAL_STRINGL( *current, __buf, 1); } else { @@ -1054,10 +1051,9 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - /* change passed value type to string */ - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_STRING(current, buf); + /* change passed value type to string */ + current = args + objIndex++; + ZEND_TRY_ASSIGN_STRING(current, buf); } else { add_index_string(return_value, objIndex++, buf); } @@ -1065,9 +1061,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_LONG(current, value); + current = args + objIndex++; + ZEND_TRY_ASSIGN_LONG(current, value); } else { add_index_long(return_value, objIndex++, value); } @@ -1170,9 +1165,8 @@ PHPAPI int php_sscanf_internal( char *string, char *format, if (numVars && objIndex >= argCount) { break; } else if (numVars) { - current = Z_REFVAL(args[objIndex++]); - zval_ptr_dtor(current); - ZVAL_DOUBLE(current, dvalue); + current = args + objIndex++; + ZEND_TRY_ASSIGN_DOUBLE(current, dvalue); } else { add_index_double(return_value, objIndex++, dvalue ); } diff --git a/ext/standard/streamsfuncs.c b/ext/standard/streamsfuncs.c index 5979c8cccb359..63c19c11e017f 100644 --- a/ext/standard/streamsfuncs.c +++ b/ext/standard/streamsfuncs.c @@ -102,7 +102,7 @@ PHP_FUNCTION(stream_socket_client) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|z/z/dlr", &host, &zerrno, &zerrstr, &timeout, &flags, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|zzdlr", &host, &zerrno, &zerrstr, &timeout, &flags, &zcontext) == FAILURE) { RETURN_FALSE; } @@ -121,13 +121,11 @@ PHP_FUNCTION(stream_socket_client) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(ZSTR_VAL(host), ZSTR_LEN(host), REPORT_ERRORS, @@ -148,14 +146,12 @@ PHP_FUNCTION(stream_socket_client) efree(hashkey); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release(errstr); } @@ -186,7 +182,7 @@ PHP_FUNCTION(stream_socket_server) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/z/lr", &host, &host_len, &zerrno, &zerrstr, &flags, &zcontext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|zzlr", &host, &host_len, &zerrno, &zerrstr, &flags, &zcontext) == FAILURE) { RETURN_FALSE; } @@ -196,13 +192,11 @@ PHP_FUNCTION(stream_socket_server) GC_REFCOUNT(context->res)++; } - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); } if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); } stream = php_stream_xport_create(host, host_len, REPORT_ERRORS, @@ -213,14 +207,12 @@ PHP_FUNCTION(stream_socket_server) php_error_docref(NULL, E_WARNING, "unable to connect to %s (%s)", host, errstr == NULL ? "Unknown error" : ZSTR_VAL(errstr)); } - if (stream == NULL) { + if (stream == NULL) { if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, err); + ZEND_TRY_ASSIGN_LONG(zerrno, err); } if (zerrstr && errstr) { - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); } else if (errstr) { zend_string_release(errstr); } @@ -252,7 +244,7 @@ PHP_FUNCTION(stream_socket_accept) Z_PARAM_RESOURCE(zstream) Z_PARAM_OPTIONAL Z_PARAM_DOUBLE(timeout) - Z_PARAM_ZVAL_EX(zpeername, 0, 1) + Z_PARAM_ZVAL(zpeername) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); php_stream_from_zval(stream, zstream); @@ -266,10 +258,6 @@ PHP_FUNCTION(stream_socket_accept) tv.tv_sec = conv / 1000000; tv.tv_usec = conv % 1000000; #endif - if (zpeername) { - zval_dtor(zpeername); - ZVAL_NULL(zpeername); - } if (0 == php_stream_xport_accept(stream, &clistream, zpeername ? &peername : NULL, @@ -278,7 +266,7 @@ PHP_FUNCTION(stream_socket_accept) ) && clistream) { if (peername) { - ZVAL_STR(zpeername, peername); + ZEND_TRY_ASSIGN_STR(zpeername, peername); } php_stream_to_zval(clistream, return_value); } else { @@ -360,15 +348,14 @@ PHP_FUNCTION(stream_socket_recvfrom) zend_long flags = 0; int recvd; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|lz/", &zstream, &to_read, &flags, &zremote) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|lz", &zstream, &to_read, &flags, &zremote) == FAILURE) { RETURN_FALSE; } php_stream_from_zval(stream, zstream); if (zremote) { - zval_dtor(zremote); - ZVAL_NULL(zremote); + ZEND_TRY_ASSIGN_NULL(zremote); } if (to_read <= 0) { @@ -384,7 +371,7 @@ PHP_FUNCTION(stream_socket_recvfrom) if (recvd >= 0) { if (zremote && remote_addr) { - ZVAL_STR(zremote, remote_addr); + ZEND_TRY_ASSIGN_STR(zremote, remote_addr); } ZSTR_VAL(read_buf)[recvd] = '\0'; ZSTR_LEN(read_buf) = recvd; diff --git a/ext/standard/string.c b/ext/standard/string.c index 4389e1070266f..9ea7955aa530e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -3531,17 +3531,13 @@ PHP_FUNCTION(similar_text) int ac = ZEND_NUM_ARGS(); size_t sim; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|z/", &t1, &t2, &percent) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "SS|z", &t1, &t2, &percent) == FAILURE) { return; } - if (ac > 2) { - convert_to_double_ex(percent); - } - if (ZSTR_LEN(t1) + ZSTR_LEN(t2) == 0) { if (ac > 2) { - Z_DVAL_P(percent) = 0; + ZEND_TRY_ASSIGN_DOUBLE(percent, 0); } RETURN_LONG(0); @@ -3550,7 +3546,7 @@ PHP_FUNCTION(similar_text) sim = php_similar_char(ZSTR_VAL(t1), ZSTR_LEN(t1), ZSTR_VAL(t2), ZSTR_LEN(t2)); if (ac > 2) { - Z_DVAL_P(percent) = sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2)); + ZEND_TRY_ASSIGN_DOUBLE(percent, sim * 200.0 / (ZSTR_LEN(t1) + ZSTR_LEN(t2))); } RETURN_LONG(sim); @@ -4047,7 +4043,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit Z_PARAM_ZVAL(replace) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_EX(zcount, 0, 1) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); /* Make sure we're dealing with strings and do the replacement. */ @@ -4084,8 +4080,7 @@ static void php_str_replace_common(INTERNAL_FUNCTION_PARAMETERS, int case_sensit count = php_str_replace_in_subject(search, replace, subject, return_value, case_sensitivity); } if (argc > 3) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, count); + ZEND_TRY_ASSIGN_LONG(zcount, count); } } /* }}} */ @@ -4503,7 +4498,7 @@ PHP_FUNCTION(parse_str) char *res = NULL; size_t arglen; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &arg, &arglen, &arrayArg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &arg, &arglen, &arrayArg) == FAILURE) { return; } From 0efa68b0dc0bfc4344dd8155186b393a5619adb9 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 20:36:23 +0100 Subject: [PATCH 200/369] Fix make test --- Zend/zend_API.c | 3 ++- Zend/zend_types.h | 1 + Zend/zend_vm_def.h | 1 + Zend/zend_vm_execute.h | 1 + 4 files changed, 5 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 70449de2d743a..f7aaedd6db451 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -645,8 +645,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons return "array"; } - zend_parse_arg_zval_deref(real_arg, p, check_null); + zend_parse_arg_zval_deref(arg, p, check_null); } + break; case 'o': { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 736693c931e41..723958e7dcf00 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -759,6 +759,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { GC_REFCOUNT(_ref) = 1; \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ + _ref->type = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7d8a9c2aeb827..ce51d560794da 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -8089,6 +8089,7 @@ ZEND_VM_C_LABEL(check_indirect): GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 8f7e318594f44..a397bb802e4af 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -43941,6 +43941,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_CV_CONST_HAND GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; } else { From a75e03a51948b33e3c87c75c24297c0729545866 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 21:58:39 +0100 Subject: [PATCH 201/369] Take properly care of cases where the by-ref value is *consumed* first --- Zend/zend_API.c | 137 ++++++++++++++++++++++++++++++++++++++++++---- Zend/zend_API.h | 55 +++++++------------ ext/curl/multi.c | 3 +- ext/pcntl/pcntl.c | 5 +- 4 files changed, 148 insertions(+), 52 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f7aaedd6db451..0df34928ef36e 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -531,7 +531,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L', ref_type)) { + if (!zend_parse_arg_long(arg, p, is_null, check_null, c == 'L')) { return "integer"; } } @@ -546,7 +546,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_double(arg, p, is_null, check_null, ref_type)) { + if (!zend_parse_arg_double(arg, p, is_null, check_null)) { return "float"; } } @@ -556,7 +556,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_string(arg, p, pl, check_null, ref_type)) { + if (!zend_parse_arg_string(arg, p, pl, check_null)) { return "string"; } } @@ -566,7 +566,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { char **p = va_arg(*va, char **); size_t *pl = va_arg(*va, size_t *); - if (!zend_parse_arg_path(arg, p, pl, check_null, ref_type)) { + if (!zend_parse_arg_path(arg, p, pl, check_null)) { return "a valid path"; } } @@ -575,7 +575,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'P': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_path_str(arg, str, check_null, ref_type)) { + if (!zend_parse_arg_path_str(arg, str, check_null)) { return "a valid path"; } } @@ -584,7 +584,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons case 'S': { zend_string **str = va_arg(*va, zend_string **); - if (!zend_parse_arg_str(arg, str, check_null, ref_type)) { + if (!zend_parse_arg_str(arg, str, check_null)) { return "string"; } } @@ -599,7 +599,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons is_null = va_arg(*va, zend_bool *); } - if (!zend_parse_arg_bool(arg, p, is_null, check_null, ref_type)) { + if (!zend_parse_arg_bool(arg, p, is_null, check_null)) { return "boolean"; } } @@ -749,10 +749,122 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons break; case 'Z': - /* 'Z' iz not supported anymore and should be replaced with 'z' */ - ZEND_ASSERT(c != 'Z'); - default: - return "unknown"; + { + if (Z_TYPE_P(arg) == IS_NULL) { + if (!check_null) { + return "a non-null value"; + } + + if (ref_type) { + zend_uchar type; + char *expected; + switch (*spec_walk) { + case 'l': + case 'L': + type = IS_LONG; + expected = "integer"; + break; + case 'd': + type = IS_DOUBLE; + expected = "double"; + break; + case 's': + case 'S': + type = IS_STRING; + expected = "string"; + break; + case 'p': + case 'P': + type = IS_STRING; + expected = "a valid path"; + break; + case 'b': + type = _IS_BOOL; + expected = "boolean"; + break; + + default: + return "unknown"; + } + if (!zend_verify_ref_type_assignable(ref_type, type)) { + return expected; + } + } + } else { + switch (*spec_walk) { + case 'l': + if (Z_TYPE_P(arg) != IS_LONG) { + zend_long l; + if (ref_type || !zend_parse_arg_long_slow(arg, &l)) { + return "integer"; + } + ZVAL_LONG(arg, l); + } + break; + + case 'L': + if (Z_TYPE_P(arg) != IS_LONG) { + zend_long l; + if (ref_type || !zend_parse_arg_long_cap_slow(arg, &l)) { + return "integer"; + } + ZVAL_LONG(arg, l); + } + break; + + case 'd': + if (Z_TYPE_P(arg) != IS_DOUBLE) { + double d; + if (ref_type || !zend_parse_arg_double_slow(arg, &d)) { + return "double"; + } + ZVAL_DOUBLE(arg, d); + } + break; + + case 's': + case 'S': + if (Z_TYPE_P(arg) != IS_STRING) { + zend_string *s; + if (ref_type || !zend_parse_arg_str_slow(arg, &s)) { + return "string"; + } + ZVAL_STR(arg, s); + } + break; + + case 'p': + case 'P': + if (Z_TYPE_P(arg) != IS_STRING) { + zend_string *s; + if (ref_type || !zend_parse_arg_path_str(arg, &s, 0)) { + return "a valid path"; + } + ZVAL_STR(arg, s); + } else if (UNEXPECTED(CHECK_NULL_PATH(Z_STRVAL_P(arg), Z_STRLEN_P(arg)))) { + return "a valid path"; + } + break; + + case 'b': + if (Z_TYPE_P(arg) != IS_TRUE && Z_TYPE_P(arg) != IS_FALSE) { + zend_bool b; + if (ref_type || !zend_parse_arg_bool_slow(arg, &b)) { + return "boolean"; + } + ZVAL_BOOL(arg, b); + } + break; + + default: + return "unknown"; + } + } + + *((zval **) va_arg(*va, zval **)) = arg; + ++spec_walk; + } + break; } *spec = spec_walk; @@ -836,7 +948,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': - case 'z': case 'Z': + case 'z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': @@ -851,6 +963,7 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case '/': case '!': + case 'Z': /* Pass */ break; diff --git a/Zend/zend_API.h b/Zend/zend_API.h index de6a86b75e96d..f6802f5940b82 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -762,7 +762,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in zval *_real_arg, *_arg = NULL; \ zend_expected_type _expected_type = IS_UNDEF; \ char *_error = NULL; \ - void *_ref_type; \ zend_bool _dummy; \ zend_bool _optional = 0; \ int error_code = ZPP_ERROR_OK; \ @@ -771,7 +770,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in ((void)_arg); \ ((void)_expected_type); \ ((void)_error); \ - ((void)_ref_type); \ ((void)_dummy); \ ((void)_optional); \ \ @@ -819,12 +817,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in } \ _real_arg++; \ _arg = _real_arg; \ - if (UNEXPECTED(Z_ISREF_P(_arg))) { \ - _ref_type = Z_REF_P(_arg)->type; \ - _arg = Z_REFVAL_P(_arg); \ - } else { \ - _ref_type = NULL; \ - } \ + ZVAL_DEREF(_arg); \ if (separate) { \ SEPARATE_ZVAL_NOREF(_arg); \ } @@ -860,7 +853,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "b" */ #define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \ _expected_type = Z_EXPECTED_BOOL; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -883,7 +876,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "d" */ #define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \ _expected_type = Z_EXPECTED_DOUBLE; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -938,7 +931,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "l" */ #define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -950,7 +943,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "L" */ #define Z_PARAM_STRICT_LONG_EX(dest, is_null, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \ _expected_type = Z_EXPECTED_LONG; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -992,7 +985,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "p" */ #define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1004,7 +997,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "P" */ #define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \ _expected_type = Z_EXPECTED_PATH; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1028,7 +1021,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "s" */ #define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1040,7 +1033,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "S" */ #define Z_PARAM_STR_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null, _ref_type))) { \ + if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \ _expected_type = Z_EXPECTED_STRING; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1052,7 +1045,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, in /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (_ref_type && (((uintptr_t) _ref_type) >> 1) != IS_ARRAY) { \ + if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && (((uintptr_t) Z_REFTYPE_P(_real_arg)) >> 1) != IS_ARRAY) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ @@ -1120,7 +1113,7 @@ ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest); ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest); -static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null) { if (check_null) { *is_null = 0; @@ -1129,8 +1122,6 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze *dest = 1; } else if (EXPECTED(Z_TYPE_P(arg) == IS_FALSE)) { *dest = 0; - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != _IS_BOOL) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1140,15 +1131,13 @@ static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap, void *ref_type) +static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) { *dest = Z_LVAL_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_LONG) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0; @@ -1160,15 +1149,13 @@ static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, ze return 1; } -static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null) { if (check_null) { *is_null = 0; } if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) { *dest = Z_DVAL_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_DOUBLE) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *is_null = 1; *dest = 0.0; @@ -1178,12 +1165,10 @@ static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zen return 1; } -static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null) { if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) { *dest = Z_STR_P(arg); - } else if (ref_type && ((uintptr_t) ref_type) >> 1 != IS_STRING) { - return 0; } else if (check_null && Z_TYPE_P(arg) == IS_NULL) { *dest = NULL; } else { @@ -1192,11 +1177,11 @@ static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, return 1; } -static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null) { zend_string *str; - if (!zend_parse_arg_str(arg, &str, check_null, ref_type)) { + if (!zend_parse_arg_str(arg, &str, check_null)) { return 0; } if (check_null && UNEXPECTED(!str)) { @@ -1209,20 +1194,20 @@ static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size return 1; } -static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null) { - if (!zend_parse_arg_str(arg, dest, check_null, ref_type) || + if (!zend_parse_arg_str(arg, dest, check_null) || (*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) { return 0; } return 1; } -static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null, void *ref_type) +static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null) { zend_string *str; - if (!zend_parse_arg_path_str(arg, &str, check_null, ref_type)) { + if (!zend_parse_arg_path_str(arg, &str, check_null)) { return 0; } if (check_null && UNEXPECTED(!str)) { diff --git a/ext/curl/multi.c b/ext/curl/multi.c index c802edf46ddb8..4ea28f6009a3f 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -248,7 +248,7 @@ PHP_FUNCTION(curl_multi_exec) int still_running; CURLMcode error = CURLM_OK; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/", &z_mh, &z_still_running) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rZl", &z_mh, &z_still_running) == FAILURE) { return; } @@ -272,7 +272,6 @@ PHP_FUNCTION(curl_multi_exec) } } - convert_to_long(z_still_running); still_running = Z_LVAL_P(z_still_running); error = curl_multi_perform(mh->multi, &still_running); ZVAL_LONG(z_still_running, still_running); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 8c6105ac6f033..59966245ecaff 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -709,11 +709,11 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/|lz/", &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "Z!l|lt", &z_status, &options, &z_rusage) == FAILURE) { return; } - status = zval_get_long(z_status); + status = Z_ISNULL_P(z_status) ? 0 : Z_LVAL_P(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { if (Z_TYPE_P(z_rusage) != IS_ARRAY) { @@ -743,7 +743,6 @@ PHP_FUNCTION(pcntl_wait) } #endif - zval_dtor(z_status); ZVAL_LONG(z_status, status); RETURN_LONG((zend_long) child_id); From 433e637c751549e25b9bb7880d9828badbb3cee2 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 22:32:58 +0100 Subject: [PATCH 202/369] Remove all the nice code making it actually worse again ... --- Zend/zend_API.c | 129 ++-------------------------------------------- ext/curl/multi.c | 6 +-- ext/pcntl/pcntl.c | 6 +-- 3 files changed, 9 insertions(+), 132 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0df34928ef36e..91da10538fb55 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -500,13 +500,9 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons int check_null = 0; int separate = 0; zval *real_arg = arg; - void *ref_type = NULL; /* scan through modifiers */ - if (UNEXPECTED(Z_ISREF_P(arg))) { - ref_type = Z_REF_P(arg)->type; - arg = Z_REFVAL_P(arg); - } + ZVAL_DEREF(arg); while (1) { if (*spec_walk == '/') { SEPARATE_ZVAL_NOREF(arg); @@ -641,7 +637,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { zval **p = va_arg(*va, zval **); - if (ref_type && !zend_verify_ref_type_assignable(ref_type, IS_ARRAY)) { + if (Z_ISREF_P(real_arg) && Z_REFTYPE_P(real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(real_arg), IS_ARRAY)) { return "array"; } @@ -747,124 +743,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons zend_parse_arg_zval_deref(real_arg, p, check_null); } break; - - case 'Z': - { - if (Z_TYPE_P(arg) == IS_NULL) { - if (!check_null) { - return "a non-null value"; - } - - if (ref_type) { - zend_uchar type; - char *expected; - switch (*spec_walk) { - case 'l': - case 'L': - type = IS_LONG; - expected = "integer"; - break; - case 'd': - type = IS_DOUBLE; - expected = "double"; - break; - case 's': - case 'S': - type = IS_STRING; - expected = "string"; - break; - case 'p': - case 'P': - type = IS_STRING; - expected = "a valid path"; - break; - case 'b': - type = _IS_BOOL; - expected = "boolean"; - break; - - default: - return "unknown"; - } - if (!zend_verify_ref_type_assignable(ref_type, type)) { - return expected; - } - } - } else { - switch (*spec_walk) { - case 'l': - if (Z_TYPE_P(arg) != IS_LONG) { - zend_long l; - if (ref_type || !zend_parse_arg_long_slow(arg, &l)) { - return "integer"; - } - ZVAL_LONG(arg, l); - } - break; - - case 'L': - if (Z_TYPE_P(arg) != IS_LONG) { - zend_long l; - if (ref_type || !zend_parse_arg_long_cap_slow(arg, &l)) { - return "integer"; - } - ZVAL_LONG(arg, l); - } - break; - - case 'd': - if (Z_TYPE_P(arg) != IS_DOUBLE) { - double d; - if (ref_type || !zend_parse_arg_double_slow(arg, &d)) { - return "double"; - } - ZVAL_DOUBLE(arg, d); - } - break; - - case 's': - case 'S': - if (Z_TYPE_P(arg) != IS_STRING) { - zend_string *s; - if (ref_type || !zend_parse_arg_str_slow(arg, &s)) { - return "string"; - } - ZVAL_STR(arg, s); - } - break; - - case 'p': - case 'P': - if (Z_TYPE_P(arg) != IS_STRING) { - zend_string *s; - if (ref_type || !zend_parse_arg_path_str(arg, &s, 0)) { - return "a valid path"; - } - ZVAL_STR(arg, s); - } else if (UNEXPECTED(CHECK_NULL_PATH(Z_STRVAL_P(arg), Z_STRLEN_P(arg)))) { - return "a valid path"; - } - break; - - case 'b': - if (Z_TYPE_P(arg) != IS_TRUE && Z_TYPE_P(arg) != IS_FALSE) { - zend_bool b; - if (ref_type || !zend_parse_arg_bool_slow(arg, &b)) { - return "boolean"; - } - ZVAL_BOOL(arg, b); - } - break; - - default: - return "unknown"; - } - } - - *((zval **) va_arg(*va, zval **)) = arg; - ++spec_walk; - } - break; } *spec = spec_walk; @@ -948,12 +826,12 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': - case 'z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': case 'L': case 't': + case 'z': max_num_args++; break; @@ -963,7 +841,6 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case '/': case '!': - case 'Z': /* Pass */ break; diff --git a/ext/curl/multi.c b/ext/curl/multi.c index 4ea28f6009a3f..d5465e2ab2fda 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -248,7 +248,7 @@ PHP_FUNCTION(curl_multi_exec) int still_running; CURLMcode error = CURLM_OK; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rZl", &z_mh, &z_still_running) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &z_mh, &z_still_running) == FAILURE) { return; } @@ -272,9 +272,9 @@ PHP_FUNCTION(curl_multi_exec) } } - still_running = Z_LVAL_P(z_still_running); + still_running = zval_get_long(z_still_running); error = curl_multi_perform(mh->multi, &still_running); - ZVAL_LONG(z_still_running, still_running); + ZEND_TRY_ASSIGN_LONG(z_still_running, still_running); SAVE_CURLM_ERROR(mh, error); RETURN_LONG((zend_long) error); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 59966245ecaff..2acf42272f286 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -709,11 +709,11 @@ PHP_FUNCTION(pcntl_wait) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "Z!l|lt", &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|lt", &z_status, &options, &z_rusage) == FAILURE) { return; } - status = Z_ISNULL_P(z_status) ? 0 : Z_LVAL_P(z_status); + status = zval_get_long(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { if (Z_TYPE_P(z_rusage) != IS_ARRAY) { @@ -743,7 +743,7 @@ PHP_FUNCTION(pcntl_wait) } #endif - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } From f4ea705d251e2321d2b52b4e24e2f3efba48d096 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 13 Nov 2016 22:52:40 +0100 Subject: [PATCH 203/369] Use reftype, not its location... --- Zend/zend_types.h | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 723958e7dcf00..7f483d495724d 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -573,7 +573,7 @@ static zend_always_inline zend_uchar zval_get_type(const zval* pz) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) -#define Z_REFTYPE(zval) &Z_REF(zval)->type +#define Z_REFTYPE(zval) Z_REF(zval)->type #define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) #define Z_AST(zval) (zval).value.ast From ad85b553c7c7d4ee7e42473a095ba0c242db0c9e Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 21:54:06 +0000 Subject: [PATCH 204/369] few changes for bob to check --- ext/curl/multi.c | 6 +++--- ext/enchant/enchant.c | 2 +- ext/exif/exif.c | 11 ++++------- ext/ftp/php_ftp.c | 6 +++--- ext/ldap/ldap.c | 17 ++++++----------- 5 files changed, 17 insertions(+), 25 deletions(-) diff --git a/ext/curl/multi.c b/ext/curl/multi.c index d5465e2ab2fda..2d6d4ee561913 100644 --- a/ext/curl/multi.c +++ b/ext/curl/multi.c @@ -318,7 +318,7 @@ PHP_FUNCTION(curl_multi_info_read) int queued_msgs; zval *zmsgs_in_queue = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|z/", &z_mh, &zmsgs_in_queue) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|z", &z_mh, &zmsgs_in_queue) == FAILURE) { return; } @@ -330,9 +330,9 @@ PHP_FUNCTION(curl_multi_info_read) if (tmp_msg == NULL) { RETURN_FALSE; } + if (zmsgs_in_queue) { - zval_dtor(zmsgs_in_queue); - ZVAL_LONG(zmsgs_in_queue, queued_msgs); + ZEND_TRY_ASSIGN_LONG(zmsgs_in_queue, queued_msgs); } array_init(return_value); diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index ef2634918f40a..641231a57ea3e 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -710,7 +710,7 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z/", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|t", &dict, &word, &wordlen, &sugg) == FAILURE) { RETURN_FALSE; } diff --git a/ext/exif/exif.c b/ext/exif/exif.c index c882a12c7c838..bbfa5a0f614b3 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -4532,7 +4532,7 @@ PHP_FUNCTION(exif_thumbnail) WRONG_PARAM_COUNT; } - if (zend_parse_parameters(arg_c, "p|z/z/z/", &p_name, &p_name_len, &p_width, &p_height, &p_imagetype) == FAILURE) { + if (zend_parse_parameters(arg_c, "p|zzz", &p_name, &p_name_len, &p_width, &p_height, &p_imagetype) == FAILURE) { return; } @@ -4559,14 +4559,11 @@ PHP_FUNCTION(exif_thumbnail) if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) { exif_scan_thumbnail(&ImageInfo); } - zval_dtor(p_width); - zval_dtor(p_height); - ZVAL_LONG(p_width, ImageInfo.Thumbnail.width); - ZVAL_LONG(p_height, ImageInfo.Thumbnail.height); + ZEND_TRY_ASSIGN_LONG(p_width, ImageInfo.Thumbnail.width); + ZEND_TRY_ASSIGN_LONG(p_height, ImageInfo.Thumbnail.height); } if (arg_c >= 4) { - zval_dtor(p_imagetype); - ZVAL_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); + ZEND_TRY_ASSIGN_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); } #ifdef EXIF_DEBUG diff --git a/ext/ftp/php_ftp.c b/ext/ftp/php_ftp.c index 8afd3e2b6d10d..fcf42a302f357 100644 --- a/ext/ftp/php_ftp.c +++ b/ext/ftp/php_ftp.c @@ -669,7 +669,7 @@ PHP_FUNCTION(ftp_alloc) zend_long size, ret; zend_string *response = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z/", &z_ftp, &size, &zresponse) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rl|z", &z_ftp, &size, &zresponse) == FAILURE) { RETURN_FALSE; } @@ -678,9 +678,9 @@ PHP_FUNCTION(ftp_alloc) } ret = ftp_alloc(ftp, size, zresponse ? &response : NULL); + if (response) { - zval_dtor(zresponse); - ZVAL_STR(zresponse, response); + ZEND_TRY_ASSIGN_STR(zresponse, response); } if (!ret) { diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 0f82354ac9a0a..f9178f5e27615 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -2127,7 +2127,7 @@ PHP_FUNCTION(ldap_get_option) ldap_linkdata *ld; zend_long option; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/", &link, &option, &retval) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz", &link, &option, &retval) != SUCCESS) { return; } @@ -2169,8 +2169,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, option, &val)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, val); + ZEND_TRY_ASSIGN_LONG(retval, val); } break; #ifdef LDAP_OPT_NETWORK_TIMEOUT case LDAP_OPT_NETWORK_TIMEOUT: @@ -2186,8 +2185,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #elif defined(LDAP_X_OPT_CONNECT_TIMEOUT) @@ -2198,8 +2196,7 @@ PHP_FUNCTION(ldap_get_option) if (ldap_get_option(ld->link, LDAP_X_OPT_CONNECT_TIMEOUT, &timeout)) { RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_LONG(retval, (timeout / 1000)); + ZEND_TRY_ASSIGN_LONG(retval, (timeout / 1000)); } break; #endif #ifdef LDAP_OPT_TIMEOUT @@ -2216,8 +2213,7 @@ PHP_FUNCTION(ldap_get_option) if (!timeout) { RETURN_FALSE; } - zval_dtor(retval); - ZVAL_LONG(retval, timeout->tv_sec); + ZEND_TRY_ASSIGN_LONG(retval, timeout->tv_sec); ldap_memfree(timeout); } break; #endif @@ -2264,8 +2260,7 @@ PHP_FUNCTION(ldap_get_option) } RETURN_FALSE; } - zval_ptr_dtor(retval); - ZVAL_STRING(retval, val); + ZEND_TRY_ASSIGN_STRING(retval, val); ldap_memfree(val); } break; /* options not implemented From 276986623feaea83a5500c96d3a484e17b3ff7c0 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:14:23 +0000 Subject: [PATCH 205/369] more zpp changes --- ext/mbstring/mbstring.c | 2 +- ext/mbstring/php_mbregex.c | 2 +- ext/openssl/openssl.c | 17 +++++++---------- 3 files changed, 9 insertions(+), 12 deletions(-) diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index d6d7cfc432850..846e2b0dc998c 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2092,7 +2092,7 @@ PHP_FUNCTION(mb_parse_str) const mbfl_encoding *detected; track_vars_array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z/", &encstr, &encstr_len, &track_vars_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &encstr, &encstr_len, &track_vars_array) == FAILURE) { return; } diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index a9e464fa64156..0719cd28303ab 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -699,7 +699,7 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z/", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|t", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 3593cdc3e0851..625a304e79030 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2046,7 +2046,7 @@ PHP_FUNCTION(openssl_x509_export) BIO * bio_out; zend_resource *certresource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|b", &zcert, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|b", &zcert, &zout, ¬ext) == FAILURE) { return; } RETVAL_FALSE; @@ -2068,9 +2068,8 @@ PHP_FUNCTION(openssl_x509_export) if (PEM_write_bio_X509(bio_out, cert)) { BUF_MEM *bio_buf; - zval_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -2802,7 +2801,7 @@ PHP_FUNCTION(openssl_pkcs12_export) zval * item; STACK_OF(X509) *ca = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/zs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zzzs|a", &zcert, &zout, &zpkey, &pass, &pass_len, &args) == FAILURE) return; RETVAL_FALSE; @@ -2837,9 +2836,8 @@ PHP_FUNCTION(openssl_pkcs12_export) if (i2d_PKCS12_bio(bio_out, p12)) { BUF_MEM *bio_buf; - zval_dtor(zout); BIO_get_mem_ptr(bio_out, &bio_buf); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { @@ -2878,7 +2876,7 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_in = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/s", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sts", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) return; RETVAL_FALSE; @@ -3246,7 +3244,7 @@ PHP_FUNCTION(openssl_csr_export) BIO * bio_out; zend_resource *csr_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|b", &zcsr, &zout, ¬ext) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|b", &zcsr, &zout, ¬ext) == FAILURE) { return; } @@ -3269,8 +3267,7 @@ PHP_FUNCTION(openssl_csr_export) BUF_MEM *bio_buf; BIO_get_mem_ptr(bio_out, &bio_buf); - zval_dtor(zout); - ZVAL_STRINGL(zout, bio_buf->data, bio_buf->length); + ZEND_TRY_ASSIGN_STRINGL(zout, bio_buf->data, bio_buf->length); RETVAL_TRUE; } else { From 8d3a9f6e7b99e27ae4b442c976fc427bbf3ef76c Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:29:27 +0000 Subject: [PATCH 206/369] finish pcntl, probably --- ext/pcntl/pcntl.c | 19 +++++++------------ 1 file changed, 7 insertions(+), 12 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 2acf42272f286..aa77ba4c83883 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -656,7 +656,7 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/|lz/", &pid, &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt/", &pid, &z_status, &options, &z_rusage) == FAILURE) { return; } @@ -667,8 +667,6 @@ PHP_FUNCTION(pcntl_waitpid) if (Z_TYPE_P(z_rusage) != IS_ARRAY) { zval_dtor(z_rusage); array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); } memset(&rusage, 0, sizeof(struct rusage)); @@ -690,8 +688,7 @@ PHP_FUNCTION(pcntl_waitpid) } #endif - zval_dtor(z_status); - ZVAL_LONG(z_status, status); + ZEND_TRY_ASSIGN_LONG(z_status, status); RETURN_LONG((zend_long) child_id); } @@ -1084,7 +1081,7 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|z/", &how, &user_set, &user_oldset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t/", &how, &user_set, &user_oldset) == FAILURE) { return; } @@ -1113,9 +1110,8 @@ PHP_FUNCTION(pcntl_sigprocmask) if (Z_TYPE_P(user_oldset) != IS_ARRAY) { zval_dtor(user_oldset); array_init(user_oldset); - } else { - zend_hash_clean(Z_ARRVAL_P(user_oldset)); } + for (signo = 1; signo < MAX(NSIG-1, SIGRTMAX); ++signo) { if (sigismember(&oldset, signo) != 1) { continue; @@ -1141,11 +1137,11 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|z/", &user_set, &user_siginfo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/", &user_set, &user_siginfo) == FAILURE) { return; } } @@ -1212,9 +1208,8 @@ static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_sigi if (Z_TYPE_P(user_siginfo) != IS_ARRAY) { zval_dtor(user_siginfo); array_init(user_siginfo); - } else { - zend_hash_clean(Z_ARRVAL_P(user_siginfo)); } + add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); add_assoc_long_ex(user_siginfo, "code", sizeof("code")-1, siginfo->si_code); From d7c7b9c01244f370d4a93ccc63ffe76f793c4d46 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:33:58 +0000 Subject: [PATCH 207/369] some of sockets --- ext/sockets/sockets.c | 35 +++++++++++++---------------------- 1 file changed, 13 insertions(+), 22 deletions(-) diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index 432551a920c45..c8037dbdcc4ae 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1269,7 +1269,7 @@ PHP_FUNCTION(socket_getsockname) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &addr, &port) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &addr, &port) == FAILURE) { return; } @@ -1293,12 +1293,10 @@ PHP_FUNCTION(socket_getsockname) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_dtor(addr); - ZVAL_STRING(addr, addr6); + ZEND_TRY_ASSIGN_STRING(addr, addr6); if (port != NULL) { - zval_dtor(port); - ZVAL_LONG(port, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin6->sin6_port)); } RETURN_TRUE; break; @@ -1310,12 +1308,10 @@ PHP_FUNCTION(socket_getsockname) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_dtor(addr); - ZVAL_STRING(addr, addr_string); + ZEND_TRY_ASSIGN_STRING(addr, addr_string); if (port != NULL) { - zval_dtor(port); - ZVAL_LONG(port, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(port, htons(sin->sin_port)); } RETURN_TRUE; break; @@ -1323,8 +1319,7 @@ PHP_FUNCTION(socket_getsockname) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_dtor(addr); - ZVAL_STRING(addr, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(addr, s_un->sun_path); RETURN_TRUE; break; @@ -1352,7 +1347,7 @@ PHP_FUNCTION(socket_getpeername) char *addr_string; socklen_t salen = sizeof(php_sockaddr_storage); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|z/", &arg1, &arg2, &arg3) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|z", &arg1, &arg2, &arg3) == FAILURE) { return; } @@ -1372,12 +1367,11 @@ PHP_FUNCTION(socket_getpeername) case AF_INET6: sin6 = (struct sockaddr_in6 *) sa; inet_ntop(AF_INET6, &sin6->sin6_addr, addr6, INET6_ADDRSTRLEN); - zval_dtor(arg2); - ZVAL_STRING(arg2, addr6); + + ZEND_TRY_ASSIGN_STRING(arg2, addr6); if (arg3 != NULL) { - zval_dtor(arg3); - ZVAL_LONG(arg3, htons(sin6->sin6_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin6->sin6_port)); } RETURN_TRUE; @@ -1390,12 +1384,10 @@ PHP_FUNCTION(socket_getpeername) addr_string = inet_ntoa(sin->sin_addr); inet_ntoa_lock = 0; - zval_dtor(arg2); - ZVAL_STRING(arg2, addr_string); + ZEND_TRY_ASSIGN_STRING(arg2, addr_string); if (arg3 != NULL) { - zval_dtor(arg3); - ZVAL_LONG(arg3, htons(sin->sin_port)); + ZEND_TRY_ASSIGN_LONG(arg3, htons(sin->sin_port)); } RETURN_TRUE; @@ -1404,8 +1396,7 @@ PHP_FUNCTION(socket_getpeername) case AF_UNIX: s_un = (struct sockaddr_un *) sa; - zval_dtor(arg2); - ZVAL_STRING(arg2, s_un->sun_path); + ZEND_TRY_ASSIGN_STRING(arg2, s_un->sun_path); RETURN_TRUE; break; From cd32f63a44f186935427bac2322cfce22223c242 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:52:04 +0000 Subject: [PATCH 208/369] more zpppppp stuff --- ext/standard/array.c | 7 +------ ext/standard/type.c | 7 +++---- ext/xml/xml.c | 2 +- ext/zip/php_zip.c | 16 ++++++---------- 4 files changed, 11 insertions(+), 21 deletions(-) diff --git a/ext/standard/array.c b/ext/standard/array.c index f3a7f4de84cd9..4e006db8b9859 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2801,7 +2801,7 @@ PHP_FUNCTION(array_splice) length = 0; int num_in; /* Number of elements in the input array */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lz/", &array, &offset, &length, &repl_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lt", &array, &offset, &length, &repl_array) == FAILURE) { return; } @@ -2811,11 +2811,6 @@ PHP_FUNCTION(array_splice) length = num_in; } - if (ZEND_NUM_ARGS() == 4) { - /* Make sure the last argument, if passed, is an array */ - convert_to_array_ex(repl_array); - } - /* Don't create the array of removed elements if it's not going * to be used; e.g. only removing and/or replacing elements */ if (USED_RET()) { diff --git a/ext/standard/type.c b/ext/standard/type.c index 88a150157025a..950fc79c335c7 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -358,7 +358,7 @@ PHP_FUNCTION(is_callable) zend_bool syntax_only = 0; int check_flags = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|bz/", &var, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "z|bz", &var, &syntax_only, &callable_name) == FAILURE) { return; } @@ -368,13 +368,12 @@ PHP_FUNCTION(is_callable) } if (ZEND_NUM_ARGS() > 2) { retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); - zval_dtor(callable_name); //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { - ZVAL_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); + ZEND_STR_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); zend_string_release(name); } else { - ZVAL_STR(callable_name, name); + ZEND_STR_ASSIGN_STR(callable_name, name); } } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); diff --git a/ext/xml/xml.c b/ext/xml/xml.c index f8d72523a00ee..ed8d297239203 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1412,7 +1412,7 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz/|z/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst/|t/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } diff --git a/ext/zip/php_zip.c b/ext/zip/php_zip.c index 4685fb2486890..814d510a5bb1a 100644 --- a/ext/zip/php_zip.c +++ b/ext/zip/php_zip.c @@ -2161,7 +2161,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &name, &name_len, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2178,10 +2178,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesName) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_ptr_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_ptr_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ @@ -2203,7 +2201,7 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) ZIP_FROM_OBJECT(intern, self); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz/z/|l", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lzz|l", &index, &z_opsys, &z_attr, &flags) == FAILURE) { return; } @@ -2213,10 +2211,8 @@ static ZIPARCHIVE_METHOD(getExternalAttributesIndex) (zip_flags_t)flags, &opsys, &attr) < 0) { RETURN_FALSE; } - zval_dtor(z_opsys); - ZVAL_LONG(z_opsys, opsys); - zval_dtor(z_attr); - ZVAL_LONG(z_attr, attr); + ZEND_TRY_ASSIGN_LONG(z_opsys, opsys); + ZEND_TRY_ASSIGN_LONG(z_attr, attr); RETURN_TRUE; } /* }}} */ From a0aaeed7a2884ca86c6bd237b204aacc62345036 Mon Sep 17 00:00:00 2001 From: Joe Watkins Date: Sun, 13 Nov 2016 22:53:01 +0000 Subject: [PATCH 209/369] use macros that actually exist, rather than nonsense --- ext/standard/type.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/type.c b/ext/standard/type.c index 950fc79c335c7..0e0c6f506d701 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -370,10 +370,10 @@ PHP_FUNCTION(is_callable) retval = zend_is_callable_ex(var, NULL, check_flags, &name, NULL, &error); //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { - ZEND_STR_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); + ZEND_TRY_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); zend_string_release(name); } else { - ZEND_STR_ASSIGN_STR(callable_name, name); + ZEND_TRY_ASSIGN_STR(callable_name, name); } } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); From 93707d7856bffd5201ad2613b259652b22c28f16 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 14 Nov 2016 03:38:49 +0100 Subject: [PATCH 210/369] Fix a ton of bugs and tests --- .../typed_properties_003.phpt | 4 +- .../typed_properties_010.phpt | 9 +- .../typed_properties_011.phpt | 13 +- .../typed_properties_032.phpt | 12 +- .../typed_properties_033.phpt | 37 +- .../typed_properties_034.phpt | 61 +- .../typed_properties_044.phpt | 48 +- .../typed_properties_055.phpt | 10 +- Zend/zend_API.h | 1 + Zend/zend_compile.c | 1 + Zend/zend_execute.h | 10 +- Zend/zend_vm_def.h | 64 +- Zend/zend_vm_execute.h | 823 ++++++++++-------- 13 files changed, 610 insertions(+), 483 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index cf85fc4093120..c96a464680fa4 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties error condition (fetch reference) +Test typed properties error condition (fetch uninitialized by reference) --FILE-- int; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be referenced in %s:%d +Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property by reference in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 3ef8eceb5f15f..8b5cc049825d0 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for func arg +Test typed properties allow fetch reference --FILE-- bar); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:11 -Stack trace: -#0 {main} - thrown in %s on line 11 - - +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt index 5f3dbdd52ae44..074327ff26a87 100644 --- a/Zend/tests/type_declarations/typed_properties_011.phpt +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for init array +Test typed properties allow fetch reference for init array --FILE-- bar]; +var_dump($array); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must not be referenced in %s:8 -Stack trace: -#0 {main} - thrown in %s on line 8 - - +array(1) { + [0]=> + &int(1) +} diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt index 84b2823fb1cb6..017e18eceeff5 100644 --- a/Zend/tests/type_declarations/typed_properties_032.phpt +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -1,21 +1,15 @@ --TEST-- -Test typed properties return by ref is disallowed +Test typed properties return by ref is allowed --FILE-- bar; } }; var_dump($foo->method()); --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:7 -Stack trace: -#0 %s(11): class@anonymous->method() -#1 {main} - thrown in %s on line 7 - +int(15) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 11eaa1ac8bd1e..d1f7302933f25 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -3,17 +3,36 @@ Test typed properties yield reference guard --FILE-- bar]; + public function &fetch() { + yield $this->foo; + yield $this->bar; + yield $this->baz; + yield $this->qux; } }; -foreach ($foo->fetch() as $prop); +try { + foreach ($foo->fetch() as &$prop) { + $prop++; + } +} catch (Error $e) { echo $e->getMessage(), "\n"; } + +var_dump($foo); +?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:6 -Stack trace: -#0 %s(10): class@anonymous->fetch() -#1 {main} - thrown in %s on line 6 +Cannot assign float to reference of type integer +object(class@anonymous)#1 (4) { + ["foo"]=> + int(2) + ["bar"]=> + int(4) + ["baz"]=> + int(6) + ["qux"]=> + &int(9223372036854775807) +} diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index dc6d58170d000..99f9e3b592063 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -1,24 +1,51 @@ --TEST-- -Test typed properties add array element guard +Test typed properties passed to typed function --FILE-- bar] as $item) - { - yield $item; - } - } + public function &getIterator() { + foreach (['1', &$this->bar] as &$item) { + yield $item; + } + } }; -foreach($foo->getIterator() as $item); +function foo(?int &$a) { + var_dump($a); + $a = null; +} + +foo($foo->bar); + +try { + $foo->baz = &$foo->bar; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +$foo->bar = 10; + +foreach ($foo->getIterator() as &$item) { + $foo->baz = &$item; + var_dump($foo->baz); +} + +try { + foo($foo->bar); +} catch (Error $e) { echo $e->getMessage(), "\n"; } + +var_dump($foo); +?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$bar must not be referenced in %s:8 -Stack trace: -#0 %s(15): class@anonymous->getIterator() -#1 {main} - thrown in %s on line 8 +int(42) +Cannot assign null to reference of type integer +int(1) +int(10) +int(10) +Cannot assign null to reference of type integer +object(class@anonymous)#1 (2) { + ["bar"]=> + &int(10) + ["baz"]=> + &int(10) +} diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 3dc96e25166c7..3e75a071f505a 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -1,27 +1,55 @@ --TEST-- -Error message should be the same independently of called function +Test increment functions on typed property references --FILE-- bar; + +$bar *= 1; + +var_dump($bar--); +var_dump(--$bar); +var_dump(++$bar); +var_dump($bar++); + +$bar = PHP_INT_MAX; + +try { + var_dump($bar++); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; } -function foo(&$x) { +try { + var_dump(++$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; } -$f = function (&$x) {}; +$bar = PHP_INT_MIN; -$foo = new Foo(); try { - foo($foo->bar); + var_dump($bar--); } catch (Throwable $e) { echo $e->getMessage() . "\n"; } + try { - $f($foo->bar); + var_dump(--$bar); } catch (Throwable $e) { echo $e->getMessage() . "\n"; } +?> --EXPECT-- -Typed property Foo::$bar must not be referenced -Typed property Foo::$bar must not be referenced +int(0) +int(-2) +int(-1) +int(-1) +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?integer + diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index 16c958acf33dc..24ad1f6f91452 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -11,7 +11,7 @@ class B { } $f = function (&$n) { var_dump($n); - $i = "ops"; + $n = "ops"; }; $o = new B; $o->a = new A; @@ -20,8 +20,10 @@ $f($o->a->bar); ?> --EXPECTF-- int(1) +int(2) -Fatal error: Uncaught TypeError: Typed property A::$bar must not be referenced in %styped_properties_055.php:16 +Fatal error: Uncaught TypeError: Cannot assign string to reference of type integer in %s:%d Stack trace: -#0 {main} - thrown in %styped_properties_055.php on line 16 +#0 %s(%d): {closure}(2) +#1 {main} + thrown in %s on line %d diff --git a/Zend/zend_API.h b/Zend/zend_API.h index f6802f5940b82..74d1da8c589d9 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -693,6 +693,7 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return FAILURE; } } else { + ZVAL_DEREF(zv); zval_ptr_dtor(zv); ZVAL_COPY(zv, arg); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 0c2355dc9840e..287f53631159c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3085,6 +3085,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; zend_emit_op_data(&source_node); + zend_make_var_result(result, opline); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 49cdaaee7247f..50c01d5a255a5 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -80,12 +80,10 @@ static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info * /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { - if (0xFF >= (uintptr_t) type) { - zend_uchar cur_type = ((uintptr_t) type) >> 1; - return new_type == cur_type || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); - } else { - return (0x1 & (uintptr_t) type) && new_type == IS_NULL; - } + zend_uchar cur_type = ((uintptr_t) type) >> 1; + return new_type == cur_type + || ((0x1 & (uintptr_t) type) && new_type == IS_NULL) + || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); } ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ce51d560794da..a77085b4303eb 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -957,7 +957,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1496,7 +1496,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1513,6 +1513,8 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1557,7 +1559,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1574,6 +1576,8 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1614,7 +1618,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1659,7 +1663,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -2792,7 +2796,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S property = GET_OP2_ZVAL_PTR(BP_VAR_R); - container = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); FREE_OP2(); @@ -2835,33 +2839,36 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); FREE_OP1_VAR_PTR(); FREE_OP2(); @@ -2881,7 +2888,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } ZEND_VM_HELPER(zend_leave_helper, ANY, ANY) @@ -8462,6 +8469,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF) GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a397bb802e4af..d5cf21a464d7e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20183,32 +20183,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20228,7 +20231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -20304,32 +20307,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20349,7 +20355,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25465,32 +25471,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25510,7 +25519,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -25586,32 +25595,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25631,7 +25643,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28762,32 +28774,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -28807,7 +28822,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -28883,32 +28898,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -28928,7 +28946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31075,7 +31093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON property = EX_CONSTANT(opline->op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -31119,32 +31137,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31163,7 +31184,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -31195,7 +31216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON property = EX_CONSTANT(opline->op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -31239,32 +31260,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31283,7 +31307,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34201,7 +34225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -34245,32 +34269,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34289,7 +34316,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -34321,7 +34348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ property = _get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op2.var); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); @@ -34365,32 +34392,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34409,7 +34439,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36533,7 +36563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); zval_ptr_dtor_nogc(free_op2); @@ -36577,32 +36607,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -36621,7 +36654,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -36653,7 +36686,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP property = _get_zval_ptr_var(opline->op2.var, execute_data, &free_op2); - container = NULL; + container = _get_obj_zval_ptr_unused(execute_data); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { zend_throw_error(NULL, "Using $this when not in object context"); zval_ptr_dtor_nogc(free_op2); @@ -36697,32 +36730,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -36741,7 +36777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ROPE_INIT_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42703,32 +42739,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42747,7 +42786,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -42823,32 +42862,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42867,7 +42909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -44011,6 +44053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND GC_REFCOUNT(ref) = 2; GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); + ref->type = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -50112,32 +50155,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50156,7 +50202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -50232,32 +50278,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50276,7 +50325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -54535,32 +54584,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -54579,7 +54631,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) @@ -54655,32 +54707,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (!(old_type & 0x1)) { - type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ - } - if ((~0x1 & old_type) != (uintptr_t) type) { - if (0xFF < (uintptr_t) type || 0xFF < old_type) { - if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { - type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ - } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + if (old_type != NULL) { + if (!(old_type & 0x1)) { + type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ + } + if ((~0x1 & old_type) != (uintptr_t) type) { + if (0xFF < (uintptr_t) type || 0xFF < old_type) { + if (instanceof_function(prop_info->type_ce, (zend_class_entry *) (~0x1 & old_type))) { + type = (void *) (old_type & (~!(0x1 & (uintptr_t) type))); /* remove allow_null if not allowed on current property */ + } else if (!instanceof_function((zend_class_entry *) (~0x1 & old_type), prop_info->type_ce)) { + error = 1; + } + } else { error = 1; } - } else { - error = 1; } - } - if (error) { - zend_throw_exception_ex( - zend_ce_type_error, prop_info->type, - "Property and reference types %s%s and %s%s are not compatible", - prop_info->allow_null ? "?" : "", - prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), - (old_type & 0x1) ? "?" : "", - (old_type < 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) - ); + if (error) { + zend_throw_exception_ex( + zend_ce_type_error, prop_info->type, + "Property and reference types %s%s and %s%s are not compatible", + prop_info->allow_null ? "?" : "", + prop_info->type == IS_OBJECT ? ZSTR_VAL(prop_info->type_ce->name) : zend_get_type_by_const(prop_info->type), + (old_type & 0x1) ? "?" : "", + (old_type > 0xFF) ? ZSTR_VAL(((zend_class_entry *) (old_type & ~0x1))->name) : zend_get_type_by_const(old_type >> 1) + ); + } } } if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); zval_ptr_dtor_nogc(free_op2); @@ -54699,7 +54754,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); - ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) From bb230fd817ad117873c2ec94edcb9ea86bf76d6e Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 01:56:49 +0100 Subject: [PATCH 211/369] Add more guards for typed by-ref assign + fixes --- Zend/tests/bug69732.phpt | 21 +- .../typed_properties_044.phpt | 18 +- .../typed_properties_061.phpt | 58 + .../typed_properties_062.phpt | 64 + .../typed_properties_063.phpt | 63 + .../typed_properties_064.phpt | 63 + .../typed_properties_065.phpt | 55 + Zend/zend_execute.c | 195 ++- Zend/zend_execute.h | 10 +- Zend/zend_types.h | 4 +- Zend/zend_vm_def.h | 146 +- Zend/zend_vm_execute.h | 1415 +++++++++++------ ext/standard/array.c | 7 +- ext/standard/type.c | 2 +- 14 files changed, 1490 insertions(+), 631 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_061.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_062.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_063.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_064.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_065.phpt diff --git a/Zend/tests/bug69732.phpt b/Zend/tests/bug69732.phpt index 8d5fccd71211a..4503235f53d3c 100644 --- a/Zend/tests/bug69732.phpt +++ b/Zend/tests/bug69732.phpt @@ -17,15 +17,14 @@ function ret_assoc() { $wpq = new wpq; $wpq->interesting =& ret_assoc(); -$x = $wpq->interesting; -printf("%s\n", $x); +$x = &$wpq->interesting; +var_dump($x); +?> --EXPECTF-- -Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 - -Notice: Indirect modification of overloaded property wpq::$interesting has no effect in %sbug69732.php on line 16 - -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d -Stack trace: -#0 {main} - thrown in %s on line %d - +Notice: Only variables should be assigned by reference in %s on line %d +array(2) { + ["foo"]=> + string(3) "bar" + [0]=> + string(3) "XXX" +} diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 3e75a071f505a..a0eec85b5160e 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -29,19 +29,12 @@ try { echo $e->getMessage() . "\n"; } +/* (1 << 63) - 1 overflows to float, which is exactly convertible back to (1 << 63) */ $bar = PHP_INT_MIN; -try { - var_dump($bar--); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} +var_dump($bar--); +var_dump(--$bar); -try { - var_dump(--$bar); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} ?> --EXPECT-- int(0) @@ -50,6 +43,5 @@ int(-1) int(-1) Cannot assign float to reference of type ?integer Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer - +int(-9223372036854775808) +int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt new file mode 100644 index 0000000000000..144a759c317ed --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -0,0 +1,58 @@ +--TEST-- +Typed property on overloaded by-ref property +--FILE-- +foo; + } + + function __set($x, $y) { + print "ERROR: __set() called on by-ref __get()"; + } +}; + +$a->_ += 1; +var_dump($a->foo); + +$a->_ .= "1"; +var_dump($a->foo); + +try { + $a->_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_--; +var_dump($a->foo); + +--$a->_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $a->_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt new file mode 100644 index 0000000000000..bacbe35be1066 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -0,0 +1,64 @@ +--TEST-- +Typed property on by-ref property +--FILE-- +_ = &$a->foo; + +$a->_ += 1; +var_dump($a->foo); + +$a->_ .= "1"; +var_dump($a->foo); + +try { + $a->_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_--; +var_dump($a->foo); + +--$a->_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $a->_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + $a->_ = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a->_ = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt new file mode 100644 index 0000000000000..8f9985662639f --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -0,0 +1,63 @@ +--TEST-- +Typed property on by-ref variable +--FILE-- +foo; + +$_ += 1; +var_dump($a->foo); + +$_ .= "1"; +var_dump($a->foo); + +try { + $_ .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_--; +var_dump($a->foo); + +--$_; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $_++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + $_ = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_ = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt new file mode 100644 index 0000000000000..241125ffb1ead --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -0,0 +1,63 @@ +--TEST-- +Typed property on by-ref array value +--FILE-- +foo]; + +$_[0] += 1; +var_dump($a->foo); + +$_[0] .= "1"; +var_dump($a->foo); + +try { + $_[0] .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_[0]--; +var_dump($a->foo); + +--$_[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $_[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$_[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + $_[0] = []; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$_[0] = 1; +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign array to reference of type integer +int(9223372036854775807) +int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt new file mode 100644 index 0000000000000..e19852ba1ee31 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -0,0 +1,55 @@ +--TEST-- +Typed property on by-ref array dimension +--FILE-- +foo; } + function offsetSet($o, $v) { print "offsetSet() must not be called"; } + function offsetUnset($o) { print "offsetUnset() ?!?"; } +}; + +$a[0] += 1; +var_dump($a->foo); + +$a[0] .= "1"; +var_dump($a->foo); + +try { + $a[0] .= "e50"; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +$a[0]--; +var_dump($a->foo); + +--$a[0]; +var_dump($a->foo); + +$a->foo = PHP_INT_MAX; + +try { + $a[0]++; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +try { + ++$a[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +var_dump($a->foo); + +?> +--EXPECT-- +int(2) +int(21) +Cannot assign string to reference of type integer +int(21) +int(20) +int(19) +Cannot assign float to reference of type integer +int(9223372036854775807) +Cannot assign float to reference of type integer +int(9223372036854775807) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8a13c4bb55101..cb3bcf19f0ee9 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -954,7 +954,7 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict) { zend_uchar cur_type; if (!type) { @@ -980,7 +980,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(void return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict) { return i_zend_verify_ref_type_assignable_zval(type, zv, strict); } @@ -1243,15 +1243,32 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * } ZVAL_COPY_VALUE(z, value); } - binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value); - Z_OBJ_HT_P(object)->write_dimension(object, property, &res); + if (UNEXPECTED(Z_ISREF_P(z))) { + zend_reftype type = Z_REFTYPE_P(z); + zval *ref = Z_REFVAL_P(z); + binary_op(&res, ref, value); + if (type && !zend_verify_ref_type_assignable_zval(type, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { + zend_throw_ref_type_error(type, &res); + zval_ptr_dtor(&res); + if (z == &rv) { + zval_ptr_dtor(&rv); + } + return; + } + zval_ptr_dtor(ref); + ZVAL_COPY(ref, &res); + } else { + binary_op(&res, z, value); + Z_OBJ_HT_P(object)->write_dimension(object, property, &res); + } if (z == &rv) { zval_ptr_dtor(&rv); } if (retval) { - ZVAL_COPY(retval, &res); + ZVAL_COPY_VALUE(retval, &res); + } else { + zval_ptr_dtor(&res); } - zval_ptr_dtor(&res); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); if (retval) { @@ -1490,7 +1507,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; - zval *z; + zval *z, *tmp; zval z_copy; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1510,21 +1527,42 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - if (UNEXPECTED(Z_TYPE_P(z) == IS_REFERENCE)) { - ZVAL_COPY(result, Z_REFVAL_P(z)); + if (UNEXPECTED(Z_ISREF_P(z))) { + zend_reftype ref_type = Z_REFTYPE_P(z); + tmp = Z_REFVAL_P(z); + ZVAL_COPY(result, tmp); + zend_property_info *prop_info; + + if (inc) { + increment_function(tmp); + } else { + decrement_function(tmp); + } + + if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { + /* ref types are always stricter than prop types */ + if (UNEXPECTED(ref_type ? !zend_verify_ref_type_assignable_zval(ref_type, tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : !zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + if (ref_type) { + zend_throw_ref_type_error(ref_type, tmp); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); + } + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, result); + } + } } else { ZVAL_COPY(result, z); + if (inc) { + increment_function(z); + } else { + decrement_function(z); + } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + zval_ptr_dtor(z); } - ZVAL_DUP(&z_copy, result); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(&z_copy); zval_ptr_dtor(z); + OBJ_RELEASE(Z_OBJ(obj)); } else { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(result); @@ -1537,7 +1575,6 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval *z, obj; - zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); Z_ADDREF(obj); @@ -1557,37 +1594,51 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); + if (UNEXPECTED(Z_ISREF_P(z))) { /* binary ops on &__get() should not be written again */ + zend_property_info *prop_info; + zend_reftype ref_type = Z_REFTYPE_P(z); + zval *tmp = Z_REFVAL_P(z); - if (UNEXPECTED(prop_info)) { - /* special case for typed properties */ - zval z_copy; + if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { + /* special case for typed values */ + zval z_copy; - ZVAL_DUP(&z_copy, z); + ZVAL_COPY(&z_copy, tmp); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + + /* ref types are always stricter than prop types */ + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) != NULL)) { + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + if (inc) { + increment_function(tmp); + } else { + decrement_function(tmp); + } + } + } else { if (inc) { - increment_function(&z_copy); + increment_function(z); } else { - decrement_function(&z_copy); + decrement_function(z); } - if (UNEXPECTED(result)) { - ZVAL_COPY(result, &z_copy); + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + ZVAL_COPY(result, z); } - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - OBJ_RELEASE(Z_OBJ(obj)); - zval_ptr_dtor(&z_copy); - return; - } - - ZVAL_DEREF(z); - SEPARATE_ZVAL_NOREF(z); - if (inc) { - increment_function(z); - } else { - decrement_function(z); - } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); } OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(z); @@ -1602,8 +1653,7 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, static zend_never_inline void zend_assign_op_overloaded_property(zval *object, zval *property, void **cache_slot, zval *value, binary_op_type binary_op, zval *result) { zval *z; - zval rv, obj; - zval *zptr; + zval rv, obj, z_copy; zend_property_info *prop_info; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1626,30 +1676,47 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL); - if (UNEXPECTED(prop_info)) { - /* special case for typed properties */ - zval z_copy; + if (UNEXPECTED(Z_ISREF_P(z))) { /* binary ops on &__get() should not be written again */ + zend_reftype ref_type = Z_REFTYPE_P(z); + zval *tmp = Z_REFVAL_P(z); - ZVAL_DUP(&z_copy, z); - binary_op(&z_copy, &z_copy, value); - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed values */ + binary_op(&z_copy, tmp, value); + + /* ref types are always stricter than prop types */ + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) != NULL)) { + zval_ptr_dtor(tmp); + ZVAL_COPY_VALUE(tmp, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + SEPARATE_ZVAL_NOREF(tmp); + binary_op(tmp, tmp, value); + } + } else { + if (UNEXPECTED(prop_info)) { + binary_op(&z_copy, z, value); + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); + zval_ptr_dtor(z); + z = &z_copy; + } else { + SEPARATE_ZVAL_NOREF(z); + binary_op(z, z, value); + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } - zval_ptr_dtor(&z_copy); - OBJ_RELEASE(Z_OBJ(obj)); - return; } - zptr = z; - ZVAL_DEREF(z); - SEPARATE_ZVAL_NOREF(z); - binary_op(z, z, value); - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result)) { + if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { ZVAL_COPY(result, z); } - zval_ptr_dtor(zptr); + zval_ptr_dtor(z); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); if (UNEXPECTED(result)) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 50c01d5a255a5..b9583ff054e1e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -56,7 +56,7 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info *prop_info) { +static zend_always_inline zend_reftype zend_get_prop_info_ref_type(zend_property_info *prop_info) { if (prop_info->type == IS_OBJECT && UNEXPECTED(!prop_info->type_ce)) { if (zend_string_equals_literal_ci(prop_info->type_name, "self")) { prop_info->type_ce = prop_info->ce; @@ -75,19 +75,19 @@ static zend_always_inline void *zend_get_prop_info_ref_type(zend_property_info * } } - return (void *) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); + return (zend_reftype) (((prop_info->type & ~IS_OBJECT) << 1) | prop_info->allow_null | (uintptr_t) prop_info->type_ce); } /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ -static zend_always_inline zend_bool zend_verify_ref_type_assignable(void *type, zend_uchar new_type) { +static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_reftype type, zend_uchar new_type) { zend_uchar cur_type = ((uintptr_t) type) >> 1; return new_type == cur_type || ((0x1 & (uintptr_t) type) && new_type == IS_NULL) || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(void *type, zval *zv, zend_bool strict); -ZEND_API ZEND_COLD void zend_throw_ref_type_error(void *type, zval *zv); +ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_reftype type, zval *zv, zend_bool strict); +ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_reftype type, zval *zv); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 7f483d495724d..6ba91ef76a7ba 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -289,10 +289,12 @@ struct _zend_resource { void *ptr; }; +typedef void * zend_reftype; + struct _zend_reference { zend_refcounted_h gc; zval val; - zend_class_entry *type; + zend_reftype type; }; struct _zend_ast_ref { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a77085b4303eb..da22df937c759 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -807,7 +807,12 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (OP2_TYPE == IS_CONST) { @@ -815,19 +820,21 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -880,13 +887,36 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): if (UNEXPECTED(!var_ptr)) { ZEND_VM_C_GOTO(assign_dim_op_ret_null); } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + FREE_OP2(); + FREE_OP(free_op_data1); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (OP2_TYPE != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -968,7 +998,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_helper, VAR|CV, CONST|TMPVAR|CV, binary_op_ zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1273,7 +1303,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -1287,30 +1317,37 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -1397,7 +1434,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -1411,7 +1448,12 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (OP2_TYPE == IS_CONST) { @@ -1419,9 +1461,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -1429,12 +1471,16 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -1507,7 +1553,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1570,7 +1616,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -1597,7 +1643,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1627,7 +1673,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -1642,7 +1688,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1672,7 +1718,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -2513,7 +2559,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( } ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2635,7 +2681,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2710,7 +2756,7 @@ ZEND_VM_HANDLER(38, ZEND_ASSIGN, VAR|CV, CONST|TMP|VAR|CV, SPEC(RETVAL)) ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, OP2_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2741,7 +2787,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, OP2_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -2840,7 +2886,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -2867,7 +2913,7 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); FREE_OP1_VAR_PTR(); @@ -2878,7 +2924,9 @@ ZEND_VM_HANDLER(100, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -6552,7 +6600,7 @@ ZEND_VM_C_LABEL(fe_fetch_r_exit): if (EXPECTED(OP2_TYPE == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index d5cf21a464d7e..2e117cc73d5f1 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -15558,7 +15558,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15569,12 +15569,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15619,7 +15621,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15630,12 +15632,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15680,7 +15684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15691,12 +15695,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15741,7 +15747,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15752,12 +15758,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -15777,7 +15785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15798,7 +15806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15807,7 +15815,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -15822,7 +15830,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); @@ -15843,7 +15851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -15852,7 +15860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -16978,7 +16986,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SPEC_VAR_HANDLER(ZE if (EXPECTED(opline->op2_type == IS_CV)) { zval *variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op2.var); - zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); } else { zval *res = EX_VAR(opline->op2.var); zend_refcounted *gc = Z_COUNTED_P(value); @@ -17596,7 +17604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -17604,19 +17617,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -17669,13 +17684,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CONST != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -17745,7 +17783,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -17756,7 +17794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -18516,7 +18554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -18530,30 +18568,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -18639,7 +18684,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -18653,7 +18698,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -18661,9 +18711,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -18671,12 +18721,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -19072,7 +19126,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19248,7 +19302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19424,7 +19478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19600,7 +19654,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19722,7 +19776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19813,7 +19867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19905,7 +19959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -19997,7 +20051,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20071,7 +20125,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20099,7 +20153,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CONST_RETVAL_U ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -20183,7 +20237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -20210,7 +20264,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20221,7 +20275,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -20307,7 +20363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -20334,7 +20390,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -20345,7 +20401,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -21036,7 +21094,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21064,7 +21122,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_TMP_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21264,7 +21322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_UNU ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21292,7 +21350,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_VAR_RETVAL_USE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -21323,7 +21381,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -21516,13 +21574,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_UNUSED != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -21909,7 +21990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22000,7 +22081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22092,7 +22173,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22184,7 +22265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -22839,7 +22920,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -22847,19 +22933,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -22912,13 +23000,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CV != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -22988,7 +23099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22999,7 +23110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -23759,7 +23870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -23773,30 +23884,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -23882,7 +24000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -23896,7 +24014,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -23904,9 +24027,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -23914,12 +24037,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -24315,7 +24442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24491,7 +24618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24667,7 +24794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24843,7 +24970,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -24965,7 +25092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25056,7 +25183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25148,7 +25275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25240,7 +25367,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25314,7 +25441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25342,7 +25469,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_VAR_CV_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25373,7 +25500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -25471,7 +25598,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -25498,7 +25625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25509,7 +25636,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -25595,7 +25724,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -25622,7 +25751,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25633,7 +25762,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -26238,7 +26369,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26246,19 +26382,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -26311,13 +26449,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -26388,7 +26549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -26399,7 +26560,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_V zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -27160,7 +27321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -27174,30 +27335,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -27284,7 +27452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -27298,7 +27466,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -27306,9 +27479,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -27316,12 +27489,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -27719,7 +27896,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -27895,7 +28072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28071,7 +28248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28247,7 +28424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28369,7 +28546,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28460,7 +28637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28552,7 +28729,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28644,7 +28821,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28774,7 +28951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -28801,7 +28978,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28812,7 +28989,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -28898,7 +29077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -28925,7 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28936,7 +29115,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -29586,7 +29767,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -29594,19 +29780,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -29911,7 +30099,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -29925,30 +30113,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -30034,7 +30229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -30048,7 +30243,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -30056,9 +30256,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -30066,12 +30266,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -30448,7 +30652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30624,7 +30828,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30800,7 +31004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -30976,7 +31180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -31137,7 +31341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -31164,7 +31368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31175,7 +31379,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -31260,7 +31466,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -31287,7 +31493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -31298,7 +31504,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -32718,7 +32926,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -32726,19 +32939,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -33043,7 +33258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -33057,30 +33272,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -33166,7 +33388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -33180,7 +33402,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -33188,9 +33415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -33198,12 +33425,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -33580,7 +33811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33756,7 +33987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33932,7 +34163,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34108,7 +34339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -34269,7 +34500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -34296,7 +34527,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34307,7 +34538,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -34392,7 +34625,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -34419,7 +34652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -34430,7 +34663,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -35052,7 +35287,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35060,19 +35300,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -35377,7 +35619,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -35391,30 +35633,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -35501,7 +35750,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -35515,7 +35764,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35523,9 +35777,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -35533,12 +35787,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -35918,7 +36176,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36094,7 +36352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36270,7 +36528,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36446,7 +36704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36607,7 +36865,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -36634,7 +36892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -36645,7 +36903,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -36730,7 +36990,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -36757,7 +37017,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -36768,7 +37028,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -37279,7 +37541,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37290,12 +37552,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37339,7 +37603,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37350,12 +37614,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37399,7 +37665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37410,12 +37676,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37459,7 +37727,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37470,12 +37738,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -37494,7 +37764,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr, *val; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -37515,7 +37785,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37524,7 +37794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -37538,7 +37808,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - void *type = NULL; + zend_reftype type = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(execute_data, opline->op1.var); @@ -37559,7 +37829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -37568,7 +37838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (UNEXPECTED(type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zend_throw_ref_type_error(type, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); @@ -39880,7 +40150,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { @@ -39888,19 +40163,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -39953,13 +40230,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CONST != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -40029,7 +40329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -40040,7 +40340,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -40800,7 +41100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -40814,30 +41114,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -40923,7 +41230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -40937,7 +41244,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CONST == IS_CONST) { @@ -40945,9 +41257,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -40955,12 +41267,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -41628,7 +41944,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -41804,7 +42120,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -41980,7 +42296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42156,7 +42472,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42278,7 +42594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42369,7 +42685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42461,7 +42777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42553,7 +42869,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42627,7 +42943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UN ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42655,7 +42971,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_US ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -42739,7 +43055,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -42766,7 +43082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42777,7 +43093,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -42862,7 +43180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -42889,7 +43207,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -42900,7 +43218,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44169,7 +44489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -44197,7 +44517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_TMP_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -44533,7 +44853,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUS ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -44561,7 +44881,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_USED ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -44592,7 +44912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -44971,13 +45291,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_UNUSED != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -45661,7 +46004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45752,7 +46095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45844,7 +46187,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45936,7 +46279,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -47389,7 +47732,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { @@ -47397,19 +47745,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -47462,13 +47812,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if (IS_CV != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -47538,7 +47911,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -47549,7 +47922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -48309,7 +48682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -48323,30 +48696,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -48432,7 +48812,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -48446,7 +48826,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if (IS_CV == IS_CONST) { @@ -48454,9 +48839,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -48464,12 +48849,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -49000,7 +49389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49176,7 +49565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49352,7 +49741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49528,7 +49917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49650,7 +50039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49741,7 +50130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49833,7 +50222,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49925,7 +50314,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -49999,7 +50388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_UNUSE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(0)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50027,7 +50416,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_CV_RETVAL_USED_ ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(1)) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50058,7 +50447,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( HANDLE_EXCEPTION(); } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); } @@ -50155,7 +50544,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -50182,7 +50571,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50193,7 +50582,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50278,7 +50669,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -50305,7 +50696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -50316,7 +50707,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51912,7 +52305,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + + if (UNEXPECTED(Z_ISREF_P(zptr))) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -51920,19 +52318,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)){ + if (UNEXPECTED(prop_info || ref_type)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); - binary_op(&z_copy, &z_copy, value); - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + binary_op(&z_copy, zptr, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { binary_op(zptr, zptr, value); @@ -51985,13 +52385,36 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP if (UNEXPECTED(!var_ptr)) { goto assign_dim_op_ret_null; } - ZVAL_DEREF(var_ptr); - SEPARATE_ZVAL_NOREF(var_ptr); } value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); - binary_op(var_ptr, var_ptr, value); + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { + zend_reftype type = Z_REFTYPE_P(var_ptr); + var_ptr = Z_REFVAL_P(var_ptr); + if (UNEXPECTED(type)) { + zval tmp; + binary_op(&tmp, var_ptr, value); + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &tmp); + } else { + zend_throw_ref_type_error(type, &tmp); + zval_ptr_dtor(&tmp); + zval_ptr_dtor_nogc(free_op2); + FREE_OP(free_op_data1); + + HANDLE_EXCEPTION(); + } + } else { + binary_op(var_ptr, var_ptr, value); + } + } else { + if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED) { + SEPARATE_ZVAL_NOREF(var_ptr); + } + binary_op(var_ptr, var_ptr, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); @@ -52062,7 +52485,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C } else { void *type = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - type = Z_REF_P(var_ptr)->type; + type = Z_REFTYPE_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -52073,7 +52496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_C zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data)))) { + if (EXPECTED(zend_verify_ref_type_assignable_zval(type, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(&old); } else { zend_throw_ref_type_error(type, var_ptr); @@ -52834,7 +53257,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -52848,30 +53271,37 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; - ZVAL_DUP(&z_copy, zptr); + ZVAL_COPY(&z_copy, zptr); if (inc) { increment_function(&z_copy); } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); - } else { + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, val); + ZVAL_COPY_VALUE(zptr, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { SEPARATE_ZVAL_NOREF(zptr); @@ -52958,7 +53388,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } if (UNEXPECTED(prop_info)) { - zval tmp, *val; + zval tmp, *val; val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { @@ -52972,7 +53402,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } } } else { - ZVAL_DEREF(zptr); + zend_reftype ref_type = NULL; + if (Z_ISREF_P(zptr)) { + ref_type = Z_REFTYPE_P(zptr); + zptr = Z_REFVAL_P(zptr); + } + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -52980,9 +53415,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ - zval z_copy, tmp, *val; + zval z_copy; ZVAL_DUP(&z_copy, zptr); if (inc) { @@ -52990,12 +53425,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP } else { decrement_function(&z_copy); } - val = zend_verify_property_type(prop_info, &z_copy, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - zval_ptr_dtor(&z_copy); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(zptr); + ZVAL_COPY_VALUE(zptr, &z_copy); } else { - ZVAL_COPY_VALUE(zptr, val); + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + } + zval_ptr_dtor(&z_copy); } } else { zval_opt_copy_ctor(zptr); @@ -53529,7 +53968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53705,7 +54144,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -53881,7 +54320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54057,7 +54496,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D } fast_assign_obj: - value = zend_assign_to_variable(property, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(property, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54179,7 +54618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = EX_CONSTANT((opline+1)->op1); - value = zend_assign_to_variable(variable_ptr, value, IS_CONST, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54270,7 +54709,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54362,7 +54801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); - value = zend_assign_to_variable(variable_ptr, value, IS_VAR, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54454,7 +54893,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); - value = zend_assign_to_variable(variable_ptr, value, IS_CV, ZEND_CALL_USES_STRICT_TYPES(execute_data)); + value = zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -54584,7 +55023,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -54611,7 +55050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -54622,7 +55061,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -54707,7 +55148,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ uintptr_t old_type = (uintptr_t) Z_REF_P(value_ptr)->type; zend_bool error = 0; - if (old_type != NULL) { + if (old_type) { if (!(old_type & 0x1)) { type = (void *) (~0x1 & (uintptr_t) type); /* remove allow_null if not allowed on assigned reference */ } @@ -54734,7 +55175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } } - if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, ZEND_CALL_USES_STRICT_TYPES(execute_data))) { + if (!i_zend_verify_ref_type_assignable_zval(type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(type, value_ptr); @@ -54745,7 +55186,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - Z_REF_P(variable_ptr)->type = type; + if (type) { + Z_REF_P(variable_ptr)->type = type; + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { diff --git a/ext/standard/array.c b/ext/standard/array.c index 4e006db8b9859..f3a7f4de84cd9 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -2801,7 +2801,7 @@ PHP_FUNCTION(array_splice) length = 0; int num_in; /* Number of elements in the input array */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lt", &array, &offset, &length, &repl_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a/l|lz/", &array, &offset, &length, &repl_array) == FAILURE) { return; } @@ -2811,6 +2811,11 @@ PHP_FUNCTION(array_splice) length = num_in; } + if (ZEND_NUM_ARGS() == 4) { + /* Make sure the last argument, if passed, is an array */ + convert_to_array_ex(repl_array); + } + /* Don't create the array of removed elements if it's not going * to be used; e.g. only removing and/or replacing elements */ if (USED_RET()) { diff --git a/ext/standard/type.c b/ext/standard/type.c index 0e0c6f506d701..bfc3523b2314f 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -371,10 +371,10 @@ PHP_FUNCTION(is_callable) //??? is it necessary to be consistent with old PHP ("\0" support) if (UNEXPECTED(ZSTR_LEN(name) != strlen(ZSTR_VAL(name)))) { ZEND_TRY_ASSIGN_STRINGL(callable_name, ZSTR_VAL(name), strlen(ZSTR_VAL(name))); - zend_string_release(name); } else { ZEND_TRY_ASSIGN_STR(callable_name, name); } + zend_string_release(name); } else { retval = zend_is_callable_ex(var, NULL, check_flags, NULL, NULL, &error); } From 38583b951aa8e5fcd1dcbc5ee814d44eb6075b56 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 13:59:31 +0100 Subject: [PATCH 212/369] Fix a few more tests --- Zend/zend_vm_def.h | 10 +++++++- Zend/zend_vm_execute.h | 36 ++++++++++++++++++++++++++-- ext/intl/formatter/formatter_parse.c | 16 +++++-------- ext/pcntl/pcntl.c | 8 +++---- ext/standard/dns.c | 2 +- ext/standard/fsock.c | 25 +++++++++---------- ext/xml/xml.c | 2 +- tests/classes/array_access_012.phpt | 2 +- 8 files changed, 67 insertions(+), 34 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index da22df937c759..02034d8b97397 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2778,7 +2778,15 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) value_ptr = GET_OP2_ZVAL_PTR_PTR(BP_VAR_W); variable_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); - if (OP2_TYPE == IS_VAR && + if (OP1_TYPE == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + FREE_OP1_VAR_PTR(); + FREE_OP2_VAR_PTR(); + HANDLE_EXCEPTION(); + } else if (OP2_TYPE == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2e117cc73d5f1..81f1b76452818 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -21373,6 +21373,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLE variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -25491,7 +25499,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->op2.var); variable_ptr = _get_zval_ptr_ptr_var(opline->op1.var, execute_data, &free_op1); - if (IS_CV == IS_VAR && + if (IS_VAR == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -44903,7 +44919,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER value_ptr = _get_zval_ptr_ptr_var(opline->op2.var, execute_data, &free_op2); variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); - if (IS_VAR == IS_VAR && + if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + + if (UNEXPECTED(free_op2)) {zval_ptr_dtor_nogc(free_op2);}; + HANDLE_EXCEPTION(); + } else if (IS_VAR == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); @@ -50439,6 +50463,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER( variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(execute_data, opline->op1.var); if (IS_CV == IS_VAR && + UNEXPECTED(Z_TYPE_P(EX_VAR(opline->op1.var)) != IS_INDIRECT) && + UNEXPECTED(!Z_ISERROR_P(variable_ptr)) && + UNEXPECTED(!Z_ISREF_P(variable_ptr))) { + zend_throw_error(NULL, "Cannot assign by reference to an array dimension of an object"); + + + HANDLE_EXCEPTION(); + } else if (IS_CV == IS_VAR && opline->extended_value == ZEND_RETURNS_FUNCTION && UNEXPECTED(!Z_ISREF_P(value_ptr))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index 9b9705f7b0f83..a1b87a50bfcf9 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -51,7 +51,7 @@ PHP_FUNCTION( numfmt_parse ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|ll!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Os|lz!", &object, NumberFormatter_ce_ptr, &str, &str_len, &type, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -61,7 +61,7 @@ PHP_FUNCTION( numfmt_parse ) } if(zposition) { - position = (int32_t)Z_LVAL_P( zposition ); + position = (int32_t) zval_get_long(zposition); position_p = &position; } @@ -105,8 +105,7 @@ PHP_FUNCTION( numfmt_parse ) efree(oldlocale); #endif if(zposition) { - zval_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { @@ -137,7 +136,7 @@ PHP_FUNCTION( numfmt_parse_currency ) FORMATTER_METHOD_INIT_VARS; /* Parse parameters. */ - if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z/!", + if( zend_parse_method_parameters( ZEND_NUM_ARGS(), getThis(), "Osz/|z!", &object, NumberFormatter_ce_ptr, &str, &str_len, &zcurrency, &zposition ) == FAILURE ) { intl_error_set( NULL, U_ILLEGAL_ARGUMENT_ERROR, @@ -154,16 +153,13 @@ PHP_FUNCTION( numfmt_parse_currency ) INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); if(zposition) { - ZVAL_DEREF(zposition); - convert_to_long(zposition); - position = (int32_t)Z_LVAL_P( zposition ); + position = (int32_t) zend_get_long(zposition); position_p = &position; } number = unum_parseDoubleCurrency(FORMATTER_OBJECT(nfo), sstr, sstr_len, position_p, currency, &INTL_DATA_ERROR_CODE(nfo)); if(zposition) { - zval_dtor(zposition); - ZVAL_LONG(zposition, position); + ZEND_TRY_ASSIGN_LONG(zposition, position); } if (sstr) { efree(sstr); diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index aa77ba4c83883..1db6c1a245a3e 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -656,7 +656,7 @@ PHP_FUNCTION(pcntl_waitpid) struct rusage rusage; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt/", &pid, &z_status, &options, &z_rusage) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lz|lt", &pid, &z_status, &options, &z_rusage) == FAILURE) { return; } @@ -1081,7 +1081,7 @@ PHP_FUNCTION(pcntl_sigprocmask) zval *user_set, *user_oldset = NULL, *user_signo; sigset_t set, oldset; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t/", &how, &user_set, &user_oldset) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "la|t", &how, &user_set, &user_oldset) == FAILURE) { return; } @@ -1137,11 +1137,11 @@ static void pcntl_sigwaitinfo(INTERNAL_FUNCTION_PARAMETERS, int timedwait) /* {{ struct timespec timeout; if (timedwait) { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/ll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|tll", &user_set, &user_siginfo, &tv_sec, &tv_nsec) == FAILURE) { return; } } else { - if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t/", &user_set, &user_siginfo) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "a|t", &user_set, &user_siginfo) == FAILURE) { return; } } diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 1be28bad5c42e..2c7e084572df4 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -1013,7 +1013,7 @@ PHP_FUNCTION(dns_get_mx) struct __res_state *handle = &state; #endif - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st/|t/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } diff --git a/ext/standard/fsock.c b/ext/standard/fsock.c index 561d259d06815..2a16241007740 100644 --- a/ext/standard/fsock.c +++ b/ext/standard/fsock.c @@ -76,15 +76,6 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) #endif tv.tv_usec = conv % 1000000; - if (zerrno) { - zval_dtor(zerrno); - ZVAL_LONG(zerrno, 0); - } - if (zerrstr) { - zval_dtor(zerrstr); - ZVAL_EMPTY_STRING(zerrstr); - } - stream = php_stream_xport_create(hostname, hostname_len, REPORT_ERRORS, STREAM_XPORT_CLIENT | STREAM_XPORT_CONNECT, hashkey, &tv, NULL, &errstr, &err); @@ -103,17 +94,23 @@ static void php_fsockopen_stream(INTERNAL_FUNCTION_PARAMETERS, int persistent) if (zerrno) { ZEND_TRY_ASSIGN_LONG(zerrno, err); } - if (zerrstr && errstr) { - /* no need to dup; we need to efree buf anyway */ - zval_dtor(zerrstr); - ZVAL_STR(zerrstr, errstr); - } else if (!zerrstr && errstr) { + if (errstr) { + if (zerrstr) { + ZEND_TRY_ASSIGN_STR(zerrstr, errstr); + } zend_string_release(errstr); } RETURN_FALSE; } + if (zerrno) { + ZEND_TRY_ASSIGN_LONG(zerrno, 0); + } + if (zerrstr) { + ZEND_TRY_ASSIGN_EMPTY_STRING(zerrstr); + } + if (errstr) { zend_string_release(errstr); } diff --git a/ext/xml/xml.c b/ext/xml/xml.c index ed8d297239203..9566ac5207c0c 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1412,7 +1412,7 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst/|t/", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst|t", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } diff --git a/tests/classes/array_access_012.phpt b/tests/classes/array_access_012.phpt index 1fe0b248658b7..4d7980640167d 100644 --- a/tests/classes/array_access_012.phpt +++ b/tests/classes/array_access_012.phpt @@ -33,7 +33,7 @@ $data['element'] = &$test; Notice: Indirect modification of overloaded element of ArrayAccessImpl has no effect in %sarray_access_012.php on line 24 -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %sarray_access_012.php:24 +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %sarray_access_012.php:24 Stack trace: #0 {main} thrown in %sarray_access_012.php on line 24 From fea2aa8a183928d5caea9168343b2195a7fc4f18 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 18 Nov 2016 15:24:58 +0100 Subject: [PATCH 213/369] typo; s/zend_get_long/zval_get_long/ --- ext/intl/formatter/formatter_parse.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/intl/formatter/formatter_parse.c b/ext/intl/formatter/formatter_parse.c index a1b87a50bfcf9..491680cc20338 100644 --- a/ext/intl/formatter/formatter_parse.c +++ b/ext/intl/formatter/formatter_parse.c @@ -153,7 +153,7 @@ PHP_FUNCTION( numfmt_parse_currency ) INTL_METHOD_CHECK_STATUS( nfo, "String conversion to UTF-16 failed" ); if(zposition) { - position = (int32_t) zend_get_long(zposition); + position = (int32_t) zval_get_long(zposition); position_p = &position; } From d9b964e6c7e6576ff13d8bde4c44ddc000dfd0d6 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 14:26:53 +0100 Subject: [PATCH 214/369] Fix iterator_035.phpt and pcntl/003.phpt --- ext/pcntl/pcntl.c | 18 ++++++------------ ext/spl/tests/iterator_035.phpt | 2 +- 2 files changed, 7 insertions(+), 13 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 1db6c1a245a3e..5a0ea6bb2b54b 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -664,10 +664,8 @@ PHP_FUNCTION(pcntl_waitpid) #ifdef HAVE_WAIT4 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_dtor(z_rusage); - array_init(z_rusage); - } + zval_dtor(z_rusage); + array_init(z_rusage); memset(&rusage, 0, sizeof(struct rusage)); child_id = wait4((pid_t) pid, &status, options, &rusage); @@ -1107,10 +1105,8 @@ PHP_FUNCTION(pcntl_sigprocmask) } if (user_oldset != NULL) { - if (Z_TYPE_P(user_oldset) != IS_ARRAY) { - zval_dtor(user_oldset); - array_init(user_oldset); - } + zval_dtor(user_oldset); + array_init(user_oldset); for (signo = 1; signo < MAX(NSIG-1, SIGRTMAX); ++signo) { if (sigismember(&oldset, signo) != 1) { @@ -1205,10 +1201,8 @@ PHP_FUNCTION(pcntl_sigtimedwait) static void pcntl_siginfo_to_zval(int signo, siginfo_t *siginfo, zval *user_siginfo) /* {{{ */ { if (signo > 0 && user_siginfo) { - if (Z_TYPE_P(user_siginfo) != IS_ARRAY) { - zval_dtor(user_siginfo); - array_init(user_siginfo); - } + zval_dtor(user_siginfo); + array_init(user_siginfo); add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); diff --git a/ext/spl/tests/iterator_035.phpt b/ext/spl/tests/iterator_035.phpt index 307337431ab51..37cba36a67e8a 100644 --- a/ext/spl/tests/iterator_035.phpt +++ b/ext/spl/tests/iterator_035.phpt @@ -14,7 +14,7 @@ echo "Done\n"; --EXPECTF-- Notice: Indirect modification of overloaded element of ArrayIterator has no effect in %s on line %d -Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Fatal error: Uncaught Error: Cannot assign by reference to an array dimension of an object in %s:%d Stack trace: #0 {main} thrown in %s on line %d From 0cc95b84d5d31f33ee5080116dca0f81d501cdac Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 14:45:02 +0100 Subject: [PATCH 215/369] Remove lchown($file, -5); test Some operating systems choose to return EINVAL for users (and groups) out of range (e.g. user ids must not be negative) instead of EPERM. This thus cannot be deterministically tested for all systems - and we are anyway already testing the branch with errno with the inexistent filename (ENOENT) - thus no problem removing it. --- ext/standard/tests/file/lchown_error.phpt | 6 ------ 1 file changed, 6 deletions(-) diff --git a/ext/standard/tests/file/lchown_error.phpt b/ext/standard/tests/file/lchown_error.phpt index 8632495b3979e..aabf661793ff5 100644 --- a/ext/standard/tests/file/lchown_error.phpt +++ b/ext/standard/tests/file/lchown_error.phpt @@ -43,9 +43,6 @@ var_dump( lchown( 'foobar_lchown.txt', $uid ) ); var_dump( lchown( new StdClass(), $uid ) ); var_dump( lchown( array(), $uid ) ); -// Bad user -var_dump( lchown( $filename, -5 ) ); - ?> ===DONE=== --CLEAN-- @@ -72,7 +69,4 @@ bool(true) Warning: lchown() expects parameter 1 to be a valid path, array given in %s on line %d bool(true) - -Warning: lchown(): %r(Operation not permitted|Invalid argument)%r in %s on line %d -bool(false) ===DONE=== From d5b3bd8bdbe578c06b4f975fc9edce38bc7e6257 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 19 Nov 2016 18:23:33 +0100 Subject: [PATCH 216/369] Add support for by-ref foreach --- .../typed_properties_012.phpt | 19 ++-- .../typed_properties_045.phpt | 29 ++++-- Zend/zend_vm_def.h | 35 +++----- Zend/zend_vm_execute.h | 89 +++---------------- 4 files changed, 52 insertions(+), 120 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_012.phpt b/Zend/tests/type_declarations/typed_properties_012.phpt index 185dc3e961469..79a77cfa40dc0 100644 --- a/Zend/tests/type_declarations/typed_properties_012.phpt +++ b/Zend/tests/type_declarations/typed_properties_012.phpt @@ -1,5 +1,5 @@ --TEST-- -Test typed properties disallow fetch reference for foreach +Test typed properties allow fetch reference for foreach --FILE-- ---EXPECTF-- -Fatal error: Uncaught TypeError: Typed properties exist in Foo: foreach by reference is disallowed in %s:7 -Stack trace: -#0 {main} - thrown in %s on line 7 - - +--EXPECT-- +object(Foo)#1 (1) { + ["bar"]=> + &int(2) +} diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 6218564bf88b3..a70eaf198ae85 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -1,15 +1,30 @@ --TEST-- -foreach() leaks on object with typed properties +foreach() must return properly typed references --FILE-- getMessage() . "\n"; +foreach ($foo = new Foo as $k => &$val) { + var_dump($val); + + $val = 20; + var_dump($foo->$k); + + try { + $val = []; + var_dump($foo->$k); + } catch (Throwable $e) { + echo $e->getMessage(), "\n"; + } } +?> --EXPECT-- -Typed properties exist in Foo: foreach by reference is disallowed +int(0) +int(20) +Cannot assign array to reference of type integer +float(0.5) +float(20) +Cannot assign array to reference of type float diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 02034d8b97397..db0aa7c7a50e7 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6315,20 +6315,6 @@ ZEND_VM_HANDLER(125, ZEND_FE_RESET_RW, CONST|TMP|VAR|CV, JMP_ADDR) FREE_OP1_VAR_PTR(); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (OP1_TYPE != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -ZEND_VM_C_LABEL(fe_reset_rw_typed): - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (OP1_TYPE == IS_VAR) { - FREE_OP1_VAR_PTR(); - } else { - FREE_OP1(); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (OP1_TYPE == IS_VAR || OP1_TYPE == IS_CV) { if (array_ptr == array_ref) { @@ -6375,10 +6361,6 @@ ZEND_VM_C_LABEL(fe_reset_rw_typed): zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - ZEND_VM_C_GOTO(fe_reset_rw_typed); - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -6706,18 +6688,21 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) } else if (UNEXPECTED(value_type == IS_INDIRECT)) { value = Z_INDIRECT_P(value); value_type = Z_TYPE_INFO_P(value); - if (UNEXPECTED(value_type == IS_UNDEF)) { + if (UNEXPECTED(value_type == IS_UNDEF) || UNEXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) != SUCCESS)) { pos++; p++; continue; } + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + value_type = IS_REFERENCE_EX; + } + } } - if (UNEXPECTED(!p->key) || - EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) { - break; - } - pos++; - p++; + break; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 81f1b76452818..cd8869291500e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -3665,20 +3665,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CONST != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CONST == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CONST == IS_VAR || IS_CONST == IS_CV) { if (array_ptr == array_ref) { @@ -3724,10 +3710,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CONST_HANDLER zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -12994,20 +12976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_TMP_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_TMP_VAR == IS_VAR) { - - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_TMP_VAR == IS_VAR || IS_TMP_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -13053,10 +13021,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_TMP_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -16693,20 +16657,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_VAR != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_VAR == IS_VAR) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - } else { - zval_ptr_dtor_nogc(free_op1); - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_VAR == IS_VAR || IS_VAR == IS_CV) { if (array_ptr == array_ref) { @@ -16753,10 +16703,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_VAR_HANDLER(Z zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { @@ -17084,18 +17030,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z } else if (UNEXPECTED(value_type == IS_INDIRECT)) { value = Z_INDIRECT_P(value); value_type = Z_TYPE_INFO_P(value); - if (UNEXPECTED(value_type == IS_UNDEF)) { + if (UNEXPECTED(value_type == IS_UNDEF) || UNEXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) != SUCCESS)) { pos++; p++; continue; } + if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { + zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); + if (UNEXPECTED(prop_info)) { + ZVAL_NEW_REF(value, value); + Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + value_type = IS_REFERENCE_EX; + } + } } - if (UNEXPECTED(!p->key) || - EXPECTED(zend_check_property_access(Z_OBJ_P(array), p->key) == SUCCESS)) { - break; - } - pos++; - p++; + break; } if (opline->result_type & (IS_TMP_VAR|IS_CV)) { if (UNEXPECTED(!p->key)) { @@ -38896,20 +38845,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } else if (IS_CV != IS_CONST && EXPECTED(Z_TYPE_P(array_ptr) == IS_OBJECT)) { - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(Z_OBJCE_P(array_ptr)))) { -fe_reset_rw_typed: - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Typed properties exist in %s: foreach by reference is disallowed", - ZSTR_VAL(Z_OBJCE_P(array_ptr)->name)); - if (IS_CV == IS_VAR) { - - } else { - - } - HANDLE_EXCEPTION(); - } - if (!Z_OBJCE_P(array_ptr)->get_iterator) { if (IS_CV == IS_VAR || IS_CV == IS_CV) { if (array_ptr == array_ref) { @@ -38955,10 +38890,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_RESET_RW_SPEC_CV_HANDLER(ZE zend_object_iterator *iter; zend_bool is_empty; - if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(ce))) { - goto fe_reset_rw_typed; - } - iter = ce->get_iterator(ce, array_ptr, 1); if (UNEXPECTED(!iter) || UNEXPECTED(EG(exception))) { From 0bf02dccfbd3186b37cbc0ea95cd148f751bdeac Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 1 Dec 2016 17:20:46 +0100 Subject: [PATCH 217/369] Separate static property assignment out into dedicated assign ops --- Zend/zend_compile.c | 25 +- Zend/zend_execute.c | 76 + Zend/zend_vm_def.h | 190 +- Zend/zend_vm_execute.h | 4496 +++++++++++++++++----- Zend/zend_vm_gen.php | 16 +- Zend/zend_vm_opcodes.c | 28 +- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/compact_literals.c | 5 + ext/opcache/Optimizer/zend_dump.c | 2 + ext/opcache/Optimizer/zend_optimizer.c | 20 + 10 files changed, 3812 insertions(+), 1047 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3fe46292f2d36..5065590982867 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2958,13 +2958,22 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ switch (var_ast->kind) { case ZEND_AST_VAR: - case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); zend_delayed_compile_var(&var_node, var_ast, BP_VAR_W); zend_compile_expr(&expr_node, expr_ast); zend_delayed_compile_end(offset); zend_emit_op(result, ZEND_ASSIGN, &var_node, &expr_node); return; + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(result, var_ast, BP_VAR_W); + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_delayed_compile_end(offset); + opline->opcode = ZEND_ASSIGN_STATIC_PROP; + + zend_emit_op_data(&expr_node); + return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); zend_delayed_compile_dim(result, var_ast, BP_VAR_W); @@ -3073,13 +3082,23 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ switch (var_ast->kind) { case ZEND_AST_VAR: - case ZEND_AST_STATIC_PROP: offset = zend_delayed_compile_begin(); zend_delayed_compile_var(&var_node, var_ast, BP_VAR_RW); zend_compile_expr(&expr_node, expr_ast); zend_delayed_compile_end(offset); zend_emit_op(result, opcode, &var_node, &expr_node); return; + case ZEND_AST_STATIC_PROP: + offset = zend_delayed_compile_begin(); + zend_delayed_compile_var(result, var_ast, BP_VAR_RW); + zend_compile_expr(&expr_node, expr_ast); + + opline = zend_delayed_compile_end(offset); + opline->opcode = opcode; + opline->extended_value = ZEND_ASSIGN_STATIC_PROP; + + zend_emit_op_data(&expr_node); + return; case ZEND_AST_DIM: offset = zend_delayed_compile_begin(); zend_delayed_compile_dim(result, var_ast, BP_VAR_RW); @@ -3089,7 +3108,7 @@ void zend_compile_compound_assign(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = opcode; opline->extended_value = ZEND_ASSIGN_DIM; - opline = zend_emit_op_data(&expr_node); + zend_emit_op_data(&expr_node); return; case ZEND_AST_PROP: offset = zend_delayed_compile_begin(); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a2df1ef0485e3..ea3330e4bdbda 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2005,6 +2005,82 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } +static zend_always_inline zval *zend_fetch_static_prop_address(zend_execute_data *execute_data, zval *varname, uint32_t varname_op_type, const znode_op *class, uint32_t class_op_type, void **polymorphic_cache_slot, void **ce_cache_slot) +{ + zval *retval; + zend_string *name; + zend_class_entry *ce; + + if (varname_op_type == IS_CONST) { + name = Z_STR_P(varname); + } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { + name = Z_STR_P(varname); + zend_string_addref(name); + } else { + if (varname_op_type == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { + zval_undefined_cv(EX(opline)->op1.var, execute_data); + } + name = zval_get_string(varname); + } + + if (class_op_type == IS_CONST) { + if (polymorphic_cache_slot && EXPECTED((ce = CACHED_PTR_EX(polymorphic_cache_slot)) != NULL)) { + retval = CACHED_PTR_EX(polymorphic_cache_slot + 1); + /* check if static properties were destoyed */ + if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { + zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + return NULL; + } else { + return retval; + } + } else if (ce_cache_slot && UNEXPECTED((ce = CACHED_PTR_EX(ce_cache_slot)) == NULL)) { + ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(*class)), EX_CONSTANT(*class) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); + if (UNEXPECTED(ce == NULL)) { + ZEND_ASSERT(EG(exception)); + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + return NULL; + } + CACHE_PTR_EX(ce_cache_slot, ce); + } + } else { + if (class_op_type == IS_UNUSED) { + ce = zend_fetch_class(NULL, class->num); + if (UNEXPECTED(ce == NULL)) { + ZEND_ASSERT(EG(exception)); + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + return NULL; + } + } else { + ce = Z_CE_P(EX_VAR(class->var)); + } + if (varname_op_type == IS_CONST && (retval = CACHED_POLYMORPHIC_PTR_EX(polymorphic_cache_slot, ce)) != NULL) { + /* check if static properties were destoyed */ + if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { + zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + return NULL; + } else { + return retval; + } + } + } + + retval = zend_std_get_static_property(ce, name, 0); + + if (varname_op_type != IS_CONST) { + zend_string_release(name); + } + + if (retval && polymorphic_cache_slot) { + CACHE_POLYMORPHIC_PTR_EX(polymorphic_cache_slot, ce, retval); + } + + return retval; +} + #if ZEND_INTENSIVE_DEBUGGING #define CHECK_SYMBOL_TABLES() \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b73f2e512437d..208361c7e94ed 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -824,6 +824,42 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSED|CONST|TMPVAR, binary_op_type binary_op) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); + + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + FREE_OP1(); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + FREE_OP1(); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HELPER(zend_binary_assign_op_dim_helper, VAR|CV, CONST|TMPVAR|UNUSED|CV, binary_op_type binary_op) { USE_OPLINE @@ -945,10 +981,18 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op) +ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(DIM_OBJ), binary_op_type binary_op) { -#if defined(ZEND_VM_SPEC) && OP2_TYPE == IS_UNUSED - ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); +#if defined(ZEND_VM_SPEC) && (OP1_TYPE == IS_CONST || OP1_TYPE == IS_TMP_VAR) + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); +#elif defined(ZEND_VM_SPEC) && (OP2_TYPE == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); + } + + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); #else # if !defined(ZEND_VM_SPEC) || OP1_TYPE != IS_UNUSED USE_OPLINE @@ -959,68 +1003,73 @@ ZEND_VM_INLINE_HELPER(zend_binary_assign_op_helper, VAR|UNUSED|THIS|CV, CONST|TM if (EXPECTED(opline->extended_value == ZEND_ASSIGN_DIM)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_dim_helper, binary_op, binary_op); } +# if !defined(ZEND_VM_SPEC) || OP2_TYPE == IS_CONST || OP2_TYPE == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(opline->extended_value == ZEND_ASSIGN_STATIC_PROP)) { + ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_static_prop_helper, binary_op, binary_op); + } +# endif # endif ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_obj_helper, binary_op, binary_op); #endif } -ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(23, ZEND_ASSIGN_ADD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, add_function); } -ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(24, ZEND_ASSIGN_SUB, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, sub_function); } -ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(25, ZEND_ASSIGN_MUL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mul_function); } -ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(26, ZEND_ASSIGN_DIV, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, div_function); } -ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(27, ZEND_ASSIGN_MOD, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, mod_function); } -ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(28, ZEND_ASSIGN_SL, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_left_function); } -ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(29, ZEND_ASSIGN_SR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, shift_right_function); } -ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(30, ZEND_ASSIGN_CONCAT, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, concat_function); } -ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(31, ZEND_ASSIGN_BW_OR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_or_function); } -ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(32, ZEND_ASSIGN_BW_AND, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_and_function); } -ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(33, ZEND_ASSIGN_BW_XOR, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, bitwise_xor_function); } -ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) +ZEND_VM_HANDLER(167, ZEND_ASSIGN_POW, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|UNUSED|NEXT|CV, DIM_OBJ, SPEC(DIM_OBJ)) { ZEND_VM_DISPATCH_TO_HELPER(zend_binary_assign_op_helper, binary_op, pow_function); } @@ -1520,95 +1569,19 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); - if (OP1_TYPE == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (OP1_TYPE == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (OP2_TYPE == IS_CONST) { - if (OP1_TYPE == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - FREE_OP1(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_C_GOTO(fetch_static_prop_return); - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - FREE_OP1(); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (OP2_TYPE == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - FREE_OP1(); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (OP1_TYPE == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - FREE_OP1(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_C_GOTO(fetch_static_prop_return); - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } FREE_OP1(); HANDLE_EXCEPTION(); } - if (OP1_TYPE == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - + FREE_OP1(); - if (OP1_TYPE != IS_CONST) { - zend_string_release(name); - } - -ZEND_VM_C_LABEL(fetch_static_prop_return): if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -2224,6 +2197,36 @@ ZEND_VM_C_LABEL(exit_assign_obj): ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(185, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SPEC(OP_DATA=CONST|TMP|VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = GET_OP1_ZVAL_PTR_UNDEF(BP_VAR_R); + + retval = zend_fetch_static_prop_address(execute_data, varname, OP1_TYPE, &opline->op2, OP2_TYPE, (OP1_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + FREE_OP1(); + FREE_UNFETCHED_OP_DATA(); + HANDLE_EXCEPTION(); + } + + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + value = zend_assign_to_variable(retval, value, OP_DATA_TYPE); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP1(); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC(OP_DATA=CONST|TMP|VAR|CV)) { USE_OPLINE @@ -2278,7 +2281,6 @@ ZEND_VM_C_LABEL(try_assign_dim_array): if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - FREE_OP_DATA(); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (OP2_TYPE == IS_UNUSED) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6850ec3d6e3e2..15c380b483595 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4817,99 +4817,152 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_CONST_HAND ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { - USE_OPLINE + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + USE_OPLINE + zend_free_op free_op_data1; zval *varname; - zval *retval; - zend_string *name; - zend_class_entry *ce; + zval *retval, *value; SAVE_OPLINE(); varname = EX_CONSTANT(opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } + FREE_OP(free_op_data1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } - HANDLE_EXCEPTION(); - } + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE - goto fetch_static_prop_return; - } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } - retval = zend_std_get_static_property(ce, name, 0); +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + + zval *varname; + zval *retval; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -5235,6 +5288,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_CONST_CONST_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_CONST, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6676,93 +6845,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = EX_CONSTANT(opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -6807,6 +6900,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CONS ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CONST_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_VAR, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -7082,6 +7291,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(Z ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -7248,93 +7586,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = EX_CONSTANT(opline->op1); - if (IS_CONST == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CONST == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if (IS_CONST == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CONST == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CONST == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CONST != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -7416,6 +7678,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, IS_UNUSED, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10838,6 +11216,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CONST_TMPVAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = EX_CONSTANT(opline->op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CONST, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CONST == IS_CONST || IS_CONST == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CONST != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CONST_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_R_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -13363,6 +13870,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_TMP_CONS ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, IS_CONST, (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14198,6 +14834,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, IS_UNUSED, (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15112,6 +15877,135 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_LEXICAL_SPEC_TMP_CV_HANDL ZEND_VM_NEXT_OPCODE(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_TMP_VAR, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_TMP_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_TMP_VAR == IS_CONST || IS_TMP_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_TMP_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_TMP_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_TMP_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_TMP_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17428,6 +18322,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, IS_CONST, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -17549,8 +18479,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17561,6 +18499,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17569,8 +18512,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17581,6 +18532,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17589,8 +18545,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -17601,6 +18565,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17622,6 +18624,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17637,6 +18644,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17652,6 +18664,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17667,6 +18684,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17682,6 +18704,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17697,6 +18724,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17712,6 +18744,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17727,6 +18764,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17742,6 +18784,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17757,6 +18804,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17772,6 +18824,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -17787,6 +18844,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -18988,7 +20050,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -19080,7 +20141,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -20402,6 +21462,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEN ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, IS_UNUSED, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -20493,8 +21589,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -20505,6 +21609,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -20516,61 +21658,121 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_W_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -20789,7 +21991,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -20881,7 +22082,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -21746,8 +22946,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21758,6 +22966,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -21766,8 +22979,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21778,6 +22999,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -21786,8 +23012,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -21798,6 +23032,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -23185,7 +24424,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -23277,7 +24515,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -24126,6 +25363,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op1, free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_VAR, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + zval_ptr_dtor_nogc(free_op1); + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24249,8 +25522,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24261,6 +25542,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24269,8 +25555,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24281,6 +25575,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24289,8 +25588,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_VAR != IS_UNUSED USE_OPLINE @@ -24301,6 +25608,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_VAR == IS_CONST || IS_VAR == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_VAR != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24322,6 +25667,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24337,6 +25687,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24352,6 +25707,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24367,6 +25727,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24382,6 +25747,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24397,6 +25767,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24412,6 +25787,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24427,6 +25807,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24442,6 +25827,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24457,6 +25847,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24472,6 +25867,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -24487,6 +25887,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_VAR_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_VAR_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -25691,7 +27096,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -25783,7 +27187,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -26568,8 +27971,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -26580,6 +27991,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -29110,8 +30526,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -29122,6 +30546,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -30854,8 +32283,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_UNUSED_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_UNUSED == IS_CONST || IS_UNUSED == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_UNUSED != IS_UNUSED USE_OPLINE @@ -30866,6 +32303,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -34947,6 +36389,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -35068,8 +36546,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35080,6 +36566,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35088,8 +36579,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35100,6 +36599,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35108,8 +36612,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CONST == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -35120,6 +36632,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CONST == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_CONST == IS_CONST || IS_CONST == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35141,6 +36691,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35156,6 +36711,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35171,6 +36731,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35186,6 +36751,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35201,6 +36771,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35216,6 +36791,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35231,6 +36811,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HA ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35246,6 +36831,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35261,6 +36851,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35276,6 +36871,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35291,6 +36891,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -35306,6 +36911,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -35463,93 +37073,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_CONST == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -36634,6 +38168,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_CONST, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -36779,7 +38429,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -36871,7 +38520,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CONST == IS_UNUSED) { @@ -38527,93 +40175,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -38658,6 +40230,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_CV_V ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_CV_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_VAR, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SPEC_CV_VAR_RETVAL_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -39092,6 +40780,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -39183,8 +40907,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_UNUSED == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -39195,6 +40927,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_UNUSED == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || IS_UNUSED == IS_CONST || IS_UNUSED == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_UNUSED(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -39206,61 +40976,121 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_DIM(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -39427,93 +41257,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); - if (IS_CV == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if (IS_CV == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if (IS_CV == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } - - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if (IS_CV == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if (IS_CV != IS_CONST) { - zend_string_release(name); - } HANDLE_EXCEPTION(); } - if (IS_CV == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } - - if (IS_CV != IS_CONST) { - zend_string_release(name); - } -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -39631,6 +41385,122 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_DIM_FUNC_ARG_SPEC_CV_UNU ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, IS_UNUSED, (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -39776,7 +41646,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -39868,7 +41737,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_UNUSED == IS_UNUSED) { @@ -41531,8 +43399,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41543,6 +43419,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -41551,8 +43432,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41563,6 +43452,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -41571,8 +43465,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_CV_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && IS_CV == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && (IS_CV == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -41583,6 +43485,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || IS_CV == IS_CONST || IS_CV == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -43105,7 +45012,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -43197,7 +45103,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if (IS_CV == IS_UNUSED) { @@ -45037,6 +46942,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ + /* This helper actually never will receive IS_VAR as second op, and has the same handling for VAR and TMP in the first op, but for interoperability with the other binary_assign_op helpers, it is necessary to "include" it */ + + USE_OPLINE + zend_free_op free_op_data1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_cv_undef(execute_data, opline->op1.var); + + retval = zend_fetch_static_prop_address(execute_data, varname, IS_CV, &opline->op2, (IS_TMP_VAR|IS_VAR), (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); + HANDLE_EXCEPTION(); + } + + ZVAL_DEREF(retval); + SEPARATE_ZVAL_NOREF(retval); + + value = get_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data1); + binary_op(retval, retval, value); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + FREE_OP(free_op_data1); + + /* assign_obj has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -45160,8 +47101,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45172,6 +47121,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45180,8 +47134,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_DIM(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45192,6 +47154,11 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(1)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45200,8 +47167,16 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { -#if 1 && (IS_TMP_VAR|IS_VAR) == IS_UNUSED - ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); #else # if 0 || IS_CV != IS_UNUSED USE_OPLINE @@ -45212,6 +47187,44 @@ static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_S if (EXPECTED(0)) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif +# endif + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#endif +} + +static zend_always_inline ZEND_OPCODE_HANDLER_RET zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) +{ +#if 1 && (IS_CV == IS_CONST || IS_CV == IS_TMP_VAR) + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#elif 1 && ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +#else +# if 0 || IS_CV != IS_UNUSED + USE_OPLINE + + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_simple_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } + if (EXPECTED(0)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_dim_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# if 0 || (IS_TMP_VAR|IS_VAR) == IS_CONST || (IS_TMP_VAR|IS_VAR) == (IS_TMP_VAR|IS_VAR) + if (UNEXPECTED(1)) { + ZEND_VM_TAIL_CALL(zend_binary_assign_op_static_prop_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); + } +# endif # endif ZEND_VM_TAIL_CALL(zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45233,6 +47246,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(add_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45248,6 +47266,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(sub_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45263,6 +47286,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mul_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45278,6 +47306,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(div_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45293,6 +47326,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(mod_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45308,6 +47346,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_left_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45323,6 +47366,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_H ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(shift_right_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45338,6 +47386,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(concat_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45353,6 +47406,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OB ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_or_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45368,6 +47426,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_and_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45383,6 +47446,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_O ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(bitwise_xor_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); @@ -45398,6 +47466,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_ ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_OBJ(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_TMPVAR_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPEC_CV_TMPVAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -46738,7 +48811,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -46830,7 +48902,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } - zval_ptr_dtor_nogc(free_op_data); } else if (EXPECTED(Z_TYPE_P(object_ptr) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_UNUSED) { @@ -48896,95 +50967,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_CONST == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_CONST == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -49164,6 +51159,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_LIST_SPEC_TMPVAR_CONST_H ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_CONST, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -49845,95 +51960,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_VAR == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_VAR == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -49978,6 +52017,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_VAR, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_VAR == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -50333,95 +52492,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ zend_free_op free_op1; zval *varname; zval *retval; - zend_string *name; - zend_class_entry *ce; SAVE_OPLINE(); varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - name = Z_STR_P(varname); - } else if (EXPECTED(Z_TYPE_P(varname) == IS_STRING)) { - name = Z_STR_P(varname); - zend_string_addref(name); - } else { - if ((IS_TMP_VAR|IS_VAR) == IS_CV && UNEXPECTED(Z_TYPE_P(varname) == IS_UNDEF)) { - GET_OP1_UNDEF_CV(varname, BP_VAR_R); - } - name = zval_get_string(varname); - } - - if (IS_UNUSED == IS_CONST) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && EXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) != NULL)) { - retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + sizeof(void*)); - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } else if (UNEXPECTED((ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)))) == NULL)) { - ce = zend_fetch_class_by_name(Z_STR_P(EX_CONSTANT(opline->op2)), EX_CONSTANT(opline->op2) + 1, ZEND_FETCH_CLASS_DEFAULT | ZEND_FETCH_CLASS_EXCEPTION); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - CACHE_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2)), ce); - } - } else { - if (IS_UNUSED == IS_UNUSED) { - ce = zend_fetch_class(NULL, opline->op2.num); - if (UNEXPECTED(ce == NULL)) { - ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - } else { - ce = Z_CE_P(EX_VAR(opline->op2.var)); - } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && - (retval = CACHED_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce)) != NULL) { - - /* check if static properties were destoyed */ - if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { - zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); - zval_ptr_dtor_nogc(free_op1); - HANDLE_EXCEPTION(); - } - - goto fetch_static_prop_return; - } - } - retval = zend_std_get_static_property(ce, name, 0); + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); if (UNEXPECTED(retval == NULL)) { ZEND_ASSERT(EG(exception)); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } zval_ptr_dtor_nogc(free_op1); HANDLE_EXCEPTION(); } - if ((IS_TMP_VAR|IS_VAR) == IS_CONST && retval) { - CACHE_POLYMORPHIC_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)), ce, retval); - } zval_ptr_dtor_nogc(free_op1); - if ((IS_TMP_VAR|IS_VAR) != IS_CONST) { - zend_string_release(name); - } - -fetch_static_prop_return: if (type == BP_VAR_R || type == BP_VAR_IS) { ZVAL_COPY_UNREF(EX_VAR(opline->result.var), retval); } else { @@ -50466,6 +52549,126 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_STATIC_PROP_IS_SPEC_TMPV ZEND_VM_TAIL_CALL(zend_fetch_static_prop_helper_SPEC_TMPVAR_UNUSED(BP_VAR_IS ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = EX_CONSTANT((opline+1)->op1); + value = zend_assign_to_variable(retval, value, IS_CONST); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_tmp((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_TMP_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1, free_op_data; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value = zend_assign_to_variable(retval, value, IS_VAR); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op1; + zval *varname; + zval *retval, *value; + + SAVE_OPLINE(); + varname = _get_zval_ptr_var(opline->op1.var, execute_data, &free_op1); + + retval = zend_fetch_static_prop_address(execute_data, varname, (IS_TMP_VAR|IS_VAR), &opline->op2, IS_UNUSED, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(varname)) : NULL, (IS_UNUSED == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op2))) : NULL); + if (UNEXPECTED(retval == NULL)) { + ZEND_ASSERT(EG(exception)); + zval_ptr_dtor_nogc(free_op1); + + HANDLE_EXCEPTION(); + } + + value = _get_zval_ptr_cv_BP_VAR_R(execute_data, (opline+1)->op1.var); + value = zend_assign_to_variable(retval, value, IS_CV); + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), value); + } + + zval_ptr_dtor_nogc(free_op1); + /* assign_static_prop has two opcodes! */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -54736,13 +56939,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54750,15 +56959,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54766,45 +56979,59 @@ void zend_init_opcodes_handlers(void) ZEND_ASSIGN_ADD_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_ADD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_ADD_SPEC_CV_CV_OBJ_HANDLER, @@ -54812,13 +57039,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54826,60 +57059,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SUB_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SUB_SPEC_CV_CV_OBJ_HANDLER, @@ -54887,13 +57139,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54901,60 +57159,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MUL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MUL_SPEC_CV_CV_OBJ_HANDLER, @@ -54962,13 +57239,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -54976,60 +57259,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_DIV_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_DIV_SPEC_CV_CV_OBJ_HANDLER, @@ -55037,13 +57339,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55051,60 +57359,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_MOD_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_MOD_SPEC_CV_CV_OBJ_HANDLER, @@ -55112,14 +57439,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55127,59 +57459,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SL_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SL_SPEC_CV_CV_OBJ_HANDLER, @@ -55187,14 +57539,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55202,59 +57559,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_SR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_SR_SPEC_CV_CV_OBJ_HANDLER, @@ -55262,14 +57639,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55277,59 +57659,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_CONCAT_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_CONCAT_SPEC_CV_CV_OBJ_HANDLER, @@ -55337,14 +57739,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55352,59 +57759,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_OR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_OR_SPEC_CV_CV_OBJ_HANDLER, @@ -55412,14 +57839,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55427,59 +57859,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_AND_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_AND_SPEC_CV_CV_OBJ_HANDLER, @@ -55487,14 +57939,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_CONST_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -55502,59 +57959,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_BW_XOR_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_BW_XOR_SPEC_CV_CV_OBJ_HANDLER, @@ -55562,6 +58039,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED_HANDLER, ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_HANDLER, ZEND_NULL_HANDLER, @@ -57435,15 +59913,19 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -57451,59 +59933,79 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_CONST_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_TMP_UNUSED_STATIC_PROP_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CONST_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CONST_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CONST_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_VAR_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_VAR_CV_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CONST_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_TMPVAR_OBJ_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_UNUSED_CV_OBJ_HANDLER, + ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CONST_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_CONST_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_OBJ_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_TMPVAR_STATIC_PROP_HANDLER, ZEND_NULL_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_UNUSED_DIM_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_DIM_HANDLER, ZEND_ASSIGN_POW_SPEC_CV_CV_OBJ_HANDLER, @@ -57527,6 +60029,7 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_BIND_GLOBAL_SPEC_CV_CONST_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -57868,6 +60371,131 @@ void zend_init_opcodes_handlers(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR_OP_DATA_CV_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CONST_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -58885,73 +61513,62 @@ void zend_init_opcodes_handlers(void) 461 | SPEC_RULE_OP1, 466 | SPEC_RULE_OP1, 471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 546 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 621 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 696 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 571 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 671 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 771 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 846 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 921 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 996 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 871 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 971 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, 1071 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1146 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1221 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 1296 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1306 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, - 1316 | SPEC_RULE_OP1, - 1321 | SPEC_RULE_OP1, - 1326 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, - 1376 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1401 | SPEC_RULE_OP1, - 1406, - 1407, - 1408 | SPEC_RULE_OP1, - 1413 | SPEC_RULE_OP1, - 1418 | SPEC_RULE_OP1, - 1423 | SPEC_RULE_OP1, - 1428 | SPEC_RULE_OP1, - 1433 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1458 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1483 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1493 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1518 | SPEC_RULE_OP1, - 1523 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1573 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1598 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1623, - 1624 | SPEC_RULE_OP1, - 1629 | SPEC_RULE_OP2, - 1634 | SPEC_RULE_RETVAL, - 1636 | SPEC_RULE_OP2, - 1641 | SPEC_RULE_OP1, - 1646, - 1647 | SPEC_RULE_OP2, - 1652 | SPEC_RULE_OP1, - 1657 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 1667 | SPEC_RULE_OP1, - 1672 | SPEC_RULE_OP1, - 1677 | SPEC_RULE_OP2, - 1682 | SPEC_RULE_OP1, - 1687 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1712 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1737 | SPEC_RULE_OP1, - 1742 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1767 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1792 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1817 | SPEC_RULE_OP1, - 1822 | SPEC_RULE_OP1, - 1827 | SPEC_RULE_OP1, - 1832 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1857 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1882 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1907 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1932 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1957 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 1982 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2007 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2032 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2057 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2082 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1171 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1271 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1371 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1471 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 1571 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1581 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL, + 1591 | SPEC_RULE_OP1, + 1596 | SPEC_RULE_OP1, + 1601 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_RETVAL, + 1651 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1676 | SPEC_RULE_OP1, + 1681, + 1682, + 1683 | SPEC_RULE_OP1, + 1688 | SPEC_RULE_OP1, + 1693 | SPEC_RULE_OP1, + 1698 | SPEC_RULE_OP1, + 1703 | SPEC_RULE_OP1, + 1708 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1733 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1758 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1768 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1793 | SPEC_RULE_OP1, + 1798 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1823 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1848 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1873 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1898, + 1899 | SPEC_RULE_OP1, + 1904 | SPEC_RULE_OP2, + 1909 | SPEC_RULE_RETVAL, + 1911 | SPEC_RULE_OP2, + 1916 | SPEC_RULE_OP1, + 1921, + 1922 | SPEC_RULE_OP2, + 1927 | SPEC_RULE_OP1, + 1932 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 1942 | SPEC_RULE_OP1, + 1947 | SPEC_RULE_OP1, + 1952 | SPEC_RULE_OP2, + 1957 | SPEC_RULE_OP1, + 1962 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 1987 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2012 | SPEC_RULE_OP1, + 2017 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2042 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2067 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2092 | SPEC_RULE_OP1, + 2097 | SPEC_RULE_OP1, + 2102 | SPEC_RULE_OP1, 2107 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2132 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2157 | SPEC_RULE_OP1 | SPEC_RULE_OP2, @@ -58961,94 +61578,105 @@ void zend_init_opcodes_handlers(void) 2257 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2282 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 2307 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, - 2332, - 2333, - 2334, - 2335, - 2336, - 2337 | SPEC_RULE_OP1, - 2342 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2367 | SPEC_RULE_OP1, - 2372 | SPEC_RULE_OP2, - 2377 | SPEC_RULE_OP1, - 2382 | SPEC_RULE_OP1, - 2387 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2412 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2437 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2462 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2487 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, - 2497 | SPEC_RULE_OP1, - 2502 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2527, - 2528 | SPEC_RULE_OP1, - 2533 | SPEC_RULE_OP1, - 2538 | SPEC_RULE_OP1, - 2543 | SPEC_RULE_OP1, - 2548 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2573 | SPEC_RULE_OP1, - 2578 | SPEC_RULE_OP1, - 2583 | SPEC_RULE_OP1, - 2588 | SPEC_RULE_OP2, - 2593 | SPEC_RULE_RETVAL, - 2595 | SPEC_RULE_RETVAL, - 2597 | SPEC_RULE_RETVAL, - 2599 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2624 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2649 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2674 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2699 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 2824, - 2825 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2850, - 2851 | SPEC_RULE_OP2, - 2856, - 2857 | SPEC_RULE_OP1, - 2862 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 2887 | SPEC_RULE_OP2, - 2892 | SPEC_RULE_OP2, - 2897, - 2898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3023 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3048, - 3049, - 3050, - 3051 | SPEC_RULE_OP1, - 3056 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3081, - 3082, - 3083 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3108, - 3109, - 3110, - 3111 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3136 | SPEC_RULE_OP1, - 3141, - 3142, - 3143, - 3144, - 3145 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3170 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, - 3245 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3270 | SPEC_RULE_OP1, - 3275 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3300, - 3301 | SPEC_RULE_OP2, - 3306 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2332 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2357 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2382 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2407 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2432 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2457 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2482 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2507 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2532 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2557 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2582 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 5021, + 2607, + 2608, + 2609, + 2610, + 2611, + 2612 | SPEC_RULE_OP1, + 2617 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2642 | SPEC_RULE_OP1, + 2647 | SPEC_RULE_OP2, + 2652 | SPEC_RULE_OP1, + 2657 | SPEC_RULE_OP1, + 2662 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2687 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2712 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2737 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2762 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG, + 2772 | SPEC_RULE_OP1, + 2777 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2802, + 2803 | SPEC_RULE_OP1, + 2808 | SPEC_RULE_OP1, + 2813 | SPEC_RULE_OP1, + 2818 | SPEC_RULE_OP1, + 2823 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2848 | SPEC_RULE_OP1, + 2853 | SPEC_RULE_OP1, + 2858 | SPEC_RULE_OP1, + 2863 | SPEC_RULE_OP2, + 2868 | SPEC_RULE_RETVAL, + 2870 | SPEC_RULE_RETVAL, + 2872 | SPEC_RULE_RETVAL, + 2874 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2899 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2924 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2949 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 2974 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3099, + 3100 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3125, + 3126 | SPEC_RULE_OP2, + 3131, + 3132 | SPEC_RULE_OP1, + 3137 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3162 | SPEC_RULE_OP2, + 3167 | SPEC_RULE_OP2, + 3172, + 3173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 3298 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3323, + 3324, + 3325, + 3326 | SPEC_RULE_OP1, 3331 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3356 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3381 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3406 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3431 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3456 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3481 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3506 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3531 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3556 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3581 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596, + 3356, + 3357, + 3358 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3383, + 3384, + 3385, + 3386 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3411 | SPEC_RULE_OP1, + 3416, + 3417, + 3418, + 3419, + 3420 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3445 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_DIM_OBJ, + 3545 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3570 | SPEC_RULE_OP1, + 3575 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3600, + 3601 | SPEC_RULE_OP2, 3606 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4596 + 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3881 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3906 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 4031 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 5021 }; zend_opcode_handlers = labels; zend_handlers_count = sizeof(labels) / sizeof(void*); @@ -59125,11 +61753,13 @@ static const void *zend_vm_get_opcode_handler_ex(uint32_t spec, const zend_op* o } } if (spec & SPEC_RULE_DIM_OBJ) { - offset = offset * 3; + offset = offset * 4; if (op->extended_value == ZEND_ASSIGN_DIM) { offset += 1; } else if (op->extended_value == ZEND_ASSIGN_OBJ) { offset += 2; + } else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) { + offset += 3; } } return zend_opcode_handlers[(spec & SPEC_START_MASK) + offset]; @@ -59155,7 +61785,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3631 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4056 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59163,7 +61793,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3656 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59171,7 +61801,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3681 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4106 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59182,17 +61812,17 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3706 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4131 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if ((op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3731 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3756 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4181 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -59200,7 +61830,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3781 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4206 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59208,7 +61838,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3806 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59216,7 +61846,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3831 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4256 | SPEC_RULE_OP1 | SPEC_RULE_OP2; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59227,7 +61857,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3856 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4281 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59235,7 +61865,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3931 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4356 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59246,7 +61876,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4006 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4431 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59254,7 +61884,7 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4081 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; if (op->op1_type > op->op2_type) { zend_swap_operands(op); } @@ -59265,12 +61895,12 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4156 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4581 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4231 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4656 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -59278,70 +61908,70 @@ ZEND_API void zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t op1_info, uint if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4306 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4731 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if ((op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE)) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4381 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4806 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if ((op1_info == MAY_BE_DOUBLE)) { - spec = 4546 | SPEC_RULE_OP1; + spec = 4971 | SPEC_RULE_OP1; } else if ((!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE))))) { - spec = 4551 | SPEC_RULE_OP1; + spec = 4976 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4456 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4881 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4466 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4891 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4476 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4901 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4486 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4911 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4496 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4921 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4506 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; + spec = 4931 | SPEC_RULE_OP1 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4516 | SPEC_RULE_OP1; + spec = 4941 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4521 | SPEC_RULE_OP1; + spec = 4946 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4526 | SPEC_RULE_OP1; + spec = 4951 | SPEC_RULE_OP1; } break; case ZEND_POST_DEC: if ((res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG)) { - spec = 4531 | SPEC_RULE_OP1; + spec = 4956 | SPEC_RULE_OP1; } else if ((op1_info == MAY_BE_LONG)) { - spec = 4536 | SPEC_RULE_OP1; + spec = 4961 | SPEC_RULE_OP1; } else if ((op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE))) { - spec = 4541 | SPEC_RULE_OP1; + spec = 4966 | SPEC_RULE_OP1; } break; case ZEND_SEND_VAR_EX: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4586 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; + spec = 5011 | SPEC_RULE_OP1 | SPEC_RULE_QUICK_ARG; } break; case ZEND_FETCH_DIM_R: if ((!(op2_info & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_REF)))) { - spec = 4556 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4981 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4581 | SPEC_RULE_OP1; + spec = 5006 | SPEC_RULE_OP1; } break; default: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index d5115c86fb4ea..d50cc080fa160 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -739,6 +739,7 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp "/opline->extended_value\s*==\s*0/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_DIM/", "/opline->extended_value\s*==\s*ZEND_ASSIGN_OBJ/", + "/opline->extended_value\s*==\s*ZEND_ASSIGN_STATIC_PROP/", ), array( $op1_type[$op1], @@ -805,6 +806,9 @@ function gen_code($f, $spec, $kind, $export, $code, $op1, $op2, $name, $extra_sp isset($extra_spec['DIM_OBJ']) ? ($extra_spec['DIM_OBJ'] == 2 ? "1" : "0") : "\\0", + isset($extra_spec['DIM_OBJ']) ? + ($extra_spec['DIM_OBJ'] == 3 ? "1" : "0") + : "\\0", ), $code); @@ -950,7 +954,9 @@ function skip_extra_spec_function($op1, $op2, $extra_spec) { } if (isset($extra_spec["DIM_OBJ"]) && - (($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1) || + ((($op1 == "CONST" || $op1 == "TMP") && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "UNUSED" && $extra_spec["DIM_OBJ"] != 1 && $extra_spec["DIM_OBJ"] != 3) || + ($op2 == "CV" && $extra_spec["DIM_OBJ"] == 3) || ($op1 == "UNUSED" && $extra_spec["DIM_OBJ"] != 2))) { // Skip useless handlers return true; @@ -1366,6 +1372,8 @@ function extra_spec_name($extra_spec) { $s .= "_DIM"; } else if ($extra_spec["DIM_OBJ"] == 2) { $s .= "_OBJ"; + } else if ($extra_spec["DIM_OBJ"] == 3) { + $s .= "_STATIC_PROP"; } } return $s; @@ -1912,7 +1920,7 @@ function parse_spec_rules($def, $lineno, $str) { $ret["SMART_BRANCH"] = array(0, 1, 2); break; case "DIM_OBJ": - $ret["DIM_OBJ"] = array(0, 1, 2); + $ret["DIM_OBJ"] = array(0, 1, 2, 3); break; case "NO_CONST_CONST": $ret["NO_CONST_CONST"] = array(1); @@ -2315,11 +2323,13 @@ function gen_vm($def, $skel) { } if (isset($used_extra_spec["DIM_OBJ"])) { out($f, "\tif (spec & SPEC_RULE_DIM_OBJ) {\n"); - out($f, "\t\toffset = offset * 3;\n"); + out($f, "\t\toffset = offset * 4;\n"); out($f, "\t\tif (op->extended_value == ZEND_ASSIGN_DIM) {\n"); out($f, "\t\t\toffset += 1;\n"); out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_OBJ) {\n"); out($f, "\t\t\toffset += 2;\n"); + out($f, "\t\t} else if (op->extended_value == ZEND_ASSIGN_STATIC_PROP) {\n"); + out($f, "\t\t\toffset += 3;\n"); out($f, "\t\t}\n"); out($f, "\t}\n"); } diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 06da751d2eef1..0c624621fba8a 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -207,7 +207,7 @@ static const char *zend_vm_opcodes_names[187] = { "ZEND_BIND_LEXICAL", "ZEND_BIND_STATIC", "ZEND_FETCH_THIS", - NULL, + "ZEND_ASSIGN_STATIC_PROP", "ZEND_ISSET_ISEMPTY_THIS", }; @@ -235,17 +235,17 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000707, 0x07000003, 0x00000003, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, - 0x04006751, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, + 0x04006753, 0x00000001, 0x00000001, 0x00000001, @@ -379,7 +379,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00000010, 0x00000000, 0x00000707, - 0x04006751, + 0x04006753, 0x00000301, 0x00002003, 0x00000707, @@ -397,7 +397,7 @@ static uint32_t zend_vm_opcodes_flags[187] = { 0x00100101, 0x00100301, 0x00000101, - 0x00000000, + 0x00000307, 0x00000101, }; diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index c55d8a85001a9..646734bd504ae 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -251,6 +251,7 @@ END_EXTERN_C() #define ZEND_BIND_LEXICAL 182 #define ZEND_BIND_STATIC 183 #define ZEND_FETCH_THIS 184 +#define ZEND_ASSIGN_STATIC_PROP 185 #define ZEND_ISSET_ISEMPTY_THIS 186 #define ZEND_VM_LAST_OPCODE 186 diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index e59fbb4e17bf1..3098c5a28a83e 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -195,6 +195,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx LITERAL_CLASS_CONST, (ZEND_OP1_TYPE(opline) == IS_CONST) ? 1 : 2, 1, op_array); break; + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -203,6 +204,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: +handle_static_prop: if (ZEND_OP2_TYPE(opline) == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 1, 1, 2); } @@ -264,6 +266,9 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto handle_static_prop; + } if (ZEND_OP2_TYPE(opline) == IS_CONST) { if (opline->extended_value == ZEND_ASSIGN_OBJ) { optimizer_literal_obj_info( diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index cd07309df80ee..43d55634758d6 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -422,6 +422,8 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * fprintf(stderr, " (dim)"); } else if (opline->extended_value == ZEND_ASSIGN_OBJ) { fprintf(stderr, " (obj)"); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + fprintf(stderr, " (static prop)"); } } else if (ZEND_VM_EXT_CLASS_FETCH == (flags & ZEND_VM_EXT_MASK)) { zend_dump_class_fetch_type(opline->extended_value); diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index c88821e0e3e4a..0e310eecd69be 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -181,6 +181,22 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, alloc_cache_slots_op1(op_array, opline, 1); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); break; + case ZEND_ASSIGN_ADD: + case ZEND_ASSIGN_SUB: + case ZEND_ASSIGN_MUL: + case ZEND_ASSIGN_DIV: + case ZEND_ASSIGN_MOD: + case ZEND_ASSIGN_SL: + case ZEND_ASSIGN_SR: + case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_BW_OR: + case ZEND_ASSIGN_BW_AND: + case ZEND_ASSIGN_BW_XOR: + case ZEND_ASSIGN_POW: + if (opline->extended_value != ZEND_ASSIGN_STATIC_PROP) { + break; + } + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -237,6 +253,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_ADD_INTERFACE: case ZEND_ADD_TRAIT: case ZEND_INSTANCEOF: + case ZEND_ASSIGN_STATIC_PROP: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -245,6 +262,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: +handle_static_prop: REQUIRES_STRING(val); drop_leading_backslash(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); @@ -321,6 +339,8 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, TO_STRING_NOWARN(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); alloc_cache_slots_op2(op_array, opline, 2); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + goto handle_static_prop; } else { opline->op2.constant = zend_optimizer_add_literal(op_array, val); } From 786d4bbc48906efbe8e9823c3dc709935f51df35 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 9 Dec 2016 13:33:07 +0300 Subject: [PATCH 218/369] Fixed optimizer support for ZEND_ASSIGN_OBJ_REF --- ext/opcache/Optimizer/compact_literals.c | 1 + ext/opcache/Optimizer/zend_optimizer.c | 1 + 2 files changed, 2 insertions(+) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index c377a917d98f6..b90e53b92ffe3 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -230,6 +230,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 4939c2855db80..8eb7e99b6c638 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -294,6 +294,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, break; /*case ZEND_FETCH_CLASS_CONSTANT:*/ case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: From a9b0cd7bd6bee30c0a2b9b65cab2d57286be2020 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Fri, 9 Dec 2016 17:02:23 +0300 Subject: [PATCH 219/369] Implemented type inference support for typed properties. --- ext/opcache/Optimizer/zend_inference.c | 95 ++++++++++++++++++++++---- 1 file changed, 82 insertions(+), 13 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 42ec4078b1bfd..4fbdee96c4a55 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2017,11 +2017,11 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } /* }}} */ -#define UPDATE_SSA_TYPE(_type, _var) \ +#define UPDATE_SSA_TYPE_EX(_type, _var, _typed_ref) \ do { \ uint32_t __type = (_type); \ int __var = (_var); \ - if (__type & MAY_BE_REF) { \ + if (!(_typed_ref) && (__type & MAY_BE_REF)) { \ __type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; \ } \ if (__var >= 0) { \ @@ -2044,6 +2044,10 @@ static int zend_infer_ranges(const zend_op_array *op_array, zend_ssa *ssa) /* {{ } \ } while (0) +#define UPDATE_SSA_TYPE(_type, _var) \ + UPDATE_SSA_TYPE_EX(_type, _var, 0) + + #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ do { \ if (var >= 0) { \ @@ -2426,6 +2430,44 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } +static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +{ + zend_property_info *prop_info = NULL; + + if (opline->op2_type == IS_CONST) { + zend_class_entry *ce = NULL; + + if (opline->op1_type == IS_UNUSED) { + ce = op_array->scope; + } else if (ssa->ops[i].op1_use >= 0) { + ce = ssa->var_info[ssa->ops[i].op1_use].ce; + } + if (ce) { + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants))); + } + } + + if (prop_info && prop_info->type) { + uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (1 << prop_info->type); + + if (prop_info->allow_null) { + type |= MAY_BE_NULL; + } + if (type & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT|MAY_BE_RESOURCE)) { + type |= MAY_BE_RC1 | MAY_BE_RCN; + } + if (pce) { + *pce = prop_info->type_ce; + } + return type; + } + + if (pce) { + *pce = NULL; + } + return 0; +} + static void zend_update_type_info(const zend_op_array *op_array, zend_ssa *ssa, const zend_script *script, @@ -2593,9 +2635,12 @@ static void zend_update_type_info(const zend_op_array *op_array, orig = 0; tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { - tmp |= MAY_BE_REF; orig = t1; - t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, NULL); + if (!t1) { + tmp |= MAY_BE_REF; + t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + } t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2641,6 +2686,7 @@ static void zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { + ce = NULL; if (opline->extended_value == ZEND_ASSIGN_DIM) { if (opline->op2_type == IS_UNUSED) { /* When appending to an array and the LONG_MAX key is already used @@ -2662,8 +2708,16 @@ static void zend_update_type_info(const zend_op_array *op_array, * anything else results in a null return value. */ tmp |= MAY_BE_NULL; } + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } } + tmp &= ~MAY_BE_REF; UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } break; case ZEND_PRE_INC: @@ -2841,8 +2895,15 @@ static void zend_update_type_info(const zend_op_array *op_array, } if (ssa_ops[i].result_def >= 0) { // TODO: ??? - tmp = MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + tmp = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } if ((opline+1)->op1_type == IS_CV) { opline++; @@ -3415,16 +3476,24 @@ static void zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { - tmp |= MAY_BE_ERROR; - } - if (opline->result_type == IS_TMP_VAR) { - tmp |= MAY_BE_RC1 | MAY_BE_RCN; + tmp = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (tmp) { + UPDATE_SSA_TYPE_EX(tmp, ssa_ops[i].result_def, 1); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } } else { - tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN; + tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; + if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { + tmp |= MAY_BE_ERROR; + } + if (opline->result_type == IS_TMP_VAR) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } else { + tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } break; case ZEND_DO_FCALL: From f56bd3948b170db6ae7f7d59faa7387656486f63 Mon Sep 17 00:00:00 2001 From: Dmitry Stogov Date: Tue, 10 Jan 2017 13:00:54 +0300 Subject: [PATCH 220/369] Fixed tests (made them 32/64-bit independent) --- .../tests/type_declarations/typed_properties_033.phpt | 2 +- .../tests/type_declarations/typed_properties_061.phpt | 8 ++++---- .../tests/type_declarations/typed_properties_062.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_063.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_064.phpt | 11 ++++++----- .../tests/type_declarations/typed_properties_065.phpt | 8 ++++---- 6 files changed, 27 insertions(+), 24 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index d1f7302933f25..d40df54b1e378 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -34,5 +34,5 @@ object(class@anonymous)#1 (4) { ["baz"]=> int(6) ["qux"]=> - &int(9223372036854775807) + &int(%d) } diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index 144a759c317ed..d3219d25b86eb 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -37,12 +37,12 @@ $a->foo = PHP_INT_MAX; try { $a->_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a->_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; ?> --EXPECT-- @@ -53,6 +53,6 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index bacbe35be1066..95d22f4ae7c0b 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -32,13 +32,14 @@ $a->foo = PHP_INT_MAX; try { $a->_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a->_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$a->_ = 0; try { $a->_ = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -56,9 +57,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index 8f9985662639f..10e926e78eafc 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -31,13 +31,14 @@ $a->foo = PHP_INT_MAX; try { $_++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$_; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$_ = 0; try { $_ = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -55,9 +56,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 241125ffb1ead..40df2e0392d2d 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -31,13 +31,14 @@ $a->foo = PHP_INT_MAX; try { $_[0]++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$_[0]; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; +$_[0] = 0; try { $_[0] = []; } catch (Error $e) { echo $e->getMessage(), "\n"; } @@ -55,9 +56,9 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign array to reference of type integer -int(9223372036854775807) +int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index e19852ba1ee31..4c0285ee8a367 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -34,12 +34,12 @@ $a->foo = PHP_INT_MAX; try { $a[0]++; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; try { ++$a[0]; } catch (Error $e) { echo $e->getMessage(), "\n"; } -var_dump($a->foo); +echo gettype($a->foo),"\n"; ?> --EXPECT-- @@ -50,6 +50,6 @@ int(21) int(20) int(19) Cannot assign float to reference of type integer -int(9223372036854775807) +integer Cannot assign float to reference of type integer -int(9223372036854775807) +integer From 354c1aff6e82fca860e90836299b310f7b8718ad Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 11 Jan 2017 13:03:37 +0100 Subject: [PATCH 221/369] Fix a bunch of bugs related to e8109e09 --- .../typed_properties_044.phpt | 2 ++ Zend/zend_execute.c | 19 ++++++++----- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 27 ++++++++++++------- 4 files changed, 35 insertions(+), 16 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index a0eec85b5160e..490c6ff85913f 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -1,5 +1,7 @@ --TEST-- Test increment functions on typed property references +--SKIPIF-- + --FILE-- write_property(&obj, property, z, cache_slot); - zval_ptr_dtor(z); } zval_ptr_dtor(z); OBJ_RELEASE(Z_OBJ(obj)); @@ -1636,16 +1635,19 @@ static zend_never_inline void zend_pre_incdec_overloaded_property(zval *object, decrement_function(tmp); } } + if (UNEXPECTED(result)) { + ZVAL_COPY(result, tmp); + } } else { if (inc) { increment_function(z); } else { decrement_function(z); } - Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(result)) { ZVAL_COPY(result, z); } + Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } OBJ_RELEASE(Z_OBJ(obj)); zval_ptr_dtor(zptr); @@ -1710,6 +1712,10 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z SEPARATE_ZVAL_NOREF(tmp); binary_op(tmp, tmp, value); } + + if (UNEXPECTED(result)) { + ZVAL_COPY(result, tmp); + } } else { if (UNEXPECTED(prop_info)) { binary_op(&z_copy, z, value); @@ -1721,11 +1727,12 @@ static zend_never_inline void zend_assign_op_overloaded_property(zval *object, z binary_op(z, z, value); Z_OBJ_HT(obj)->write_property(&obj, property, z, cache_slot); } - } - if (UNEXPECTED(result) && EXPECTED(!EG(exception))) { - ZVAL_COPY(result, z); + if (UNEXPECTED(result)) { + ZVAL_COPY(result, z); + } } + zval_ptr_dtor(z); } else { zend_error(E_WARNING, "Attempt to assign property of non-object"); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index ec3714da2a603..c3876d4246eb8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1225,7 +1225,7 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -1349,6 +1349,7 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 076218ad4bab6..df03212c892aa 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -18289,7 +18289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -18412,6 +18412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -23057,7 +23058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -23180,6 +23181,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -26099,7 +26101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -26223,6 +26225,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -28753,7 +28756,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -28876,6 +28879,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -31788,7 +31792,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -31911,6 +31915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -34021,7 +34026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -34145,6 +34150,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -39087,7 +39093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -39210,6 +39216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -46150,7 +46157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -46273,6 +46280,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); @@ -50323,7 +50331,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE } } } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -50447,6 +50455,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); } zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ } } else { zval_opt_copy_ctor(zptr); From e20a1a314646bee89d89e54e698c8edb4fbbb8e4 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 15 Jan 2017 04:01:50 +0100 Subject: [PATCH 222/369] Fix crash in pcntl_wait() --- ext/pcntl/pcntl.c | 8 ++------ 1 file changed, 2 insertions(+), 6 deletions(-) diff --git a/ext/pcntl/pcntl.c b/ext/pcntl/pcntl.c index 1f0de090df34f..8170daaf8f001 100644 --- a/ext/pcntl/pcntl.c +++ b/ext/pcntl/pcntl.c @@ -711,12 +711,8 @@ PHP_FUNCTION(pcntl_wait) status = zval_get_long(z_status); #ifdef HAVE_WAIT3 if (z_rusage) { - if (Z_TYPE_P(z_rusage) != IS_ARRAY) { - zval_dtor(z_rusage); - array_init(z_rusage); - } else { - zend_hash_clean(Z_ARRVAL_P(z_rusage)); - } + zval_dtor(z_rusage); + array_init(z_rusage); memset(&rusage, 0, sizeof(struct rusage)); child_id = wait3(&status, options, &rusage); From 629521e8b9e9513d0bd2de293a3fef7b51ae9ed2 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Jan 2017 14:34:04 +0100 Subject: [PATCH 223/369] Fix constant value overwrite --- .../typed_properties_066.phpt | 21 +++++++++++++++++++ Zend/zend_execute.h | 5 +++++ Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 18 ++++++++-------- 4 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_066.phpt diff --git a/Zend/tests/type_declarations/typed_properties_066.phpt b/Zend/tests/type_declarations/typed_properties_066.phpt new file mode 100644 index 0000000000000..a91a00df65005 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_066.phpt @@ -0,0 +1,21 @@ +--TEST-- +Typed property assignment must not overwrite constants +--FILE-- +x; +$y = 4; +var_dump($x, 4); /* Optimizer will merge both "4" constants, making it immediately visible */ + +?> +--EXPECT-- +object(Foo)#1 (1) { + ["x"]=> + &float(4) +} +int(4) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 6124f69e58737..fcf9b640848cf 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -83,6 +83,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { zend_refcounted *ref = NULL; + zval tmp; if (ZEND_CONST_COND(value_type & (IS_VAR|IS_CV), 1) && Z_ISREF_P(value)) { ref = Z_COUNTED_P(value); @@ -94,6 +95,10 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { + if (ZEND_CONST_COND(value_type == IS_CONST, 1)) { + ZVAL_COPY_VALUE(&tmp, value); + value = &tmp; + } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); return Z_REFVAL_P(variable_ptr); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index afceb3038c3bb..25601e6c361d4 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -853,7 +853,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index af191fcb63ea6..997705cb4da79 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -17765,7 +17765,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -22534,7 +22534,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -25575,7 +25575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -28555,7 +28555,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -31591,7 +31591,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -33825,7 +33825,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -38569,7 +38569,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -45633,7 +45633,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } @@ -49805,7 +49805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP binary_op(zptr, zptr, value); } - if (UNEXPECTED(RETURN_VALUE_USED(opline)) && EXPECTED(!EG(exception))) { + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), zptr); } } From 78dae201e48d574bafcea80fc9f2e6c437114b7b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 16 Jan 2017 16:31:45 +0100 Subject: [PATCH 224/369] Add support for iterable typed properties --- .../type_declarations/typed_properties_001.phpt | 9 ++++++++- Zend/zend_API.h | 2 +- Zend/zend_execute.c | 13 +++++++++---- Zend/zend_execute.h | 3 ++- 4 files changed, 20 insertions(+), 7 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_001.phpt b/Zend/tests/type_declarations/typed_properties_001.phpt index 5a346a4c3e80a..575a144e47d57 100644 --- a/Zend/tests/type_declarations/typed_properties_001.phpt +++ b/Zend/tests/type_declarations/typed_properties_001.phpt @@ -8,6 +8,7 @@ var_dump(new class(1, 2.2, true, ["four"], new stdClass) { public bool $bool; public array $array; public stdClass $std; + public iterable $it; public function __construct(int $int, float $float, bool $bool, array $array, stdClass $std) { $this->int = $int; @@ -15,11 +16,12 @@ var_dump(new class(1, 2.2, true, ["four"], new stdClass) { $this->bool = $bool; $this->array = $array; $this->std = $std; + $this->it = $array; } }); ?> --EXPECTF-- -object(class@anonymous)#%d (5) { +object(class@anonymous)#%d (6) { ["int"]=> int(1) ["float"]=> @@ -34,5 +36,10 @@ object(class@anonymous)#%d (5) { ["std"]=> object(stdClass)#%d (0) { } + ["it"]=> + array(1) { + [0]=> + string(4) "four" + } } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 7b2376864291c..ffed869b4a2f0 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1052,7 +1052,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(zend_bool throw_ /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(separate); \ - if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && (((uintptr_t) Z_REFTYPE_P(_real_arg)) >> 1) != IS_ARRAY) { \ + if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e490b100494a9..791be5dafbe06 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -882,6 +882,8 @@ static zend_always_inline zval* i_zend_verify_property_type(zend_property_info * } } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { return property; + } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) { + return zend_is_iterable(property) ? property : NULL; } else { return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, tmp, strict) ? tmp : NULL; @@ -901,18 +903,21 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } ZVAL_DEREF(zv); - if (Z_TYPE_P(zv) == IS_OBJECT) { - return ZEND_TYPE_IS_CLASS(type) && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); - } - if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { return 1; } + if (ZEND_TYPE_IS_CLASS(type)) { + return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); + } + cur_type = ZEND_TYPE_CODE(type); if (cur_type == IS_CALLABLE) { return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); } + if (cur_type == IS_ITERABLE) { + return zend_is_iterable(zv); + } return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index fcf9b640848cf..63214ee434109 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -74,7 +74,8 @@ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type ty zend_uchar cur_type = ZEND_TYPE_CODE(type); return new_type == cur_type || (ZEND_TYPE_ALLOW_NULL(type) && new_type == IS_NULL) - || (new_type == _IS_BOOL && (cur_type == IS_FALSE || cur_type == IS_TRUE)); + || (cur_type == _IS_BOOL && (new_type == IS_FALSE || new_type == IS_TRUE)) + || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict); From 965f2c80aa5c868208bd5f96ed80946d24eb4d44 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 7 Jun 2018 00:49:21 +0200 Subject: [PATCH 225/369] Fix build failures --- Zend/zend_API.h | 2 +- Zend/zend_compile.c | 12 +- Zend/zend_execute.c | 9 +- Zend/zend_language_scanner.c | 9750 ++++++++++++------------ Zend/zend_language_scanner_defs.h | 2 +- Zend/zend_vm_def.h | 6 +- Zend/zend_vm_execute.h | 130 +- Zend/zend_vm_gen.php | 4 +- ext/opcache/Optimizer/zend_inference.c | 2 +- ext/standard/file.c | 9 - ext/standard/var_unserializer.c | 932 +-- 11 files changed, 5095 insertions(+), 5763 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index b8124b5ce69ec..cdc6327980224 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1135,7 +1135,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ - Z_PARAM_PROLOGUE(separate); \ + Z_PARAM_PROLOGUE(1, separate); \ if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9eef526a726d5..3ae0bc0aa5026 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2707,7 +2707,7 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { uint32_t offset = zend_delayed_compile_begin(); - zend_delayed_compile_prop(result, ast, type); + zend_op *opline = zend_delayed_compile_prop(result, ast, type); if (by_ref) { /* TODO(typed_props) extended_value is now used for the cache slot */ opline->extended_value |= ZEND_FETCH_REF; @@ -3020,7 +3020,7 @@ void zend_compile_assign(znode *result, zend_ast *ast) /* {{{ */ "Cannot assign reference to non referencable value"); } - zend_compile_var(&expr_node, expr_ast, BP_VAR_W); + zend_compile_var(&expr_node, expr_ast, BP_VAR_W, 1); /* MAKE_REF is usually not necessary for CVs. However, if there are * self-assignments, this forces the RHS to evaluate first. */ if (expr_node.op_type != IS_CV @@ -4341,7 +4341,7 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */ opline->opcode = ZEND_UNSET_DIM; return; case ZEND_AST_PROP: - opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET); + opline = zend_compile_prop(NULL, var_ast, BP_VAR_UNSET, 0); opline->opcode = ZEND_UNSET_OBJ; return; case ZEND_AST_STATIC_PROP: @@ -7312,7 +7312,7 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW); + zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_OBJ : ZEND_POST_DEC_OBJ; zend_make_tmp_result(result, opline); } else { @@ -7332,7 +7332,7 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(var_ast); if (var_ast->kind == ZEND_AST_PROP) { - zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW); + zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ; } else { znode var_node; @@ -7615,7 +7615,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = ZEND_ISSET_ISEMPTY_DIM_OBJ; break; case ZEND_AST_PROP: - opline = zend_compile_prop(result, var_ast, BP_VAR_IS); + opline = zend_compile_prop(result, var_ast, BP_VAR_IS, 0); opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ; break; case ZEND_AST_STATIC_PROP: diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 1d75708914b2c..75cd475319f05 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -641,7 +641,7 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 0; } - value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type); + value_ptr = zend_assign_to_variable(variable_ptr, value_ptr, value_type, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value_ptr); @@ -1636,10 +1636,10 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, * a dereferenced value and then written back. The type check in write_property should * thus be sufficient. */ if (UNEXPECTED(Z_ISREF_P(z))) { + zend_property_info *prop_info; zend_type ref_type = Z_REFTYPE_P(z); tmp = Z_REFVAL_P(z); - ZVAL_COPY(result, tmp); - zend_property_info *prop_info; + ZVAL_COPY(EX_VAR(opline->result.var), tmp); if (inc) { increment_function(tmp); @@ -1656,10 +1656,9 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); } zval_ptr_dtor(tmp); - ZVAL_COPY_VALUE(tmp, result); + ZVAL_COPY_VALUE(tmp, EX_VAR(opline->result.var)); } } - ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(z)); } else { ZVAL_COPY(EX_VAR(opline->result.var), z); ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); diff --git a/Zend/zend_language_scanner.c b/Zend/zend_language_scanner.c index 65995f0f35a23..49f4247ae579a 100644 --- a/Zend/zend_language_scanner.c +++ b/Zend/zend_language_scanner.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 */ +/* Generated by re2c 1.0.1 */ #line 1 "Zend/zend_language_scanner.l" /* +----------------------------------------------------------------------+ @@ -75,6 +75,7 @@ /* perform sanity check. If this message is triggered you should increase the ZEND_MMAP_AHEAD value in the zend_streams.h file */ #define YYMAXFILL 16 + #if ZEND_MMAP_AHEAD < YYMAXFILL # error ZEND_MMAP_AHEAD should be greater than or equal to YYMAXFILL #endif @@ -1225,7 +1226,7 @@ int start_line = CG(zend_lineno); SCNG(yy_text) = YYCURSOR; -#line 1229 "Zend/zend_language_scanner.c" +#line 1230 "Zend/zend_language_scanner.c" { YYCTYPE yych; unsigned int yyaccept = 0; @@ -1267,820 +1268,1054 @@ int start_line = CG(zend_lineno); } } /* *********************************** */ -yyc_INITIAL: - YYDEBUG(1, *YYCURSOR); - YYFILL(7); - yych = *YYCURSOR; - if (yych == '<') goto yy5; - YYDEBUG(3, *YYCURSOR); - ++YYCURSOR; -yy4: - YYDEBUG(4, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1938 "Zend/zend_language_scanner.l" +yyc_ST_IN_SCRIPTING: { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 36, 4, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 36, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 216, 216, 152, 152, 152, 152, 152, 152, + 152, 152, 0, 0, 0, 0, 0, 0, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 16, + 0, 144, 144, 144, 144, 144, 144, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 0, 0, 0, 0, 0, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 16, 16, 16, 16, + }; + YYDEBUG(1, *YYCURSOR); + YYFILL(16); + yych = *YYCURSOR; + if (yybm[0+yych] & 4) { + goto yy5; + } + switch (yych) { + case 0x00: + case 0x01: + case 0x02: + case 0x03: + case 0x04: + case 0x05: + case 0x06: + case 0x07: + case 0x08: + case '\t': + case '\n': + case '\v': + case '\f': + case '\r': + case 0x0E: + case 0x0F: + case 0x10: + case 0x11: + case 0x12: + case 0x13: + case 0x14: + case 0x15: + case 0x16: + case 0x17: + case 0x18: + case 0x19: + case 0x1A: + case 0x1B: + case 0x1C: + case 0x1D: + case 0x1E: + case 0x1F: + case 0x7F: goto yy3; + case ' ': + case '!': goto yy8; + case '"': goto yy10; + case '#': goto yy12; + case '$': goto yy14; + case '%': goto yy15; + case '&': goto yy16; + case '\'': goto yy17; + case '(': goto yy19; + case ')': + case ',': + case ';': + case '@': + case '[': + case ']': + case '~': goto yy20; + case '*': goto yy21; + case '+': goto yy22; + case '-': goto yy23; + case '.': goto yy24; + case '/': goto yy25; + case '0': goto yy26; + case '1': + case '2': + case '3': + case '4': + case '5': + case '6': + case '7': + case '8': + case '9': goto yy28; + case ':': goto yy30; + case '<': goto yy31; + case '=': goto yy32; + case '>': goto yy33; + case '?': goto yy34; + case 'A': + case 'a': goto yy35; + case 'B': + case 'b': goto yy37; + case 'C': + case 'c': goto yy38; + case 'D': + case 'd': goto yy39; + case 'E': + case 'e': goto yy40; + case 'F': + case 'f': goto yy41; + case 'G': + case 'g': goto yy42; + case 'I': + case 'i': goto yy45; + case 'L': + case 'l': goto yy46; + case 'N': + case 'n': goto yy47; + case 'O': + case 'o': goto yy48; + case 'P': + case 'p': goto yy49; + case 'R': + case 'r': goto yy50; + case 'S': + case 's': goto yy51; + case 'T': + case 't': goto yy52; + case 'U': + case 'u': goto yy53; + case 'V': + case 'v': goto yy54; + case 'W': + case 'w': goto yy55; + case 'X': + case 'x': goto yy56; + case 'Y': + case 'y': goto yy57; + case '\\': goto yy58; + case '^': goto yy60; + case '_': goto yy61; + case '`': goto yy62; + case '{': goto yy64; + case '|': goto yy66; + case '}': goto yy67; + default: goto yy43; + } +yy3: + YYDEBUG(3, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(4, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2720 "Zend/zend_language_scanner.l" + { if (YYCURSOR > YYLIMIT) { RETURN_TOKEN(END); } -inline_char_handler: + zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); + goto restart; +} +#line 1447 "Zend/zend_language_scanner.c" +yy5: + YYDEBUG(5, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(6, *YYCURSOR); + if (yybm[0+yych] & 4) { + goto yy5; + } + YYDEBUG(7, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1409 "Zend/zend_language_scanner.l" + { + goto return_whitespace; +} +#line 1463 "Zend/zend_language_scanner.c" +yy8: + YYDEBUG(8, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy69; +yy9: + YYDEBUG(9, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1692 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(yytext[0]); +} +#line 1475 "Zend/zend_language_scanner.c" +yy10: + YYDEBUG(10, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(11, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2203 "Zend/zend_language_scanner.l" + { + int bprefix = (yytext[0] != '"') ? 1 : 0; - while (1) { - YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '"': + yyleng = YYCURSOR - SCNG(yy_text); + if (EXPECTED(zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == SUCCESS) + || !PARSER_MODE()) { + RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING); + } else { + RETURN_TOKEN(T_ERROR); + } + case '$': + if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { + break; + } + continue; + case '{': + if (*YYCURSOR == '$') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + /* fall through */ + default: + continue; + } - YYCURSOR = ptr ? ptr + 1 : YYLIMIT; + YYCURSOR--; + break; + } - if (YYCURSOR >= YYLIMIT) { - break; - } + /* Remember how much was scanned to save rescanning */ + SET_DOUBLE_QUOTES_SCANNED_LENGTH(YYCURSOR - SCNG(yy_text) - yyleng); - if (*YYCURSOR == '?') { - if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */ + YYCURSOR = SCNG(yy_text) + yyleng; - YYCURSOR--; + BEGIN(ST_DOUBLE_QUOTES); + RETURN_TOKEN('"'); +} +#line 1526 "Zend/zend_language_scanner.c" +yy12: + YYDEBUG(12, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(13, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2030 "Zend/zend_language_scanner.l" + { + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '\r': + if (*YYCURSOR == '\n') { + YYCURSOR++; + } + /* fall through */ + case '\n': + CG(zend_lineno)++; break; - } + case '?': + if (*YYCURSOR == '>') { + YYCURSOR--; + break; + } + /* fall through */ + default: + continue; } + + break; } yyleng = YYCURSOR - SCNG(yy_text); - if (SCNG(output_filter)) { - size_t readsize; - char *s = NULL; - size_t sz = 0; - // TODO: avoid reallocation ??? - readsize = SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); - ZVAL_STRINGL(zendlval, s, sz); - efree(s); - if (readsize < yyleng) { - yyless(readsize); - } - } else if (yyleng == 1) { - ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext)); - } else { - ZVAL_STRINGL(zendlval, yytext, yyleng); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_COMMENT); } - HANDLE_NEWLINES(yytext, yyleng); - RETURN_TOKEN_WITH_VAL(T_INLINE_HTML); + RETURN_TOKEN(T_COMMENT); } -#line 1328 "Zend/zend_language_scanner.c" -yy5: - YYDEBUG(5, *YYCURSOR); - yych = *++YYCURSOR; - if (yych != '?') goto yy4; - YYDEBUG(6, *YYCURSOR); - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= 'O') { - if (yych == '=') goto yy8; - } else { - if (yych <= 'P') goto yy10; - if (yych == 'p') goto yy10; - } -yy7: - YYDEBUG(7, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1926 "Zend/zend_language_scanner.l" - { - if (CG(short_tags)) { - BEGIN(ST_IN_SCRIPTING); - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_OPEN_TAG); - } - RETURN_TOKEN(T_OPEN_TAG); - } else { - goto inline_char_handler; - } -} -#line 1356 "Zend/zend_language_scanner.c" -yy8: - YYDEBUG(8, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(9, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1907 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - if (PARSER_MODE()) { - RETURN_TOKEN(T_ECHO); - } - RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); -} -#line 1370 "Zend/zend_language_scanner.c" -yy10: - YYDEBUG(10, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy12; - if (yych == 'h') goto yy12; -yy11: - YYDEBUG(11, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy7; -yy12: - YYDEBUG(12, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy13; - if (yych != 'p') goto yy11; -yy13: - YYDEBUG(13, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) goto yy11; - if (yych >= '\v') goto yy11; - } else { - if (yych <= '\r') goto yy16; - if (yych != ' ') goto yy11; - } +#line 1564 "Zend/zend_language_scanner.c" yy14: - YYDEBUG(14, *YYCURSOR); - ++YYCURSOR; -yy15: - YYDEBUG(15, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1916 "Zend/zend_language_scanner.l" - { - HANDLE_NEWLINE(yytext[yyleng-1]); - BEGIN(ST_IN_SCRIPTING); - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_OPEN_TAG); - } - RETURN_TOKEN(T_OPEN_TAG); -} -#line 1410 "Zend/zend_language_scanner.c" -yy16: - YYDEBUG(16, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy14; - goto yy15; -/* *********************************** */ -yyc_ST_BACKQUOTE: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(17, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; + YYDEBUG(14, *YYCURSOR); + yych = *++YYCURSOR; if (yych <= '_') { - if (yych == '$') goto yy21; + if (yych <= '@') goto yy9; + if (yych <= 'Z') goto yy71; + if (yych <= '^') goto yy9; + goto yy71; } else { - if (yych <= '`') goto yy22; - if (yych == '{') goto yy24; + if (yych <= '`') goto yy9; + if (yych <= 'z') goto yy71; + if (yych <= 0x7F) goto yy9; + goto yy71; } - YYDEBUG(19, *YYCURSOR); +yy15: + YYDEBUG(15, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy74; + goto yy9; +yy16: + YYDEBUG(16, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '&') goto yy76; + if (yych == '=') goto yy78; + goto yy9; +yy17: + YYDEBUG(17, *YYCURSOR); ++YYCURSOR; -yy20: - YYDEBUG(20, *YYCURSOR); + YYDEBUG(18, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2472 "Zend/zend_language_scanner.l" +#line 2113 "Zend/zend_language_scanner.l" { - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) { - YYCURSOR++; - } + register char *s, *t; + char *end; + int bprefix = (yytext[0] != '\'') ? 1 : 0; + + while (1) { + if (YYCURSOR < YYLIMIT) { + if (*YYCURSOR == '\'') { + YYCURSOR++; + yyleng = YYCURSOR - SCNG(yy_text); - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '`': break; - case '$': - if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { - break; - } - continue; - case '{': - if (*YYCURSOR == '$') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT) { - YYCURSOR++; - } - /* fall through */ - default: - continue; + } else if (*YYCURSOR++ == '\\' && YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + } else { + yyleng = YYLIMIT - SCNG(yy_text); + + /* Unclosed single quotes; treat similar to double quotes, but without a separate token + * for ' (unrecognized by parser), instead of old flex fallback to "Unexpected character..." + * rule, which continued in ST_IN_SCRIPTING state after the quote */ + ZVAL_NULL(zendlval); + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); } + } - YYCURSOR--; - break; + if (yyleng-bprefix-2 <= 1) { + if (yyleng-bprefix-2 < 1) { + ZVAL_EMPTY_STRING(zendlval); + } else { + zend_uchar c = (zend_uchar)*(yytext+bprefix+1); + if (c == '\n' || c == '\r') { + CG(zend_lineno)++; + } + ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c)); + } + goto skip_escape_conversion; } + ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2); - yyleng = YYCURSOR - SCNG(yy_text); + /* convert escape sequences */ + s = Z_STRVAL_P(zendlval); + end = s+Z_STRLEN_P(zendlval); + while (1) { + if (UNEXPECTED(*s=='\\')) { + break; + } + if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { + CG(zend_lineno)++; + } + s++; + if (s == end) { + goto skip_escape_conversion; + } + } - if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '`') == SUCCESS) - || !PARSER_MODE()) { - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); - } else { - RETURN_TOKEN(T_ERROR); + t = s; + while (s') goto yy36; + if (yych <= '<') goto yy9; + if (yych <= '=') goto yy126; + if (yych <= '>') goto yy128; + goto yy9; yy33: YYDEBUG(33, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy27; + yych = *++YYCURSOR; + if (yych <= '<') goto yy9; + if (yych <= '=') goto yy130; + if (yych <= '>') goto yy132; + goto yy9; yy34: YYDEBUG(34, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= '=') goto yy9; + if (yych <= '>') goto yy134; + if (yych <= '?') goto yy136; + goto yy9; +yy35: YYDEBUG(35, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1609 "Zend/zend_language_scanner.c" -yy36: - YYDEBUG(36, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy33; - if (yych <= 'Z') goto yy37; - if (yych <= '^') goto yy33; + if (yych <= 'S') { + if (yych <= 'M') { + if (yych == 'B') goto yy138; + goto yy44; + } else { + if (yych <= 'N') goto yy139; + if (yych <= 'Q') goto yy44; + if (yych <= 'R') goto yy140; + goto yy141; + } } else { - if (yych <= '`') goto yy33; - if (yych <= 'z') goto yy37; - if (yych <= 0x7F) goto yy33; + if (yych <= 'n') { + if (yych == 'b') goto yy138; + if (yych <= 'm') goto yy44; + goto yy139; + } else { + if (yych <= 'q') goto yy44; + if (yych <= 'r') goto yy140; + if (yych <= 's') goto yy141; + goto yy44; + } } -yy37: - YYDEBUG(37, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(38, *YYCURSOR); +yy36: + YYDEBUG(36, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" +#line 2025 "Zend/zend_language_scanner.l" { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); + RETURN_TOKEN_WITH_STR(T_STRING, 0); } -#line 1633 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_DOUBLE_QUOTES: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(39, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych <= '#') { - if (yych == '"') goto yy43; +#line 1945 "Zend/zend_language_scanner.c" +yy37: + YYDEBUG(37, *YYCURSOR); + yyaccept = 2; + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= ';') { + if (yych <= '"') { + if (yych <= '!') goto yy44; + goto yy10; + } else { + if (yych == '\'') goto yy17; + goto yy44; + } } else { - if (yych <= '$') goto yy45; - if (yych == '{') goto yy46; - } - YYDEBUG(41, *YYCURSOR); - ++YYCURSOR; -yy42: - YYDEBUG(42, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2418 "Zend/zend_language_scanner.l" - { - if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { - YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; - SET_DOUBLE_QUOTES_SCANNED_LENGTH(0); - - goto double_quotes_scan_done; - } - - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) { - YYCURSOR++; - } - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '"': - break; - case '$': - if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { - break; - } - continue; - case '{': - if (*YYCURSOR == '$') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT) { - YYCURSOR++; - } - /* fall through */ - default: - continue; + if (yych <= 'R') { + if (yych <= '<') goto yy143; + if (yych <= 'Q') goto yy44; + goto yy144; + } else { + if (yych == 'r') goto yy144; + goto yy44; + } } - - YYCURSOR--; - break; - } - -double_quotes_scan_done: - yyleng = YYCURSOR - SCNG(yy_text); - - if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '"') == SUCCESS) - || !PARSER_MODE()) { - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); - } else { - RETURN_TOKEN(T_ERROR); - } -} -#line 1739 "Zend/zend_language_scanner.c" -yy43: - YYDEBUG(43, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(44, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2407 "Zend/zend_language_scanner.l" - { - BEGIN(ST_IN_SCRIPTING); - RETURN_TOKEN('"'); -} -#line 1750 "Zend/zend_language_scanner.c" -yy45: - YYDEBUG(45, *YYCURSOR); +yy38: + YYDEBUG(38, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy42; - if (yych <= 'Z') goto yy47; - if (yych <= '^') goto yy42; - goto yy47; + if (yych <= 'O') { + if (yych <= 'K') { + if (yych == 'A') goto yy145; + goto yy44; + } else { + if (yych <= 'L') goto yy146; + if (yych <= 'N') goto yy44; + goto yy147; + } } else { - if (yych <= 'z') { - if (yych <= '`') goto yy42; - goto yy47; + if (yych <= 'k') { + if (yych == 'a') goto yy145; + goto yy44; } else { - if (yych <= '{') goto yy50; - if (yych <= 0x7F) goto yy42; - goto yy47; + if (yych <= 'l') goto yy146; + if (yych == 'o') goto yy147; + goto yy44; } } -yy46: - YYDEBUG(46, *YYCURSOR); +yy39: + YYDEBUG(39, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '$') goto yy52; - goto yy42; -yy47: - YYDEBUG(47, *YYCURSOR); - YYMARKER = ++YYCURSOR; - YYFILL(3); + if (yych <= 'O') { + if (yych <= 'H') { + if (yych == 'E') goto yy148; + goto yy44; + } else { + if (yych <= 'I') goto yy149; + if (yych <= 'N') goto yy44; + goto yy150; + } + } else { + if (yych <= 'h') { + if (yych == 'e') goto yy148; + goto yy44; + } else { + if (yych <= 'i') goto yy149; + if (yych == 'o') goto yy150; + goto yy44; + } + } +yy40: + YYDEBUG(40, *YYCURSOR); + yych = *++YYCURSOR; + switch (yych) { + case 'C': + case 'c': goto yy152; + case 'L': + case 'l': goto yy153; + case 'M': + case 'm': goto yy154; + case 'N': + case 'n': goto yy155; + case 'V': + case 'v': goto yy156; + case 'X': + case 'x': goto yy157; + default: goto yy44; + } +yy41: + YYDEBUG(41, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych <= 'N') { + if (yych == 'I') goto yy158; + goto yy44; + } else { + if (yych <= 'O') goto yy159; + if (yych <= 'T') goto yy44; + goto yy160; + } + } else { + if (yych <= 'n') { + if (yych == 'i') goto yy158; + goto yy44; + } else { + if (yych <= 'o') goto yy159; + if (yych == 'u') goto yy160; + goto yy44; + } + } +yy42: + YYDEBUG(42, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'O') { + if (yych == 'L') goto yy161; + if (yych <= 'N') goto yy44; + goto yy162; + } else { + if (yych <= 'l') { + if (yych <= 'k') goto yy44; + goto yy161; + } else { + if (yych == 'o') goto yy162; + goto yy44; + } + } +yy43: + YYDEBUG(43, *YYCURSOR); + ++YYCURSOR; + YYFILL(1); yych = *YYCURSOR; - YYDEBUG(48, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy47; +yy44: + YYDEBUG(44, *YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy43; + } + goto yy36; +yy45: + YYDEBUG(45, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'S') { + if (yych <= 'L') { + if (yych == 'F') goto yy163; + goto yy44; + } else { + if (yych <= 'M') goto yy165; + if (yych <= 'N') goto yy166; + if (yych <= 'R') goto yy44; + goto yy167; + } + } else { + if (yych <= 'm') { + if (yych == 'f') goto yy163; + if (yych <= 'l') goto yy44; + goto yy165; + } else { + if (yych <= 'n') goto yy166; + if (yych == 's') goto yy167; + goto yy44; + } + } +yy46: + YYDEBUG(46, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy168; + if (yych == 'i') goto yy168; + goto yy44; +yy47: + YYDEBUG(47, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'E') { + if (yych == 'A') goto yy169; + if (yych <= 'D') goto yy44; + goto yy170; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy44; + goto yy169; + } else { + if (yych == 'e') goto yy170; + goto yy44; + } } - if (yych == '-') goto yy54; - if (yych <= '@') goto yy49; - if (yych <= '[') goto yy56; +yy48: + YYDEBUG(48, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy171; + if (yych == 'r') goto yy171; + goto yy44; yy49: YYDEBUG(49, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2003 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1793 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych == 'R') goto yy173; + if (yych <= 'T') goto yy44; + goto yy174; + } else { + if (yych <= 'r') { + if (yych <= 'q') goto yy44; + goto yy173; + } else { + if (yych == 'u') goto yy174; + goto yy44; + } + } yy50: YYDEBUG(50, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy175; + if (yych == 'e') goto yy175; + goto yy44; +yy51: YYDEBUG(51, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1703 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_LOOKING_FOR_VARNAME); - RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); -} -#line 1804 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych <= 'W') { + if (yych == 'T') goto yy176; + if (yych <= 'V') goto yy44; + goto yy177; + } else { + if (yych <= 't') { + if (yych <= 's') goto yy44; + goto yy176; + } else { + if (yych == 'w') goto yy177; + goto yy44; + } + } yy52: YYDEBUG(52, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(53, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2400 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_IN_SCRIPTING); - yyless(1); - RETURN_TOKEN(T_CURLY_OPEN); -} -#line 1816 "Zend/zend_language_scanner.c" -yy54: - YYDEBUG(54, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '>') goto yy58; -yy55: - YYDEBUG(55, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy49; -yy56: - YYDEBUG(56, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(57, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1836 "Zend/zend_language_scanner.c" -yy58: - YYDEBUG(58, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy55; - if (yych <= 'Z') goto yy59; - if (yych <= '^') goto yy55; + if (yych <= 'R') { + if (yych == 'H') goto yy178; + if (yych <= 'Q') goto yy44; + goto yy179; } else { - if (yych <= '`') goto yy55; - if (yych <= 'z') goto yy59; - if (yych <= 0x7F) goto yy55; - } -yy59: - YYDEBUG(59, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(60, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 1860 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_END_HEREDOC: - YYDEBUG(61, *YYCURSOR); - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(63, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(64, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2386 "Zend/zend_language_scanner.l" - { - zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); - - yyleng = heredoc_label->indentation + heredoc_label->length; - YYCURSOR += yyleng - 1; - - heredoc_label_dtor(heredoc_label); - efree(heredoc_label); - - BEGIN(ST_IN_SCRIPTING); - RETURN_TOKEN(T_END_HEREDOC); -} -#line 1884 "Zend/zend_language_scanner.c" -/* *********************************** */ -yyc_ST_HEREDOC: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 0, 0, 0, 0, 0, 0, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 128, - 0, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 0, 0, 0, 0, 0, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, - }; - YYDEBUG(65, *YYCURSOR); - YYFILL(2); - yych = *YYCURSOR; - if (yych == '$') goto yy69; - if (yych == '{') goto yy70; - YYDEBUG(67, *YYCURSOR); - ++YYCURSOR; -yy68: - YYDEBUG(68, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2518 "Zend/zend_language_scanner.l" - { - zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack)); - int newline = 0, indentation = 0, spacing = 0; - - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - - YYCURSOR--; - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '\r': - if (*YYCURSOR == '\n') { - YYCURSOR++; - } - /* fall through */ - case '\n': - indentation = spacing = 0; - - while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { - if (*YYCURSOR == '\t') { - spacing |= HEREDOC_USING_TABS; - } else { - spacing |= HEREDOC_USING_SPACES; - } - ++YYCURSOR; - ++indentation; - } - - if (YYCURSOR == YYLIMIT) { - yyleng = YYCURSOR - SCNG(yy_text); - HANDLE_NEWLINES(yytext, yyleng); - ZVAL_NULL(zendlval); - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); - } - - /* Check for ending label on the next line */ - if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) { - if (IS_LABEL_START(YYCURSOR[heredoc_label->length])) { - continue; - } - - if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { - zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); - } - - /* newline before label will be subtracted from returned text, but - * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */ - if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') { - newline = 2; /* Windows newline */ - } else { - newline = 1; - } - - CG(increment_lineno) = 1; /* For newline before label */ - - if (SCNG(heredoc_scan_ahead)) { - SCNG(heredoc_indentation) = indentation; - SCNG(heredoc_indentation_uses_spaces) = (spacing == HEREDOC_USING_SPACES); - } else { - YYCURSOR -= indentation; - } - - BEGIN(ST_END_HEREDOC); - - goto heredoc_scan_done; - } - continue; - case '$': - if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { - break; - } - continue; - case '{': - if (*YYCURSOR == '$') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT && *YYCURSOR != '\n' && *YYCURSOR != '\r') { - YYCURSOR++; - } - /* fall through */ - default: - continue; - } - - YYCURSOR--; - break; - } - -heredoc_scan_done: - - yyleng = YYCURSOR - SCNG(yy_text); - ZVAL_STRINGL(zendlval, yytext, yyleng); - - if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) { - zend_string *copy = Z_STR_P(zendlval); - - if (!strip_multiline_string_indentation(zendlval, newline, heredoc_label->indentation, heredoc_label->indentation_uses_spaces)) { - RETURN_TOKEN(T_ERROR); + if (yych <= 'h') { + if (yych <= 'g') goto yy44; + goto yy178; + } else { + if (yych == 'r') goto yy179; + goto yy44; + } } - - if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) { - zend_string_efree(copy); - RETURN_TOKEN(T_ERROR); +yy53: + YYDEBUG(53, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'S') { + if (yych == 'N') goto yy180; + if (yych <= 'R') goto yy44; + goto yy181; + } else { + if (yych <= 'n') { + if (yych <= 'm') goto yy44; + goto yy180; + } else { + if (yych == 's') goto yy181; + goto yy44; + } } - - zend_string_efree(copy); - } else { - HANDLE_NEWLINES(yytext, yyleng - newline); +yy54: + YYDEBUG(54, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy182; + if (yych == 'a') goto yy182; + goto yy44; +yy55: + YYDEBUG(55, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'H') goto yy183; + if (yych == 'h') goto yy183; + goto yy44; +yy56: + YYDEBUG(56, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'O') goto yy184; + if (yych == 'o') goto yy184; + goto yy44; +yy57: + YYDEBUG(57, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy185; + if (yych == 'i') goto yy185; + goto yy44; +yy58: + YYDEBUG(58, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(59, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1432 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_NS_SEPARATOR); +} +#line 2234 "Zend/zend_language_scanner.c" +yy60: + YYDEBUG(60, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy186; + goto yy9; +yy61: + YYDEBUG(61, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '_') goto yy188; + goto yy44; +yy62: + YYDEBUG(62, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(63, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2380 "Zend/zend_language_scanner.l" + { + BEGIN(ST_BACKQUOTE); + RETURN_TOKEN('`'); +} +#line 2255 "Zend/zend_language_scanner.c" +yy64: + YYDEBUG(64, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(65, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1697 "Zend/zend_language_scanner.l" + { + yy_push_state(ST_IN_SCRIPTING); + RETURN_TOKEN('{'); +} +#line 2266 "Zend/zend_language_scanner.c" +yy66: + YYDEBUG(66, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '=') goto yy189; + if (yych == '|') goto yy191; + goto yy9; +yy67: + YYDEBUG(67, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(68, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1709 "Zend/zend_language_scanner.l" + { + RESET_DOC_COMMENT(); + if (!zend_stack_is_empty(&SCNG(state_stack))) { + yy_pop_state(); } - - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + RETURN_TOKEN('}'); } -#line 2049 "Zend/zend_language_scanner.c" +#line 2286 "Zend/zend_language_scanner.c" yy69: YYDEBUG(69, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy68; - if (yych <= 'Z') goto yy71; - if (yych <= '^') goto yy68; - goto yy71; - } else { - if (yych <= 'z') { - if (yych <= '`') goto yy68; - goto yy71; - } else { - if (yych <= '{') goto yy74; - if (yych <= 0x7F) goto yy68; - goto yy71; - } - } + if (yych == '=') goto yy193; yy70: YYDEBUG(70, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '$') goto yy76; - goto yy68; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1596 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_NOT_EQUAL); +} +#line 2298 "Zend/zend_language_scanner.c" yy71: YYDEBUG(71, *YYCURSOR); - YYMARKER = ++YYCURSOR; - YYFILL(3); + ++YYCURSOR; + YYFILL(1); yych = *YYCURSOR; YYDEBUG(72, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy71; + if (yych <= '^') { + if (yych <= '9') { + if (yych >= '0') goto yy71; + } else { + if (yych <= '@') goto yy73; + if (yych <= 'Z') goto yy71; + } + } else { + if (yych <= '`') { + if (yych <= '_') goto yy71; + } else { + if (yych <= 'z') goto yy71; + if (yych >= 0x80) goto yy71; + } } - if (yych == '-') goto yy78; - if (yych <= '@') goto yy73; - if (yych <= '[') goto yy80; yy73: YYDEBUG(73, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); @@ -2088,5400 +2323,4836 @@ int start_line = CG(zend_lineno); { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 2092 "Zend/zend_language_scanner.c" +#line 2327 "Zend/zend_language_scanner.c" yy74: YYDEBUG(74, *YYCURSOR); ++YYCURSOR; YYDEBUG(75, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1703 "Zend/zend_language_scanner.l" +#line 1640 "Zend/zend_language_scanner.l" { - yy_push_state(ST_LOOKING_FOR_VARNAME); - RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); + RETURN_TOKEN(T_MOD_EQUAL); } -#line 2103 "Zend/zend_language_scanner.c" +#line 2337 "Zend/zend_language_scanner.c" yy76: YYDEBUG(76, *YYCURSOR); ++YYCURSOR; YYDEBUG(77, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2400 "Zend/zend_language_scanner.l" +#line 1668 "Zend/zend_language_scanner.l" { - yy_push_state(ST_IN_SCRIPTING); - yyless(1); - RETURN_TOKEN(T_CURLY_OPEN); + RETURN_TOKEN(T_BOOLEAN_AND); } -#line 2115 "Zend/zend_language_scanner.c" +#line 2347 "Zend/zend_language_scanner.c" yy78: YYDEBUG(78, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '>') goto yy82; -yy79: - YYDEBUG(79, *YYCURSOR); - YYCURSOR = YYMARKER; - goto yy73; -yy80: - YYDEBUG(80, *YYCURSOR); ++YYCURSOR; - YYDEBUG(81, *YYCURSOR); + YYDEBUG(79, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1997 "Zend/zend_language_scanner.l" +#line 1652 "Zend/zend_language_scanner.l" { - yyless(yyleng - 1); - yy_push_state(ST_VAR_OFFSET); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); + RETURN_TOKEN(T_AND_EQUAL); } -#line 2135 "Zend/zend_language_scanner.c" -yy82: - YYDEBUG(82, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy79; - if (yych <= 'Z') goto yy83; - if (yych <= '^') goto yy79; - } else { - if (yych <= '`') goto yy79; - if (yych <= 'z') goto yy83; - if (yych <= 0x7F) goto yy79; - } -yy83: - YYDEBUG(83, *YYCURSOR); +#line 2357 "Zend/zend_language_scanner.c" +yy80: + YYDEBUG(80, *YYCURSOR); ++YYCURSOR; - YYDEBUG(84, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1989 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 3); - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 2159 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_IN_SCRIPTING: - { - static const unsigned char yybm[] = { - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 36, 4, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 36, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 216, 216, 152, 152, 152, 152, 152, 152, - 152, 152, 0, 0, 0, 0, 0, 0, - 0, 144, 144, 144, 144, 144, 144, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 16, - 0, 144, 144, 144, 144, 144, 144, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 0, 0, 0, 0, 0, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, - }; - YYDEBUG(85, *YYCURSOR); - YYFILL(16); + YYFILL(7); yych = *YYCURSOR; - if (yybm[0+yych] & 4) { - goto yy89; +yy81: + YYDEBUG(81, *YYCURSOR); + if (yybm[0+yych] & 32) { + goto yy80; } switch (yych) { - case 0x00: - case 0x01: - case 0x02: - case 0x03: - case 0x04: - case 0x05: - case 0x06: - case 0x07: - case 0x08: - case '\t': - case '\n': - case '\v': - case '\f': - case '\r': - case 0x0E: - case 0x0F: - case 0x10: - case 0x11: - case 0x12: - case 0x13: - case 0x14: - case 0x15: - case 0x16: - case 0x17: - case 0x18: - case 0x19: - case 0x1A: - case 0x1B: - case 0x1C: - case 0x1D: - case 0x1E: - case 0x1F: - case 0x7F: goto yy87; - case ' ': - case '!': goto yy92; - case '"': goto yy94; - case '#': goto yy96; - case '$': goto yy98; - case '%': goto yy99; - case '&': goto yy100; - case '\'': goto yy101; - case '(': goto yy103; - case ')': - case ',': - case ';': - case '@': - case '[': - case ']': - case '~': goto yy104; - case '*': goto yy105; - case '+': goto yy106; - case '-': goto yy107; - case '.': goto yy108; - case '/': goto yy109; - case '0': goto yy110; - case '1': - case '2': - case '3': - case '4': - case '5': - case '6': - case '7': - case '8': - case '9': goto yy112; - case ':': goto yy114; - case '<': goto yy115; - case '=': goto yy116; - case '>': goto yy117; - case '?': goto yy118; case 'A': - case 'a': goto yy119; + case 'a': goto yy83; case 'B': - case 'b': goto yy121; - case 'C': - case 'c': goto yy122; + case 'b': goto yy84; case 'D': - case 'd': goto yy123; - case 'E': - case 'e': goto yy124; + case 'd': goto yy85; case 'F': - case 'f': goto yy125; - case 'G': - case 'g': goto yy126; + case 'f': goto yy86; case 'I': - case 'i': goto yy129; - case 'L': - case 'l': goto yy130; - case 'N': - case 'n': goto yy131; + case 'i': goto yy87; case 'O': - case 'o': goto yy132; - case 'P': - case 'p': goto yy133; + case 'o': goto yy88; case 'R': - case 'r': goto yy134; + case 'r': goto yy89; case 'S': - case 's': goto yy135; - case 'T': - case 't': goto yy136; + case 's': goto yy90; case 'U': - case 'u': goto yy137; - case 'V': - case 'v': goto yy138; - case 'W': - case 'w': goto yy139; - case 'X': - case 'x': goto yy140; - case 'Y': - case 'y': goto yy141; - case '\\': goto yy142; - case '^': goto yy144; - case '_': goto yy145; - case '`': goto yy146; - case '{': goto yy148; - case '|': goto yy150; - case '}': goto yy151; - default: goto yy127; + case 'u': goto yy91; + default: goto yy82; + } +yy82: + YYDEBUG(82, *YYCURSOR); + YYCURSOR = YYMARKER; + if (yyaccept <= 3) { + if (yyaccept <= 1) { + if (yyaccept == 0) { + goto yy9; + } else { + goto yy27; + } + } else { + if (yyaccept == 2) { + goto yy36; + } else { + goto yy109; + } + } + } else { + if (yyaccept <= 5) { + if (yyaccept == 4) { + goto yy113; + } else { + goto yy122; + } + } else { + goto yy457; + } } +yy83: + YYDEBUG(83, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy195; + if (yych == 'r') goto yy195; + goto yy82; +yy84: + YYDEBUG(84, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'O') { + if (yych == 'I') goto yy196; + if (yych <= 'N') goto yy82; + goto yy197; + } else { + if (yych <= 'i') { + if (yych <= 'h') goto yy82; + goto yy196; + } else { + if (yych == 'o') goto yy197; + goto yy82; + } + } +yy85: + YYDEBUG(85, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'O') goto yy198; + if (yych == 'o') goto yy198; + goto yy82; +yy86: + YYDEBUG(86, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'L') goto yy199; + if (yych == 'l') goto yy199; + goto yy82; yy87: YYDEBUG(87, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy200; + if (yych == 'n') goto yy200; + goto yy82; +yy88: YYDEBUG(88, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2720 "Zend/zend_language_scanner.l" - { - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - - zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); - goto restart; -} -#line 2337 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'B') goto yy201; + if (yych == 'b') goto yy201; + goto yy82; yy89: YYDEBUG(89, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy202; + if (yych == 'e') goto yy202; + goto yy82; +yy90: YYDEBUG(90, *YYCURSOR); - if (yybm[0+yych] & 4) { - goto yy89; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy203; + if (yych == 't') goto yy203; + goto yy82; +yy91: YYDEBUG(91, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1409 "Zend/zend_language_scanner.l" - { - goto return_whitespace; -} -#line 2353 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy204; + if (yych == 'n') goto yy204; + goto yy82; yy92: YYDEBUG(92, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy153; -yy93: + yych = *++YYCURSOR; + if (yych == '=') goto yy205; YYDEBUG(93, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1692 "Zend/zend_language_scanner.l" +#line 1624 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(yytext[0]); + RETURN_TOKEN(T_POW); } -#line 2365 "Zend/zend_language_scanner.c" +#line 2491 "Zend/zend_language_scanner.c" yy94: YYDEBUG(94, *YYCURSOR); ++YYCURSOR; YYDEBUG(95, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2203 "Zend/zend_language_scanner.l" +#line 1620 "Zend/zend_language_scanner.l" { - int bprefix = (yytext[0] != '"') ? 1 : 0; - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '"': - yyleng = YYCURSOR - SCNG(yy_text); - if (EXPECTED(zend_scan_escape_string(zendlval, yytext+bprefix+1, yyleng-bprefix-2, '"') == SUCCESS) - || !PARSER_MODE()) { - RETURN_TOKEN_WITH_VAL(T_CONSTANT_ENCAPSED_STRING); - } else { - RETURN_TOKEN(T_ERROR); - } - case '$': - if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { - break; - } - continue; - case '{': - if (*YYCURSOR == '$') { - break; - } - continue; - case '\\': - if (YYCURSOR < YYLIMIT) { - YYCURSOR++; - } - /* fall through */ - default: - continue; - } - - YYCURSOR--; - break; - } - - /* Remember how much was scanned to save rescanning */ - SET_DOUBLE_QUOTES_SCANNED_LENGTH(YYCURSOR - SCNG(yy_text) - yyleng); - - YYCURSOR = SCNG(yy_text) + yyleng; - - BEGIN(ST_DOUBLE_QUOTES); - RETURN_TOKEN('"'); + RETURN_TOKEN(T_MUL_EQUAL); } -#line 2416 "Zend/zend_language_scanner.c" +#line 2501 "Zend/zend_language_scanner.c" yy96: YYDEBUG(96, *YYCURSOR); ++YYCURSOR; YYDEBUG(97, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2030 "Zend/zend_language_scanner.l" +#line 1576 "Zend/zend_language_scanner.l" { - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '\r': - if (*YYCURSOR == '\n') { - YYCURSOR++; - } - /* fall through */ - case '\n': - CG(zend_lineno)++; - break; - case '?': - if (*YYCURSOR == '>') { - YYCURSOR--; - break; - } - /* fall through */ - default: - continue; - } - - break; - } - - yyleng = YYCURSOR - SCNG(yy_text); - - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_COMMENT); - } - RETURN_TOKEN(T_COMMENT); + RETURN_TOKEN(T_INC); } -#line 2454 "Zend/zend_language_scanner.c" +#line 2511 "Zend/zend_language_scanner.c" yy98: YYDEBUG(98, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= '_') { - if (yych <= '@') goto yy93; - if (yych <= 'Z') goto yy155; - if (yych <= '^') goto yy93; - goto yy155; - } else { - if (yych <= '`') goto yy93; - if (yych <= 'z') goto yy155; - if (yych <= 0x7F) goto yy93; - goto yy155; - } -yy99: + ++YYCURSOR; YYDEBUG(99, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '=') goto yy158; - goto yy93; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1612 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PLUS_EQUAL); +} +#line 2521 "Zend/zend_language_scanner.c" yy100: YYDEBUG(100, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '&') goto yy160; - if (yych == '=') goto yy162; - goto yy93; -yy101: - YYDEBUG(101, *YYCURSOR); ++YYCURSOR; - YYDEBUG(102, *YYCURSOR); + YYDEBUG(101, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2113 "Zend/zend_language_scanner.l" - { - register char *s, *t; - char *end; - int bprefix = (yytext[0] != '\'') ? 1 : 0; - - while (1) { - if (YYCURSOR < YYLIMIT) { - if (*YYCURSOR == '\'') { - YYCURSOR++; - yyleng = YYCURSOR - SCNG(yy_text); - - break; - } else if (*YYCURSOR++ == '\\' && YYCURSOR < YYLIMIT) { - YYCURSOR++; - } - } else { - yyleng = YYLIMIT - SCNG(yy_text); - - /* Unclosed single quotes; treat similar to double quotes, but without a separate token - * for ' (unrecognized by parser), instead of old flex fallback to "Unexpected character..." - * rule, which continued in ST_IN_SCRIPTING state after the quote */ - ZVAL_NULL(zendlval); - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); - } - } - - if (yyleng-bprefix-2 <= 1) { - if (yyleng-bprefix-2 < 1) { - ZVAL_EMPTY_STRING(zendlval); - } else { - zend_uchar c = (zend_uchar)*(yytext+bprefix+1); - if (c == '\n' || c == '\r') { - CG(zend_lineno)++; - } - ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR(c)); - } - goto skip_escape_conversion; - } - ZVAL_STRINGL(zendlval, yytext+bprefix+1, yyleng-bprefix-2); - - /* convert escape sequences */ - s = Z_STRVAL_P(zendlval); - end = s+Z_STRLEN_P(zendlval); - while (1) { - if (UNEXPECTED(*s=='\\')) { - break; - } - if (*s == '\n' || (*s == '\r' && (*(s+1) != '\n'))) { - CG(zend_lineno)++; - } - s++; - if (s == end) { - goto skip_escape_conversion; - } - } - - t = s; - while (s 2) { + doc_com = 1; + RESET_DOC_COMMENT(); + } else { + doc_com = 0; + } + + while (YYCURSOR < YYLIMIT) { + if (*YYCURSOR++ == '*' && *YYCURSOR == '/') { + break; } - if (yych <= 'D') { - if (yych == '.') goto yy191; - goto yy111; - } else { - if (yych <= 'E') goto yy201; - if (yych == 'e') goto yy201; - goto yy111; + } + + if (YYCURSOR < YYLIMIT) { + YYCURSOR++; + } else { + zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); + } + + yyleng = YYCURSOR - SCNG(yy_text); + HANDLE_NEWLINES(yytext, yyleng); + + if (doc_com) { + CG(doc_comment) = zend_string_init(yytext, yyleng, 0); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_DOC_COMMENT); } + RETURN_TOKEN(T_DOC_COMMENT); + } + + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_COMMENT); + } + RETURN_TOKEN(T_COMMENT); +} +#line 2642 "Zend/zend_language_scanner.c" yy114: YYDEBUG(114, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == ':') goto yy203; - goto yy93; -yy115: + ++YYCURSOR; YYDEBUG(115, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= ';') goto yy93; - if (yych <= '<') goto yy205; - if (yych <= '=') goto yy207; - if (yych <= '>') goto yy209; - goto yy93; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1632 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DIV_EQUAL); +} +#line 2652 "Zend/zend_language_scanner.c" yy116: YYDEBUG(116, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy93; - if (yych <= '=') goto yy210; - if (yych <= '>') goto yy212; - goto yy93; + if (yybm[0+yych] & 64) { + goto yy210; + } + goto yy82; yy117: YYDEBUG(117, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '<') goto yy93; - if (yych <= '=') goto yy214; - if (yych <= '>') goto yy216; - goto yy93; + if (yych <= ',') { + if (yych == '+') goto yy213; + goto yy82; + } else { + if (yych <= '-') goto yy213; + if (yych <= '/') goto yy82; + if (yych <= '9') goto yy214; + goto yy82; + } yy118: YYDEBUG(118, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '=') goto yy93; - if (yych <= '>') goto yy218; - if (yych <= '?') goto yy220; - goto yy93; + if (yybm[0+yych] & 128) { + goto yy216; + } + goto yy82; yy119: YYDEBUG(119, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) <= 'S') { - if (yych <= 'M') { - if (yych == 'B') goto yy222; - goto yy128; - } else { - if (yych <= 'N') goto yy223; - if (yych <= 'Q') goto yy128; - if (yych <= 'R') goto yy224; - goto yy225; - } - } else { - if (yych <= 'n') { - if (yych == 'b') goto yy222; - if (yych <= 'm') goto yy128; - goto yy223; - } else { - if (yych <= 'q') goto yy128; - if (yych <= 'r') goto yy224; - if (yych <= 's') goto yy225; - goto yy128; - } - } -yy120: YYDEBUG(120, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2025 "Zend/zend_language_scanner.l" +#line 1428 "Zend/zend_language_scanner.l" { - RETURN_TOKEN_WITH_STR(T_STRING, 0); + RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); } -#line 2840 "Zend/zend_language_scanner.c" +#line 2688 "Zend/zend_language_scanner.c" yy121: YYDEBUG(121, *YYCURSOR); - yyaccept = 2; + yyaccept = 5; yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') { - if (yych <= '"') { - if (yych <= '!') goto yy128; - goto yy94; - } else { - if (yych == '\'') goto yy101; - goto yy128; - } - } else { - if (yych <= 'R') { - if (yych <= '<') goto yy227; - if (yych <= 'Q') goto yy128; - goto yy228; - } else { - if (yych == 'r') goto yy228; - goto yy128; - } - } + if (yych <= ';') goto yy122; + if (yych <= '<') goto yy219; + if (yych <= '=') goto yy221; yy122: YYDEBUG(122, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych <= 'K') { - if (yych == 'A') goto yy229; - goto yy128; - } else { - if (yych <= 'L') goto yy230; - if (yych <= 'N') goto yy128; - goto yy231; - } - } else { - if (yych <= 'k') { - if (yych == 'a') goto yy229; - goto yy128; - } else { - if (yych <= 'l') goto yy230; - if (yych == 'o') goto yy231; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1684 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SL); +} +#line 2703 "Zend/zend_language_scanner.c" yy123: YYDEBUG(123, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych <= 'H') { - if (yych == 'E') goto yy232; - goto yy128; - } else { - if (yych <= 'I') goto yy233; - if (yych <= 'N') goto yy128; - goto yy234; - } - } else { - if (yych <= 'h') { - if (yych == 'e') goto yy232; - goto yy128; - } else { - if (yych <= 'i') goto yy233; - if (yych == 'o') goto yy234; - goto yy128; - } - } -yy124: + if (yych == '>') goto yy223; YYDEBUG(124, *YYCURSOR); - yych = *++YYCURSOR; - switch (yych) { - case 'C': - case 'c': goto yy236; - case 'L': - case 'l': goto yy237; - case 'M': - case 'm': goto yy238; - case 'N': - case 'n': goto yy239; - case 'V': - case 'v': goto yy240; - case 'X': - case 'x': goto yy241; - default: goto yy128; - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1604 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); +} +#line 2714 "Zend/zend_language_scanner.c" yy125: YYDEBUG(125, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych <= 'N') { - if (yych == 'I') goto yy242; - goto yy128; - } else { - if (yych <= 'O') goto yy243; - if (yych <= 'T') goto yy128; - goto yy244; - } - } else { - if (yych <= 'n') { - if (yych == 'i') goto yy242; - goto yy128; - } else { - if (yych <= 'o') goto yy243; - if (yych == 'u') goto yy244; - goto yy128; - } - } + ++YYCURSOR; + goto yy70; yy126: YYDEBUG(126, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'L') goto yy245; - if (yych <= 'N') goto yy128; - goto yy246; - } else { - if (yych <= 'l') { - if (yych <= 'k') goto yy128; - goto yy245; - } else { - if (yych == 'o') goto yy246; - goto yy128; - } - } -yy127: - YYDEBUG(127, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == '=') goto yy225; + YYDEBUG(127, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1592 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_EQUAL); +} +#line 2729 "Zend/zend_language_scanner.c" yy128: YYDEBUG(128, *YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy127; - } - goto yy120; -yy129: + ++YYCURSOR; YYDEBUG(129, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'S') { - if (yych <= 'L') { - if (yych == 'F') goto yy247; - goto yy128; - } else { - if (yych <= 'M') goto yy249; - if (yych <= 'N') goto yy250; - if (yych <= 'R') goto yy128; - goto yy251; - } - } else { - if (yych <= 'm') { - if (yych == 'f') goto yy247; - if (yych <= 'l') goto yy128; - goto yy249; - } else { - if (yych <= 'n') goto yy250; - if (yych == 's') goto yy251; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1560 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DOUBLE_ARROW); +} +#line 2739 "Zend/zend_language_scanner.c" yy130: YYDEBUG(130, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy252; - if (yych == 'i') goto yy252; - goto yy128; -yy131: + ++YYCURSOR; YYDEBUG(131, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'E') { - if (yych == 'A') goto yy253; - if (yych <= 'D') goto yy128; - goto yy254; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy253; - } else { - if (yych == 'e') goto yy254; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1608 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); +} +#line 2749 "Zend/zend_language_scanner.c" yy132: YYDEBUG(132, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy255; - if (yych == 'r') goto yy255; - goto yy128; -yy133: + if (yych == '=') goto yy227; YYDEBUG(133, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'R') goto yy257; - if (yych <= 'T') goto yy128; - goto yy258; - } else { - if (yych <= 'r') { - if (yych <= 'q') goto yy128; - goto yy257; - } else { - if (yych == 'u') goto yy258; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1688 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SR); +} +#line 2760 "Zend/zend_language_scanner.c" yy134: YYDEBUG(134, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy259; - if (yych == 'e') goto yy259; - goto yy128; + if (yych == '\n') goto yy229; + if (yych == '\r') goto yy230; yy135: YYDEBUG(135, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'W') { - if (yych == 'T') goto yy260; - if (yych <= 'V') goto yy128; - goto yy261; - } else { - if (yych <= 't') { - if (yych <= 's') goto yy128; - goto yy260; - } else { - if (yych == 'w') goto yy261; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 2101 "Zend/zend_language_scanner.l" + { + BEGIN(INITIAL); + if (yytext[yyleng-1] != '>') { + CG(increment_lineno) = 1; + } + if (PARSER_MODE()) { + RETURN_TOKEN(';'); /* implicit ';' at php-end tag */ + } + RETURN_TOKEN(T_CLOSE_TAG); +} +#line 2780 "Zend/zend_language_scanner.c" yy136: YYDEBUG(136, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'R') { - if (yych == 'H') goto yy262; - if (yych <= 'Q') goto yy128; - goto yy263; - } else { - if (yych <= 'h') { - if (yych <= 'g') goto yy128; - goto yy262; - } else { - if (yych == 'r') goto yy263; - goto yy128; - } - } -yy137: + ++YYCURSOR; YYDEBUG(137, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'S') { - if (yych == 'N') goto yy264; - if (yych <= 'R') goto yy128; - goto yy265; - } else { - if (yych <= 'n') { - if (yych <= 'm') goto yy128; - goto yy264; - } else { - if (yych == 's') goto yy265; - goto yy128; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1440 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_COALESCE); +} +#line 2790 "Zend/zend_language_scanner.c" yy138: YYDEBUG(138, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy266; - if (yych == 'a') goto yy266; - goto yy128; + if (yych == 'S') goto yy231; + if (yych == 's') goto yy231; + goto yy44; yy139: YYDEBUG(139, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy267; - if (yych == 'h') goto yy267; - goto yy128; + if (yych == 'D') goto yy232; + if (yych == 'd') goto yy232; + goto yy44; yy140: YYDEBUG(140, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy268; - if (yych == 'o') goto yy268; - goto yy128; + if (yych == 'R') goto yy234; + if (yych == 'r') goto yy234; + goto yy44; yy141: YYDEBUG(141, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy269; - if (yych == 'i') goto yy269; - goto yy128; -yy142: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(142, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(143, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1432 "Zend/zend_language_scanner.l" +#line 1344 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NS_SEPARATOR); + RETURN_TOKEN(T_AS); } -#line 3129 "Zend/zend_language_scanner.c" +#line 2821 "Zend/zend_language_scanner.c" +yy143: + YYDEBUG(143, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '<') goto yy235; + goto yy82; yy144: YYDEBUG(144, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy270; - goto yy93; + if (yych == 'E') goto yy236; + if (yych == 'e') goto yy236; + goto yy44; yy145: YYDEBUG(145, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy272; - goto yy128; + if (yych <= 'T') { + if (yych <= 'L') { + if (yych <= 'K') goto yy44; + goto yy237; + } else { + if (yych <= 'R') goto yy44; + if (yych <= 'S') goto yy238; + goto yy239; + } + } else { + if (yych <= 'r') { + if (yych == 'l') goto yy237; + goto yy44; + } else { + if (yych <= 's') goto yy238; + if (yych <= 't') goto yy239; + goto yy44; + } + } yy146: YYDEBUG(146, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= 'O') { + if (yych == 'A') goto yy240; + if (yych <= 'N') goto yy44; + goto yy241; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy44; + goto yy240; + } else { + if (yych == 'o') goto yy241; + goto yy44; + } + } +yy147: YYDEBUG(147, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2380 "Zend/zend_language_scanner.l" - { - BEGIN(ST_BACKQUOTE); - RETURN_TOKEN('`'); -} -#line 3150 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy242; + if (yych == 'n') goto yy242; + goto yy44; yy148: YYDEBUG(148, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= 'F') { + if (yych == 'C') goto yy243; + if (yych <= 'E') goto yy44; + goto yy244; + } else { + if (yych <= 'c') { + if (yych <= 'b') goto yy44; + goto yy243; + } else { + if (yych == 'f') goto yy244; + goto yy44; + } + } +yy149: YYDEBUG(149, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1697 "Zend/zend_language_scanner.l" - { - yy_push_state(ST_IN_SCRIPTING); - RETURN_TOKEN('{'); -} -#line 3161 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy245; + if (yych == 'e') goto yy245; + goto yy44; yy150: YYDEBUG(150, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '=') goto yy273; - if (yych == '|') goto yy275; - goto yy93; -yy151: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(151, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(152, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1709 "Zend/zend_language_scanner.l" +#line 1312 "Zend/zend_language_scanner.l" { - RESET_DOC_COMMENT(); - if (!zend_stack_is_empty(&SCNG(state_stack))) { - yy_pop_state(); - } - RETURN_TOKEN('}'); + RETURN_TOKEN(T_DO); } -#line 3181 "Zend/zend_language_scanner.c" +#line 2911 "Zend/zend_language_scanner.c" +yy152: + YYDEBUG(152, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'H') goto yy247; + if (yych == 'h') goto yy247; + goto yy44; yy153: YYDEBUG(153, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy277; + yych = *++YYCURSOR; + if (yych == 'S') goto yy248; + if (yych == 's') goto yy248; + goto yy44; yy154: YYDEBUG(154, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1596 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_NOT_EQUAL); -} -#line 3193 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'P') goto yy249; + if (yych == 'p') goto yy249; + goto yy44; yy155: YYDEBUG(155, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'D') goto yy250; + if (yych == 'd') goto yy250; + goto yy44; +yy156: YYDEBUG(156, *YYCURSOR); - if (yych <= '^') { - if (yych <= '9') { - if (yych >= '0') goto yy155; - } else { - if (yych <= '@') goto yy157; - if (yych <= 'Z') goto yy155; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy251; + if (yych == 'a') goto yy251; + goto yy44; +yy157: + YYDEBUG(157, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= 'T') { + if (yych == 'I') goto yy252; + if (yych <= 'S') goto yy44; + goto yy253; } else { - if (yych <= '`') { - if (yych <= '_') goto yy155; + if (yych <= 'i') { + if (yych <= 'h') goto yy44; + goto yy252; } else { - if (yych <= 'z') goto yy155; - if (yych >= 0x80) goto yy155; + if (yych == 't') goto yy253; + goto yy44; } } -yy157: - YYDEBUG(157, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2003 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); -} -#line 3222 "Zend/zend_language_scanner.c" yy158: YYDEBUG(158, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy254; + if (yych == 'n') goto yy254; + goto yy44; +yy159: YYDEBUG(159, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1640 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_MOD_EQUAL); -} -#line 3232 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy255; + if (yych == 'r') goto yy255; + goto yy44; yy160: YYDEBUG(160, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy257; + if (yych == 'n') goto yy257; + goto yy44; +yy161: YYDEBUG(161, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1668 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BOOLEAN_AND); -} -#line 3242 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy258; + if (yych == 'o') goto yy258; + goto yy44; yy162: YYDEBUG(162, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'T') goto yy259; + if (yych == 't') goto yy259; + goto yy44; +yy163: YYDEBUG(163, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(164, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1652 "Zend/zend_language_scanner.l" +#line 1288 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_AND_EQUAL); + RETURN_TOKEN(T_IF); } -#line 3252 "Zend/zend_language_scanner.c" -yy164: - YYDEBUG(164, *YYCURSOR); - ++YYCURSOR; - YYFILL(7); - yych = *YYCURSOR; +#line 3000 "Zend/zend_language_scanner.c" yy165: YYDEBUG(165, *YYCURSOR); - if (yybm[0+yych] & 32) { - goto yy164; - } - switch (yych) { - case 'A': - case 'a': goto yy167; - case 'B': - case 'b': goto yy168; - case 'D': - case 'd': goto yy169; - case 'F': - case 'f': goto yy170; - case 'I': - case 'i': goto yy171; - case 'O': - case 'o': goto yy172; - case 'R': - case 'r': goto yy173; - case 'S': - case 's': goto yy174; - case 'U': - case 'u': goto yy175; - default: goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'P') goto yy260; + if (yych == 'p') goto yy260; + goto yy44; yy166: YYDEBUG(166, *YYCURSOR); - YYCURSOR = YYMARKER; - if (yyaccept <= 3) { - if (yyaccept <= 1) { - if (yyaccept == 0) { - goto yy93; - } else { - goto yy111; - } + yych = *++YYCURSOR; + if (yych <= 'T') { + if (yych <= 'C') { + if (yych <= 'B') goto yy44; + goto yy261; } else { - if (yyaccept == 2) { - goto yy120; - } else { - goto yy193; - } + if (yych <= 'R') goto yy44; + if (yych <= 'S') goto yy262; + goto yy263; } } else { - if (yyaccept <= 5) { - if (yyaccept == 4) { - goto yy197; - } else { - goto yy206; - } + if (yych <= 'r') { + if (yych == 'c') goto yy261; + goto yy44; } else { - goto yy541; + if (yych <= 's') goto yy262; + if (yych <= 't') goto yy263; + goto yy44; } } yy167: YYDEBUG(167, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy279; - if (yych == 'r') goto yy279; - goto yy166; + if (yych == 'S') goto yy264; + if (yych == 's') goto yy264; + goto yy44; yy168: YYDEBUG(168, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'I') goto yy280; - if (yych <= 'N') goto yy166; - goto yy281; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy166; - goto yy280; - } else { - if (yych == 'o') goto yy281; - goto yy166; - } - } + if (yych == 'S') goto yy265; + if (yych == 's') goto yy265; + goto yy44; yy169: YYDEBUG(169, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy282; - if (yych == 'o') goto yy282; - goto yy166; + if (yych == 'M') goto yy266; + if (yych == 'm') goto yy266; + goto yy44; yy170: YYDEBUG(170, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy283; - if (yych == 'l') goto yy283; - goto yy166; + if (yych == 'W') goto yy267; + if (yych == 'w') goto yy267; + goto yy44; yy171: YYDEBUG(171, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy284; - if (yych == 'n') goto yy284; - goto yy166; -yy172: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(172, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy285; - if (yych == 'b') goto yy285; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1672 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_LOGICAL_OR); +} +#line 3065 "Zend/zend_language_scanner.c" yy173: YYDEBUG(173, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy286; - if (yych == 'e') goto yy286; - goto yy166; + if (yych <= 'O') { + if (yych == 'I') goto yy269; + if (yych <= 'N') goto yy44; + goto yy270; + } else { + if (yych <= 'i') { + if (yych <= 'h') goto yy44; + goto yy269; + } else { + if (yych == 'o') goto yy270; + goto yy44; + } + } yy174: YYDEBUG(174, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy287; - if (yych == 't') goto yy287; - goto yy166; + if (yych == 'B') goto yy271; + if (yych == 'b') goto yy271; + goto yy44; yy175: YYDEBUG(175, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy288; - if (yych == 'n') goto yy288; - goto yy166; + if (yych <= 'T') { + if (yych == 'Q') goto yy272; + if (yych <= 'S') goto yy44; + goto yy273; + } else { + if (yych <= 'q') { + if (yych <= 'p') goto yy44; + goto yy272; + } else { + if (yych == 't') goto yy273; + goto yy44; + } + } yy176: YYDEBUG(176, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy289; + yych = *++YYCURSOR; + if (yych == 'A') goto yy274; + if (yych == 'a') goto yy274; + goto yy44; +yy177: YYDEBUG(177, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1624 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_POW); -} -#line 3386 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy275; + if (yych == 'i') goto yy275; + goto yy44; yy178: YYDEBUG(178, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy276; + if (yych == 'r') goto yy276; + goto yy44; +yy179: YYDEBUG(179, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1620 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_MUL_EQUAL); -} -#line 3396 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych <= 'Y') { + if (yych == 'A') goto yy277; + if (yych <= 'X') goto yy44; + goto yy278; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy44; + goto yy277; + } else { + if (yych == 'y') goto yy278; + goto yy44; + } + } yy180: YYDEBUG(180, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'S') goto yy280; + if (yych == 's') goto yy280; + goto yy44; +yy181: YYDEBUG(181, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1576 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INC); -} -#line 3406 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy281; + if (yych == 'e') goto yy281; + goto yy44; yy182: YYDEBUG(182, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy283; + if (yych == 'r') goto yy283; + goto yy44; +yy183: YYDEBUG(183, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1612 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PLUS_EQUAL); -} -#line 3416 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy285; + if (yych == 'i') goto yy285; + goto yy44; yy184: YYDEBUG(184, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy286; + if (yych == 'r') goto yy286; + goto yy44; +yy185: YYDEBUG(185, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1580 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DEC); -} -#line 3426 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy288; + if (yych == 'e') goto yy288; + goto yy44; yy186: YYDEBUG(186, *YYCURSOR); ++YYCURSOR; YYDEBUG(187, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1616 "Zend/zend_language_scanner.l" +#line 1660 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_MINUS_EQUAL); + RETURN_TOKEN(T_XOR_EQUAL); } -#line 3436 "Zend/zend_language_scanner.c" +#line 3183 "Zend/zend_language_scanner.c" yy188: YYDEBUG(188, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + switch (yych) { + case 'C': + case 'c': goto yy289; + case 'D': + case 'd': goto yy290; + case 'F': + case 'f': goto yy291; + case 'H': + case 'h': goto yy292; + case 'L': + case 'l': goto yy293; + case 'M': + case 'm': goto yy294; + case 'N': + case 'n': goto yy295; + case 'T': + case 't': goto yy296; + default: goto yy44; + } +yy189: YYDEBUG(189, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(190, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1404 "Zend/zend_language_scanner.l" +#line 1656 "Zend/zend_language_scanner.l" { - yy_push_state(ST_LOOKING_FOR_PROPERTY); - RETURN_TOKEN(T_OBJECT_OPERATOR); + RETURN_TOKEN(T_OR_EQUAL); } -#line 3447 "Zend/zend_language_scanner.c" -yy190: - YYDEBUG(190, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '.') goto yy291; - goto yy166; +#line 3215 "Zend/zend_language_scanner.c" yy191: YYDEBUG(191, *YYCURSOR); - yyaccept = 3; - YYMARKER = ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; + ++YYCURSOR; YYDEBUG(192, *YYCURSOR); - if (yych <= 'D') { - if (yych <= '/') goto yy193; - if (yych <= '9') goto yy191; - } else { - if (yych <= 'E') goto yy201; - if (yych == 'e') goto yy201; - } -yy193: - YYDEBUG(193, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1865 "Zend/zend_language_scanner.l" +#line 1664 "Zend/zend_language_scanner.l" { - const char *end; - - ZVAL_DOUBLE(zendlval, zend_strtod(yytext, &end)); - /* errno isn't checked since we allow HUGE_VAL/INF overflow */ - ZEND_ASSERT(end == yytext + yyleng); - RETURN_TOKEN_WITH_VAL(T_DNUMBER); + RETURN_TOKEN(T_BOOLEAN_OR); } -#line 3479 "Zend/zend_language_scanner.c" -yy194: - YYDEBUG(194, *YYCURSOR); +#line 3225 "Zend/zend_language_scanner.c" +yy193: + YYDEBUG(193, *YYCURSOR); ++YYCURSOR; - YYDEBUG(195, *YYCURSOR); + YYDEBUG(194, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1636 "Zend/zend_language_scanner.l" +#line 1588 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CONCAT_EQUAL); + RETURN_TOKEN(T_IS_NOT_IDENTICAL); } -#line 3489 "Zend/zend_language_scanner.c" +#line 3235 "Zend/zend_language_scanner.c" +yy195: + YYDEBUG(195, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'R') goto yy297; + if (yych == 'r') goto yy297; + goto yy82; yy196: YYDEBUG(196, *YYCURSOR); - yyaccept = 4; - yych = *(YYMARKER = ++YYCURSOR); - if (yych == '*') goto yy293; + yych = *++YYCURSOR; + if (yych == 'N') goto yy298; + if (yych == 'n') goto yy298; + goto yy82; yy197: YYDEBUG(197, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2062 "Zend/zend_language_scanner.l" - { - int doc_com; - - if (yyleng > 2) { - doc_com = 1; - RESET_DOC_COMMENT(); - } else { - doc_com = 0; - } - - while (YYCURSOR < YYLIMIT) { - if (*YYCURSOR++ == '*' && *YYCURSOR == '/') { - break; - } - } - - if (YYCURSOR < YYLIMIT) { - YYCURSOR++; - } else { - zend_error(E_COMPILE_WARNING, "Unterminated comment starting line %d", CG(zend_lineno)); - } - - yyleng = YYCURSOR - SCNG(yy_text); - HANDLE_NEWLINES(yytext, yyleng); - - if (doc_com) { - CG(doc_comment) = zend_string_init(yytext, yyleng, 0); - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_DOC_COMMENT); - } - RETURN_TOKEN(T_DOC_COMMENT); - } - - if (EXPECTED(elem != NULL)) { - SKIP_TOKEN(T_COMMENT); - } - RETURN_TOKEN(T_COMMENT); -} -#line 3537 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy299; + if (yych == 'o') goto yy299; + goto yy82; yy198: YYDEBUG(198, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'U') goto yy300; + if (yych == 'u') goto yy300; + goto yy82; +yy199: YYDEBUG(199, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1632 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DIV_EQUAL); -} -#line 3547 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy301; + if (yych == 'o') goto yy301; + goto yy82; yy200: YYDEBUG(200, *YYCURSOR); yych = *++YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy294; - } - goto yy166; + if (yych == 'T') goto yy302; + if (yych == 't') goto yy302; + goto yy82; yy201: YYDEBUG(201, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= ',') { - if (yych == '+') goto yy297; - goto yy166; - } else { - if (yych <= '-') goto yy297; - if (yych <= '/') goto yy166; - if (yych <= '9') goto yy298; - goto yy166; - } + if (yych == 'J') goto yy303; + if (yych == 'j') goto yy303; + goto yy82; yy202: YYDEBUG(202, *YYCURSOR); yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy300; - } - goto yy166; + if (yych == 'A') goto yy304; + if (yych == 'a') goto yy304; + goto yy82; yy203: YYDEBUG(203, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'R') goto yy305; + if (yych == 'r') goto yy305; + goto yy82; +yy204: YYDEBUG(204, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1428 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PAAMAYIM_NEKUDOTAYIM); -} -#line 3583 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy306; + if (yych == 's') goto yy306; + goto yy82; yy205: YYDEBUG(205, *YYCURSOR); - yyaccept = 5; - yych = *(YYMARKER = ++YYCURSOR); - if (yych <= ';') goto yy206; - if (yych <= '<') goto yy303; - if (yych <= '=') goto yy305; -yy206: + ++YYCURSOR; YYDEBUG(206, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1684 "Zend/zend_language_scanner.l" +#line 1628 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_SL); + RETURN_TOKEN(T_POW_EQUAL); } -#line 3598 "Zend/zend_language_scanner.c" +#line 3305 "Zend/zend_language_scanner.c" yy207: YYDEBUG(207, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '>') goto yy307; YYDEBUG(208, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1604 "Zend/zend_language_scanner.l" +#line 1436 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IS_SMALLER_OR_EQUAL); + RETURN_TOKEN(T_ELLIPSIS); } -#line 3609 "Zend/zend_language_scanner.c" +#line 3315 "Zend/zend_language_scanner.c" yy209: YYDEBUG(209, *YYCURSOR); yych = *++YYCURSOR; - goto yy154; + if (yych <= '\f') { + if (yych <= 0x08) goto yy82; + if (yych <= '\n') goto yy307; + goto yy82; + } else { + if (yych <= '\r') goto yy307; + if (yych == ' ') goto yy307; + goto yy82; + } yy210: YYDEBUG(210, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy309; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(211, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1592 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_EQUAL); -} -#line 3624 "Zend/zend_language_scanner.c" -yy212: + if (yybm[0+yych] & 64) { + goto yy210; + } YYDEBUG(212, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(213, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1560 "Zend/zend_language_scanner.l" +#line 1733 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DOUBLE_ARROW); + char *bin = yytext + 2; /* Skip "0b" */ + int len = yyleng - 2; + char *end; + + /* Skip any leading 0s */ + while (*bin == '0') { + ++bin; + --len; + } + + if (len < SIZEOF_ZEND_LONG * 8) { + if (len == 0) { + ZVAL_LONG(zendlval, 0); + } else { + errno = 0; + ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2)); + ZEND_ASSERT(!errno && end == yytext + yyleng); + } + RETURN_TOKEN_WITH_VAL(T_LNUMBER); + } else { + ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, (const char **)&end)); + /* errno isn't checked since we allow HUGE_VAL/INF overflow */ + ZEND_ASSERT(end == yytext + yyleng); + RETURN_TOKEN_WITH_VAL(T_DNUMBER); + } } -#line 3634 "Zend/zend_language_scanner.c" +#line 3367 "Zend/zend_language_scanner.c" +yy213: + YYDEBUG(213, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '/') goto yy82; + if (yych >= ':') goto yy82; yy214: YYDEBUG(214, *YYCURSOR); ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(215, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1608 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_GREATER_OR_EQUAL); -} -#line 3644 "Zend/zend_language_scanner.c" + if (yych <= '/') goto yy109; + if (yych <= '9') goto yy214; + goto yy109; yy216: YYDEBUG(216, *YYCURSOR); ++YYCURSOR; - if ((yych = *YYCURSOR) == '=') goto yy311; - YYDEBUG(217, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1688 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SR); -} -#line 3655 "Zend/zend_language_scanner.c" -yy218: + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(217, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy216; + } YYDEBUG(218, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) == '\n') goto yy313; - if (yych == '\r') goto yy314; -yy219: - YYDEBUG(219, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 2101 "Zend/zend_language_scanner.l" +#line 1812 "Zend/zend_language_scanner.l" { - BEGIN(INITIAL); - if (yytext[yyleng-1] != '>') { - CG(increment_lineno) = 1; + char *hex = yytext + 2; /* Skip "0x" */ + int len = yyleng - 2; + char *end; + + /* Skip any leading 0s */ + while (*hex == '0') { + hex++; + len--; } - if (PARSER_MODE()) { - RETURN_TOKEN(';'); /* implicit ';' at php-end tag */ + + if (len < SIZEOF_ZEND_LONG * 2 || (len == SIZEOF_ZEND_LONG * 2 && *hex <= '7')) { + if (len == 0) { + ZVAL_LONG(zendlval, 0); + } else { + errno = 0; + ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16)); + ZEND_ASSERT(!errno && end == hex + len); + } + RETURN_TOKEN_WITH_VAL(T_LNUMBER); + } else { + ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, (const char **)&end)); + /* errno isn't checked since we allow HUGE_VAL/INF overflow */ + ZEND_ASSERT(end == hex + len); + RETURN_TOKEN_WITH_VAL(T_DNUMBER); } - RETURN_TOKEN(T_CLOSE_TAG); } -#line 3675 "Zend/zend_language_scanner.c" -yy220: - YYDEBUG(220, *YYCURSOR); +#line 3421 "Zend/zend_language_scanner.c" +yy219: + YYDEBUG(219, *YYCURSOR); ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; + YYDEBUG(220, *YYCURSOR); + if (yych <= '\'') { + if (yych <= ' ') { + if (yych == '\t') goto yy219; + if (yych <= 0x1F) goto yy82; + goto yy219; + } else { + if (yych == '"') goto yy309; + if (yych <= '&') goto yy82; + goto yy310; + } + } else { + if (yych <= '_') { + if (yych <= '@') goto yy82; + if (yych <= 'Z') goto yy311; + if (yych <= '^') goto yy82; + goto yy311; + } else { + if (yych <= '`') goto yy82; + if (yych <= 'z') goto yy311; + if (yych <= 0x7F) goto yy82; + goto yy311; + } + } +yy221: YYDEBUG(221, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(222, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1440 "Zend/zend_language_scanner.l" +#line 1644 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_COALESCE); + RETURN_TOKEN(T_SL_EQUAL); } -#line 3685 "Zend/zend_language_scanner.c" -yy222: - YYDEBUG(222, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy315; - if (yych == 's') goto yy315; - goto yy128; +#line 3460 "Zend/zend_language_scanner.c" yy223: YYDEBUG(223, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy316; - if (yych == 'd') goto yy316; - goto yy128; -yy224: + ++YYCURSOR; YYDEBUG(224, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy318; - if (yych == 'r') goto yy318; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1600 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SPACESHIP); +} +#line 3470 "Zend/zend_language_scanner.c" yy225: YYDEBUG(225, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(226, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1344 "Zend/zend_language_scanner.l" +#line 1584 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_AS); + RETURN_TOKEN(T_IS_IDENTICAL); } -#line 3716 "Zend/zend_language_scanner.c" +#line 3480 "Zend/zend_language_scanner.c" yy227: YYDEBUG(227, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '<') goto yy319; - goto yy166; -yy228: + ++YYCURSOR; YYDEBUG(228, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy320; - if (yych == 'e') goto yy320; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1648 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SR_EQUAL); +} +#line 3490 "Zend/zend_language_scanner.c" yy229: YYDEBUG(229, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'L') { - if (yych <= 'K') goto yy128; - goto yy321; - } else { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy322; - goto yy323; - } - } else { - if (yych <= 'r') { - if (yych == 'l') goto yy321; - goto yy128; - } else { - if (yych <= 's') goto yy322; - if (yych <= 't') goto yy323; - goto yy128; - } - } + ++YYCURSOR; + goto yy135; yy230: YYDEBUG(230, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'A') goto yy324; - if (yych <= 'N') goto yy128; - goto yy325; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy324; - } else { - if (yych == 'o') goto yy325; - goto yy128; - } - } + if (yych == '\n') goto yy229; + goto yy135; yy231: YYDEBUG(231, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy326; - if (yych == 'n') goto yy326; - goto yy128; + if (yych == 'T') goto yy313; + if (yych == 't') goto yy313; + goto yy44; yy232: YYDEBUG(232, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'F') { - if (yych == 'C') goto yy327; - if (yych <= 'E') goto yy128; - goto yy328; - } else { - if (yych <= 'c') { - if (yych <= 'b') goto yy128; - goto yy327; - } else { - if (yych == 'f') goto yy328; - goto yy128; - } + if (yybm[0+yych] & 16) { + goto yy43; } -yy233: YYDEBUG(233, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy329; - if (yych == 'e') goto yy329; - goto yy128; -yy234: - YYDEBUG(234, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(235, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1312 "Zend/zend_language_scanner.l" +#line 1676 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DO); + RETURN_TOKEN(T_LOGICAL_AND); } -#line 3806 "Zend/zend_language_scanner.c" +#line 3518 "Zend/zend_language_scanner.c" +yy234: + YYDEBUG(234, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy314; + if (yych == 'a') goto yy314; + goto yy44; +yy235: + YYDEBUG(235, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '<') goto yy219; + goto yy82; yy236: YYDEBUG(236, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy331; - if (yych == 'h') goto yy331; - goto yy128; + if (yych == 'A') goto yy315; + if (yych == 'a') goto yy315; + goto yy44; yy237: YYDEBUG(237, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy332; - if (yych == 's') goto yy332; - goto yy128; + if (yych == 'L') goto yy316; + if (yych == 'l') goto yy316; + goto yy44; yy238: YYDEBUG(238, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy333; - if (yych == 'p') goto yy333; - goto yy128; + if (yych == 'E') goto yy317; + if (yych == 'e') goto yy317; + goto yy44; yy239: YYDEBUG(239, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy334; - if (yych == 'd') goto yy334; - goto yy128; + if (yych == 'C') goto yy319; + if (yych == 'c') goto yy319; + goto yy44; yy240: YYDEBUG(240, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy335; - if (yych == 'a') goto yy335; - goto yy128; + if (yych == 'S') goto yy320; + if (yych == 's') goto yy320; + goto yy44; yy241: YYDEBUG(241, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych == 'I') goto yy336; - if (yych <= 'S') goto yy128; - goto yy337; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy336; - } else { - if (yych == 't') goto yy337; - goto yy128; - } - } + if (yych == 'N') goto yy321; + if (yych == 'n') goto yy321; + goto yy44; yy242: YYDEBUG(242, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy338; - if (yych == 'n') goto yy338; - goto yy128; + if (yych <= 'T') { + if (yych <= 'R') goto yy44; + if (yych <= 'S') goto yy322; + goto yy323; + } else { + if (yych <= 'r') goto yy44; + if (yych <= 's') goto yy322; + if (yych <= 't') goto yy323; + goto yy44; + } yy243: YYDEBUG(243, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy339; - if (yych == 'r') goto yy339; - goto yy128; + if (yych == 'L') goto yy324; + if (yych == 'l') goto yy324; + goto yy44; yy244: YYDEBUG(244, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy341; - if (yych == 'n') goto yy341; - goto yy128; + if (yych == 'A') goto yy325; + if (yych == 'a') goto yy325; + goto yy44; yy245: YYDEBUG(245, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy342; - if (yych == 'o') goto yy342; - goto yy128; -yy246: - YYDEBUG(246, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy343; - if (yych == 't') goto yy343; - goto yy128; -yy247: - YYDEBUG(247, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(248, *YYCURSOR); + YYDEBUG(246, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1288 "Zend/zend_language_scanner.l" +#line 1246 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IF); + RETURN_TOKEN(T_EXIT); } -#line 3895 "Zend/zend_language_scanner.c" +#line 3603 "Zend/zend_language_scanner.c" +yy247: + YYDEBUG(247, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'O') goto yy326; + if (yych == 'o') goto yy326; + goto yy44; +yy248: + YYDEBUG(248, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy328; + if (yych == 'e') goto yy328; + goto yy44; yy249: YYDEBUG(249, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy344; - if (yych == 'p') goto yy344; - goto yy128; + if (yych == 'T') goto yy330; + if (yych == 't') goto yy330; + goto yy44; yy250: YYDEBUG(250, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'C') { - if (yych <= 'B') goto yy128; - goto yy345; - } else { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy346; - goto yy347; - } - } else { - if (yych <= 'r') { - if (yych == 'c') goto yy345; - goto yy128; - } else { - if (yych <= 's') goto yy346; - if (yych <= 't') goto yy347; - goto yy128; - } + switch (yych) { + case 'D': + case 'd': goto yy331; + case 'F': + case 'f': goto yy332; + case 'I': + case 'i': goto yy333; + case 'S': + case 's': goto yy334; + case 'W': + case 'w': goto yy335; + default: goto yy44; } yy251: YYDEBUG(251, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy348; - if (yych == 's') goto yy348; - goto yy128; + if (yych == 'L') goto yy336; + if (yych == 'l') goto yy336; + goto yy44; yy252: YYDEBUG(252, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy349; - if (yych == 's') goto yy349; - goto yy128; + if (yych == 'T') goto yy338; + if (yych == 't') goto yy338; + goto yy44; yy253: YYDEBUG(253, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy350; - if (yych == 'm') goto yy350; - goto yy128; + if (yych == 'E') goto yy340; + if (yych == 'e') goto yy340; + goto yy44; yy254: YYDEBUG(254, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy351; - if (yych == 'w') goto yy351; - goto yy128; + if (yych == 'A') goto yy341; + if (yych == 'a') goto yy341; + goto yy44; yy255: YYDEBUG(255, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yych <= '^') { + if (yych <= '@') { + if (yych <= '/') goto yy256; + if (yych <= '9') goto yy43; + } else { + if (yych == 'E') goto yy342; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= 'd') { + if (yych != '`') goto yy43; + } else { + if (yych <= 'e') goto yy342; + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } } +yy256: YYDEBUG(256, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1672 "Zend/zend_language_scanner.l" +#line 1316 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LOGICAL_OR); + RETURN_TOKEN(T_FOR); } -#line 3960 "Zend/zend_language_scanner.c" +#line 3689 "Zend/zend_language_scanner.c" yy257: YYDEBUG(257, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'O') { - if (yych == 'I') goto yy353; - if (yych <= 'N') goto yy128; - goto yy354; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy353; - } else { - if (yych == 'o') goto yy354; - goto yy128; - } - } + if (yych == 'C') goto yy343; + if (yych == 'c') goto yy343; + goto yy44; yy258: YYDEBUG(258, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy355; - if (yych == 'b') goto yy355; - goto yy128; + if (yych == 'B') goto yy344; + if (yych == 'b') goto yy344; + goto yy44; yy259: YYDEBUG(259, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych == 'Q') goto yy356; - if (yych <= 'S') goto yy128; - goto yy357; - } else { - if (yych <= 'q') { - if (yych <= 'p') goto yy128; - goto yy356; - } else { - if (yych == 't') goto yy357; - goto yy128; - } - } + if (yych == 'O') goto yy345; + if (yych == 'o') goto yy345; + goto yy44; yy260: YYDEBUG(260, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy358; - if (yych == 'a') goto yy358; - goto yy128; + if (yych == 'L') goto yy347; + if (yych == 'l') goto yy347; + goto yy44; yy261: YYDEBUG(261, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy359; - if (yych == 'i') goto yy359; - goto yy128; + if (yych == 'L') goto yy348; + if (yych == 'l') goto yy348; + goto yy44; yy262: YYDEBUG(262, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy360; - if (yych == 'r') goto yy360; - goto yy128; + if (yych == 'T') goto yy349; + if (yych == 't') goto yy349; + goto yy44; yy263: YYDEBUG(263, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'Y') { - if (yych == 'A') goto yy361; - if (yych <= 'X') goto yy128; - goto yy362; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy361; - } else { - if (yych == 'y') goto yy362; - goto yy128; - } - } + if (yych == 'E') goto yy350; + if (yych == 'e') goto yy350; + goto yy44; yy264: YYDEBUG(264, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy364; - if (yych == 's') goto yy364; - goto yy128; + if (yych == 'E') goto yy351; + if (yych == 'e') goto yy351; + goto yy44; yy265: YYDEBUG(265, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy365; - if (yych == 'e') goto yy365; - goto yy128; + if (yych == 'T') goto yy352; + if (yych == 't') goto yy352; + goto yy44; yy266: YYDEBUG(266, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy367; - if (yych == 'r') goto yy367; - goto yy128; + if (yych == 'E') goto yy354; + if (yych == 'e') goto yy354; + goto yy44; yy267: YYDEBUG(267, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy369; - if (yych == 'i') goto yy369; - goto yy128; -yy268: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(268, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy370; - if (yych == 'r') goto yy370; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1444 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_NEW); +} +#line 3762 "Zend/zend_language_scanner.c" yy269: YYDEBUG(269, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy372; - if (yych == 'e') goto yy372; - goto yy128; + if (yych <= 'V') { + if (yych == 'N') goto yy355; + if (yych <= 'U') goto yy44; + goto yy356; + } else { + if (yych <= 'n') { + if (yych <= 'm') goto yy44; + goto yy355; + } else { + if (yych == 'v') goto yy356; + goto yy44; + } + } yy270: YYDEBUG(270, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'T') goto yy357; + if (yych == 't') goto yy357; + goto yy44; +yy271: YYDEBUG(271, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1660 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_XOR_EQUAL); -} -#line 4078 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy358; + if (yych == 'l') goto yy358; + goto yy44; yy272: YYDEBUG(272, *YYCURSOR); yych = *++YYCURSOR; - switch (yych) { - case 'C': - case 'c': goto yy373; - case 'D': - case 'd': goto yy374; - case 'F': - case 'f': goto yy375; - case 'H': - case 'h': goto yy376; - case 'L': - case 'l': goto yy377; - case 'M': - case 'm': goto yy378; - case 'N': - case 'n': goto yy379; - case 'T': - case 't': goto yy380; - default: goto yy128; - } + if (yych == 'U') goto yy359; + if (yych == 'u') goto yy359; + goto yy44; yy273: YYDEBUG(273, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'U') goto yy360; + if (yych == 'u') goto yy360; + goto yy44; +yy274: YYDEBUG(274, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1656 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_OR_EQUAL); -} -#line 4110 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'T') goto yy361; + if (yych == 't') goto yy361; + goto yy44; yy275: YYDEBUG(275, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'T') goto yy362; + if (yych == 't') goto yy362; + goto yy44; +yy276: YYDEBUG(276, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1664 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BOOLEAN_OR); -} -#line 4120 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy363; + if (yych == 'o') goto yy363; + goto yy44; yy277: YYDEBUG(277, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'I') goto yy364; + if (yych == 'i') goto yy364; + goto yy44; +yy278: YYDEBUG(278, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(279, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1588 "Zend/zend_language_scanner.l" +#line 1272 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_IS_NOT_IDENTICAL); -} -#line 4130 "Zend/zend_language_scanner.c" -yy279: - YYDEBUG(279, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy381; - if (yych == 'r') goto yy381; - goto yy166; + RETURN_TOKEN(T_TRY); +} +#line 3839 "Zend/zend_language_scanner.c" yy280: YYDEBUG(280, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy382; - if (yych == 'n') goto yy382; - goto yy166; + if (yych == 'E') goto yy365; + if (yych == 'e') goto yy365; + goto yy44; yy281: YYDEBUG(281, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy383; - if (yych == 'o') goto yy383; - goto yy166; -yy282: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(282, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'U') goto yy384; - if (yych == 'u') goto yy384; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1508 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_USE); +} +#line 3858 "Zend/zend_language_scanner.c" yy283: YYDEBUG(283, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy385; - if (yych == 'o') goto yy385; - goto yy166; -yy284: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(284, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy386; - if (yych == 't') goto yy386; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1452 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_VAR); +} +#line 3871 "Zend/zend_language_scanner.c" yy285: YYDEBUG(285, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'J') goto yy387; - if (yych == 'j') goto yy387; - goto yy166; + if (yych == 'L') goto yy366; + if (yych == 'l') goto yy366; + goto yy44; yy286: YYDEBUG(286, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy388; - if (yych == 'a') goto yy388; - goto yy166; -yy287: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(287, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy389; - if (yych == 'r') goto yy389; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1680 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_LOGICAL_XOR); +} +#line 3890 "Zend/zend_language_scanner.c" yy288: YYDEBUG(288, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy390; - if (yych == 's') goto yy390; - goto yy166; + if (yych == 'L') goto yy367; + if (yych == 'l') goto yy367; + goto yy44; yy289: YYDEBUG(289, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'L') goto yy368; + if (yych == 'l') goto yy368; + goto yy44; +yy290: YYDEBUG(290, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1628 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_POW_EQUAL); -} -#line 4200 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'I') goto yy369; + if (yych == 'i') goto yy369; + goto yy44; yy291: YYDEBUG(291, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych <= 'U') { + if (yych == 'I') goto yy370; + if (yych <= 'T') goto yy44; + goto yy371; + } else { + if (yych <= 'i') { + if (yych <= 'h') goto yy44; + goto yy370; + } else { + if (yych == 'u') goto yy371; + goto yy44; + } + } +yy292: YYDEBUG(292, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1436 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ELLIPSIS); -} -#line 4210 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy372; + if (yych == 'a') goto yy372; + goto yy44; yy293: YYDEBUG(293, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '\f') { - if (yych <= 0x08) goto yy166; - if (yych <= '\n') goto yy391; - goto yy166; - } else { - if (yych <= '\r') goto yy391; - if (yych == ' ') goto yy391; - goto yy166; - } + if (yych == 'I') goto yy373; + if (yych == 'i') goto yy373; + goto yy44; yy294: YYDEBUG(294, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy374; + if (yych == 'e') goto yy374; + goto yy44; +yy295: YYDEBUG(295, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy294; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy375; + if (yych == 'a') goto yy375; + goto yy44; +yy296: YYDEBUG(296, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1733 "Zend/zend_language_scanner.l" - { - char *bin = yytext + 2; /* Skip "0b" */ - int len = yyleng - 2; - char *end; - - /* Skip any leading 0s */ - while (*bin == '0') { - ++bin; - --len; - } - - if (len < SIZEOF_ZEND_LONG * 8) { - if (len == 0) { - ZVAL_LONG(zendlval, 0); - } else { - errno = 0; - ZVAL_LONG(zendlval, ZEND_STRTOL(bin, &end, 2)); - ZEND_ASSERT(!errno && end == yytext + yyleng); - } - RETURN_TOKEN_WITH_VAL(T_LNUMBER); - } else { - ZVAL_DOUBLE(zendlval, zend_bin_strtod(bin, (const char **)&end)); - /* errno isn't checked since we allow HUGE_VAL/INF overflow */ - ZEND_ASSERT(end == yytext + yyleng); - RETURN_TOKEN_WITH_VAL(T_DNUMBER); - } -} -#line 4262 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy376; + if (yych == 'r') goto yy376; + goto yy44; yy297: YYDEBUG(297, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '/') goto yy166; - if (yych >= ':') goto yy166; + if (yych == 'A') goto yy377; + if (yych == 'a') goto yy377; + goto yy82; yy298: YYDEBUG(298, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'A') goto yy378; + if (yych == 'a') goto yy378; + goto yy82; +yy299: YYDEBUG(299, *YYCURSOR); - if (yych <= '/') goto yy193; - if (yych <= '9') goto yy298; - goto yy193; + yych = *++YYCURSOR; + if (yych == 'L') goto yy379; + if (yych == 'l') goto yy379; + goto yy82; yy300: YYDEBUG(300, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'B') goto yy380; + if (yych == 'b') goto yy380; + goto yy82; +yy301: YYDEBUG(301, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy300; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy381; + if (yych == 'a') goto yy381; + goto yy82; +yy302: YYDEBUG(302, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1812 "Zend/zend_language_scanner.l" - { - char *hex = yytext + 2; /* Skip "0x" */ - int len = yyleng - 2; - char *end; - - /* Skip any leading 0s */ - while (*hex == '0') { - hex++; - len--; - } - - if (len < SIZEOF_ZEND_LONG * 2 || (len == SIZEOF_ZEND_LONG * 2 && *hex <= '7')) { - if (len == 0) { - ZVAL_LONG(zendlval, 0); - } else { - errno = 0; - ZVAL_LONG(zendlval, ZEND_STRTOL(hex, &end, 16)); - ZEND_ASSERT(!errno && end == hex + len); - } - RETURN_TOKEN_WITH_VAL(T_LNUMBER); - } else { - ZVAL_DOUBLE(zendlval, zend_hex_strtod(hex, (const char **)&end)); - /* errno isn't checked since we allow HUGE_VAL/INF overflow */ - ZEND_ASSERT(end == hex + len); - RETURN_TOKEN_WITH_VAL(T_DNUMBER); - } -} -#line 4316 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy386; + if (yych == 'e') goto yy386; + goto yy383; yy303: YYDEBUG(303, *YYCURSOR); - ++YYCURSOR; - YYFILL(2); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy387; + if (yych == 'e') goto yy387; + goto yy82; +yy304: YYDEBUG(304, *YYCURSOR); - if (yych <= '\'') { - if (yych <= ' ') { - if (yych == '\t') goto yy303; - if (yych <= 0x1F) goto yy166; - goto yy303; - } else { - if (yych == '"') goto yy393; - if (yych <= '&') goto yy166; - goto yy394; - } - } else { - if (yych <= '_') { - if (yych <= '@') goto yy166; - if (yych <= 'Z') goto yy395; - if (yych <= '^') goto yy166; - goto yy395; - } else { - if (yych <= '`') goto yy166; - if (yych <= 'z') goto yy395; - if (yych <= 0x7F) goto yy166; - goto yy395; - } - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy388; + if (yych == 'l') goto yy388; + goto yy82; yy305: YYDEBUG(305, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'I') goto yy390; + if (yych == 'i') goto yy390; + goto yy82; +yy306: YYDEBUG(306, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1644 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SL_EQUAL); -} -#line 4355 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy391; + if (yych == 'e') goto yy391; + goto yy82; yy307: YYDEBUG(307, *YYCURSOR); ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(308, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1600 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SPACESHIP); -} -#line 4365 "Zend/zend_language_scanner.c" + if (yych <= '\f') { + if (yych <= 0x08) goto yy113; + if (yych <= '\n') goto yy307; + goto yy113; + } else { + if (yych <= '\r') goto yy307; + if (yych == ' ') goto yy307; + goto yy113; + } yy309: YYDEBUG(309, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == '"') goto yy82; + if (yych <= '/') goto yy393; + if (yych <= '9') goto yy82; + goto yy393; +yy310: YYDEBUG(310, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1584 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IS_IDENTICAL); -} -#line 4375 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '\'') goto yy82; + if (yych <= '/') goto yy395; + if (yych <= '9') goto yy82; + goto yy395; yy311: YYDEBUG(311, *YYCURSOR); ++YYCURSOR; + YYFILL(2); + yych = *YYCURSOR; YYDEBUG(312, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1648 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SR_EQUAL); -} -#line 4385 "Zend/zend_language_scanner.c" + if (yych <= '@') { + if (yych <= '\f') { + if (yych == '\n') goto yy396; + goto yy82; + } else { + if (yych <= '\r') goto yy398; + if (yych <= '/') goto yy82; + if (yych <= '9') goto yy311; + goto yy82; + } + } else { + if (yych <= '_') { + if (yych <= 'Z') goto yy311; + if (yych <= '^') goto yy82; + goto yy311; + } else { + if (yych <= '`') goto yy82; + if (yych <= 'z') goto yy311; + if (yych <= 0x7F) goto yy82; + goto yy311; + } + } yy313: YYDEBUG(313, *YYCURSOR); yych = *++YYCURSOR; - goto yy219; + if (yych == 'R') goto yy399; + if (yych == 'r') goto yy399; + goto yy44; yy314: YYDEBUG(314, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy313; - goto yy219; + if (yych == 'Y') goto yy400; + if (yych == 'y') goto yy400; + goto yy44; yy315: YYDEBUG(315, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy397; - if (yych == 't') goto yy397; - goto yy128; + if (yych == 'K') goto yy402; + if (yych == 'k') goto yy402; + goto yy44; yy316: YYDEBUG(316, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'A') goto yy404; + if (yych == 'a') goto yy404; + goto yy44; +yy317: YYDEBUG(317, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(318, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1676 "Zend/zend_language_scanner.l" +#line 1356 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LOGICAL_AND); + RETURN_TOKEN(T_CASE); } -#line 4413 "Zend/zend_language_scanner.c" -yy318: - YYDEBUG(318, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy398; - if (yych == 'a') goto yy398; - goto yy128; +#line 4108 "Zend/zend_language_scanner.c" yy319: YYDEBUG(319, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '<') goto yy303; - goto yy166; + if (yych == 'H') goto yy405; + if (yych == 'h') goto yy405; + goto yy44; yy320: YYDEBUG(320, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy399; - if (yych == 'a') goto yy399; - goto yy128; + if (yych == 'S') goto yy407; + if (yych == 's') goto yy407; + goto yy44; yy321: YYDEBUG(321, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy400; - if (yych == 'l') goto yy400; - goto yy128; + if (yych == 'E') goto yy409; + if (yych == 'e') goto yy409; + goto yy44; yy322: YYDEBUG(322, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy401; - if (yych == 'e') goto yy401; - goto yy128; + if (yych == 'T') goto yy411; + if (yych == 't') goto yy411; + goto yy44; yy323: YYDEBUG(323, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy403; - if (yych == 'c') goto yy403; - goto yy128; + if (yych == 'I') goto yy413; + if (yych == 'i') goto yy413; + goto yy44; yy324: YYDEBUG(324, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy404; - if (yych == 's') goto yy404; - goto yy128; + if (yych == 'A') goto yy414; + if (yych == 'a') goto yy414; + goto yy44; yy325: YYDEBUG(325, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy405; - if (yych == 'n') goto yy405; - goto yy128; + if (yych == 'U') goto yy415; + if (yych == 'u') goto yy415; + goto yy44; yy326: YYDEBUG(326, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'T') { - if (yych <= 'R') goto yy128; - if (yych <= 'S') goto yy406; - goto yy407; - } else { - if (yych <= 'r') goto yy128; - if (yych <= 's') goto yy406; - if (yych <= 't') goto yy407; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; } -yy327: YYDEBUG(327, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy408; - if (yych == 'l') goto yy408; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1376 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ECHO); +} +#line 4163 "Zend/zend_language_scanner.c" yy328: YYDEBUG(328, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy409; - if (yych == 'a') goto yy409; - goto yy128; + if (yych <= '^') { + if (yych <= '@') { + if (yych <= '/') goto yy329; + if (yych <= '9') goto yy43; + } else { + if (yych == 'I') goto yy416; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= 'h') { + if (yych != '`') goto yy43; + } else { + if (yych <= 'i') goto yy416; + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } + } yy329: YYDEBUG(329, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(330, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1246 "Zend/zend_language_scanner.l" +#line 1300 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXIT); + RETURN_TOKEN(T_ELSE); } -#line 4498 "Zend/zend_language_scanner.c" +#line 4191 "Zend/zend_language_scanner.c" +yy330: + YYDEBUG(330, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'Y') goto yy417; + if (yych == 'y') goto yy417; + goto yy44; yy331: YYDEBUG(331, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy410; - if (yych == 'o') goto yy410; - goto yy128; + if (yych == 'E') goto yy419; + if (yych == 'e') goto yy419; + goto yy44; yy332: YYDEBUG(332, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy412; - if (yych == 'e') goto yy412; - goto yy128; + if (yych == 'O') goto yy420; + if (yych == 'o') goto yy420; + goto yy44; yy333: YYDEBUG(333, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy414; - if (yych == 't') goto yy414; - goto yy128; + if (yych == 'F') goto yy421; + if (yych == 'f') goto yy421; + goto yy44; yy334: YYDEBUG(334, *YYCURSOR); yych = *++YYCURSOR; - switch (yych) { - case 'D': - case 'd': goto yy415; - case 'F': - case 'f': goto yy416; - case 'I': - case 'i': goto yy417; - case 'S': - case 's': goto yy418; - case 'W': - case 'w': goto yy419; - default: goto yy128; - } + if (yych == 'W') goto yy423; + if (yych == 'w') goto yy423; + goto yy44; yy335: YYDEBUG(335, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy420; - if (yych == 'l') goto yy420; - goto yy128; + if (yych == 'H') goto yy424; + if (yych == 'h') goto yy424; + goto yy44; yy336: YYDEBUG(336, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy422; - if (yych == 't') goto yy422; - goto yy128; -yy337: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(337, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy424; - if (yych == 'e') goto yy424; - goto yy128; -yy338: - YYDEBUG(338, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy425; - if (yych == 'a') goto yy425; - goto yy128; -yy339: - YYDEBUG(339, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy340; - if (yych <= '9') goto yy127; - } else { - if (yych == 'E') goto yy426; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'd') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'e') goto yy426; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1484 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EVAL); +} +#line 4240 "Zend/zend_language_scanner.c" +yy338: + YYDEBUG(338, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy340: - YYDEBUG(340, *YYCURSOR); + YYDEBUG(339, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1316 "Zend/zend_language_scanner.l" +#line 1242 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FOR); + RETURN_TOKEN(T_EXIT); } -#line 4584 "Zend/zend_language_scanner.c" +#line 4253 "Zend/zend_language_scanner.c" +yy340: + YYDEBUG(340, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy425; + if (yych == 'n') goto yy425; + goto yy44; yy341: YYDEBUG(341, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy427; - if (yych == 'c') goto yy427; - goto yy128; + if (yych == 'L') goto yy426; + if (yych == 'l') goto yy426; + goto yy44; yy342: YYDEBUG(342, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy428; - if (yych == 'b') goto yy428; - goto yy128; + if (yych == 'A') goto yy428; + if (yych == 'a') goto yy428; + goto yy44; yy343: YYDEBUG(343, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy429; - if (yych == 'o') goto yy429; - goto yy128; + if (yych == 'T') goto yy429; + if (yych == 't') goto yy429; + goto yy44; yy344: YYDEBUG(344, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy431; - if (yych == 'l') goto yy431; - goto yy128; + if (yych == 'A') goto yy430; + if (yych == 'a') goto yy430; + goto yy44; yy345: YYDEBUG(345, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy432; - if (yych == 'l') goto yy432; - goto yy128; -yy346: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(346, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy433; - if (yych == 't') goto yy433; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1372 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_GOTO); +} +#line 4296 "Zend/zend_language_scanner.c" yy347: YYDEBUG(347, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy434; - if (yych == 'e') goto yy434; - goto yy128; + if (yych == 'E') goto yy431; + if (yych == 'e') goto yy431; + goto yy44; yy348: YYDEBUG(348, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy435; - if (yych == 'e') goto yy435; - goto yy128; + if (yych == 'U') goto yy432; + if (yych == 'u') goto yy432; + goto yy44; yy349: YYDEBUG(349, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy436; - if (yych == 't') goto yy436; - goto yy128; + if (yych <= 'E') { + if (yych == 'A') goto yy433; + if (yych <= 'D') goto yy44; + goto yy434; + } else { + if (yych <= 'a') { + if (yych <= '`') goto yy44; + goto yy433; + } else { + if (yych == 'e') goto yy434; + goto yy44; + } + } yy350: YYDEBUG(350, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy438; - if (yych == 'e') goto yy438; - goto yy128; + if (yych == 'R') goto yy435; + if (yych == 'r') goto yy435; + goto yy44; yy351: YYDEBUG(351, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy436; + if (yych == 't') goto yy436; + goto yy44; +yy352: YYDEBUG(352, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(353, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1444 "Zend/zend_language_scanner.l" +#line 1564 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NEW); + RETURN_TOKEN(T_LIST); } -#line 4657 "Zend/zend_language_scanner.c" -yy353: - YYDEBUG(353, *YYCURSOR); - yych = *++YYCURSOR; - if (yych <= 'V') { - if (yych == 'N') goto yy439; - if (yych <= 'U') goto yy128; - goto yy440; - } else { - if (yych <= 'n') { - if (yych <= 'm') goto yy128; - goto yy439; - } else { - if (yych == 'v') goto yy440; - goto yy128; - } - } +#line 4349 "Zend/zend_language_scanner.c" yy354: YYDEBUG(354, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy441; - if (yych == 't') goto yy441; - goto yy128; + if (yych == 'S') goto yy438; + if (yych == 's') goto yy438; + goto yy44; yy355: YYDEBUG(355, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy442; - if (yych == 'l') goto yy442; - goto yy128; + if (yych == 'T') goto yy439; + if (yych == 't') goto yy439; + goto yy44; yy356: YYDEBUG(356, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy443; - if (yych == 'u') goto yy443; - goto yy128; + if (yych == 'A') goto yy441; + if (yych == 'a') goto yy441; + goto yy44; yy357: YYDEBUG(357, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy444; - if (yych == 'u') goto yy444; - goto yy128; + if (yych == 'E') goto yy442; + if (yych == 'e') goto yy442; + goto yy44; yy358: YYDEBUG(358, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy445; - if (yych == 't') goto yy445; - goto yy128; + if (yych == 'I') goto yy443; + if (yych == 'i') goto yy443; + goto yy44; yy359: YYDEBUG(359, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy446; - if (yych == 't') goto yy446; - goto yy128; + if (yych == 'I') goto yy444; + if (yych == 'i') goto yy444; + goto yy44; yy360: YYDEBUG(360, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy447; - if (yych == 'o') goto yy447; - goto yy128; + if (yych == 'R') goto yy445; + if (yych == 'r') goto yy445; + goto yy44; yy361: YYDEBUG(361, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy448; - if (yych == 'i') goto yy448; - goto yy128; + if (yych == 'I') goto yy446; + if (yych == 'i') goto yy446; + goto yy44; yy362: YYDEBUG(362, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy447; + if (yych == 'c') goto yy447; + goto yy44; +yy363: YYDEBUG(363, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1272 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRY); -} -#line 4734 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'W') goto yy448; + if (yych == 'w') goto yy448; + goto yy44; yy364: YYDEBUG(364, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy449; - if (yych == 'e') goto yy449; - goto yy128; + if (yych == 'T') goto yy450; + if (yych == 't') goto yy450; + goto yy44; yy365: YYDEBUG(365, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy452; + if (yych == 't') goto yy452; + goto yy44; +yy366: YYDEBUG(366, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1508 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_USE); -} -#line 4753 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy454; + if (yych == 'e') goto yy454; + goto yy44; yy367: YYDEBUG(367, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy456; + if (yych == 'd') goto yy456; + goto yy44; +yy368: YYDEBUG(368, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1452 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_VAR); -} -#line 4766 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy458; + if (yych == 'a') goto yy458; + goto yy44; yy369: YYDEBUG(369, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy450; - if (yych == 'l') goto yy450; - goto yy128; + if (yych == 'R') goto yy459; + if (yych == 'r') goto yy459; + goto yy44; yy370: YYDEBUG(370, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy460; + if (yych == 'l') goto yy460; + goto yy44; +yy371: YYDEBUG(371, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1680 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_LOGICAL_XOR); -} -#line 4785 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'N') goto yy461; + if (yych == 'n') goto yy461; + goto yy44; yy372: YYDEBUG(372, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy451; - if (yych == 'l') goto yy451; - goto yy128; + if (yych == 'L') goto yy462; + if (yych == 'l') goto yy462; + goto yy44; yy373: YYDEBUG(373, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy452; - if (yych == 'l') goto yy452; - goto yy128; + if (yych == 'N') goto yy463; + if (yych == 'n') goto yy463; + goto yy44; yy374: YYDEBUG(374, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy453; - if (yych == 'i') goto yy453; - goto yy128; + if (yych == 'T') goto yy464; + if (yych == 't') goto yy464; + goto yy44; yy375: YYDEBUG(375, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'U') { - if (yych == 'I') goto yy454; - if (yych <= 'T') goto yy128; - goto yy455; - } else { - if (yych <= 'i') { - if (yych <= 'h') goto yy128; - goto yy454; - } else { - if (yych == 'u') goto yy455; - goto yy128; - } - } + if (yych == 'M') goto yy465; + if (yych == 'm') goto yy465; + goto yy44; yy376: YYDEBUG(376, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy456; - if (yych == 'a') goto yy456; - goto yy128; + if (yych == 'A') goto yy466; + if (yych == 'a') goto yy466; + goto yy44; yy377: YYDEBUG(377, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy457; - if (yych == 'i') goto yy457; - goto yy128; + if (yych == 'Y') goto yy467; + if (yych == 'y') goto yy467; + goto yy82; yy378: YYDEBUG(378, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy458; - if (yych == 'e') goto yy458; - goto yy128; + if (yych == 'R') goto yy469; + if (yych == 'r') goto yy469; + goto yy82; yy379: YYDEBUG(379, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy459; - if (yych == 'a') goto yy459; - goto yy128; + if (yych == 'E') goto yy474; + if (yych == 'e') goto yy474; + goto yy471; yy380: YYDEBUG(380, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy460; - if (yych == 'r') goto yy460; - goto yy128; + if (yych == 'L') goto yy475; + if (yych == 'l') goto yy475; + goto yy82; yy381: YYDEBUG(381, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy461; - if (yych == 'a') goto yy461; - goto yy166; + if (yych == 'T') goto yy388; + if (yych == 't') goto yy388; + goto yy82; yy382: YYDEBUG(382, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy462; - if (yych == 'a') goto yy462; - goto yy166; + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; yy383: YYDEBUG(383, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy463; - if (yych == 'l') goto yy463; - goto yy166; -yy384: + if (yych <= 0x1F) { + if (yych == '\t') goto yy382; + goto yy82; + } else { + if (yych <= ' ') goto yy382; + if (yych != ')') goto yy82; + } YYDEBUG(384, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'B') goto yy464; - if (yych == 'b') goto yy464; - goto yy166; -yy385: + ++YYCURSOR; YYDEBUG(385, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy465; - if (yych == 'a') goto yy465; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1456 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INT_CAST); +} +#line 4540 "Zend/zend_language_scanner.c" yy386: YYDEBUG(386, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy470; - if (yych == 'e') goto yy470; - goto yy467; + if (yych == 'G') goto yy476; + if (yych == 'g') goto yy476; + goto yy82; yy387: YYDEBUG(387, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy471; - if (yych == 'e') goto yy471; - goto yy166; + if (yych == 'C') goto yy477; + if (yych == 'c') goto yy477; + goto yy82; yy388: YYDEBUG(388, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy472; - if (yych == 'l') goto yy472; - goto yy166; -yy389: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(389, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy474; - if (yych == 'i') goto yy474; - goto yy166; + if (yych <= 0x1F) { + if (yych == '\t') goto yy388; + goto yy82; + } else { + if (yych <= ' ') goto yy388; + if (yych == ')') goto yy478; + goto yy82; + } yy390: YYDEBUG(390, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy475; - if (yych == 'e') goto yy475; - goto yy166; + if (yych == 'N') goto yy480; + if (yych == 'n') goto yy480; + goto yy82; yy391: YYDEBUG(391, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy481; + if (yych == 't') goto yy481; + goto yy82; +yy392: + YYDEBUG(392, *YYCURSOR); ++YYCURSOR; - YYFILL(1); + YYFILL(3); yych = *YYCURSOR; - YYDEBUG(392, *YYCURSOR); - if (yych <= '\f') { - if (yych <= 0x08) goto yy197; - if (yych <= '\n') goto yy391; - goto yy197; - } else { - if (yych <= '\r') goto yy391; - if (yych == ' ') goto yy391; - goto yy197; - } yy393: YYDEBUG(393, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '"') goto yy166; - if (yych <= '/') goto yy477; - if (yych <= '9') goto yy166; - goto yy477; + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '"') goto yy483; + goto yy82; + } else { + if (yych <= '9') goto yy392; + if (yych <= '@') goto yy82; + goto yy392; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy392; + goto yy82; + } else { + if (yych <= 'z') goto yy392; + if (yych <= 0x7F) goto yy82; + goto yy392; + } + } yy394: YYDEBUG(394, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\'') goto yy166; - if (yych <= '/') goto yy479; - if (yych <= '9') goto yy166; - goto yy479; -yy395: - YYDEBUG(395, *YYCURSOR); ++YYCURSOR; - YYFILL(2); + YYFILL(3); yych = *YYCURSOR; - YYDEBUG(396, *YYCURSOR); - if (yych <= '@') { - if (yych <= '\f') { - if (yych == '\n') goto yy480; - goto yy166; +yy395: + YYDEBUG(395, *YYCURSOR); + if (yych <= 'Z') { + if (yych <= '/') { + if (yych == '\'') goto yy483; + goto yy82; + } else { + if (yych <= '9') goto yy394; + if (yych <= '@') goto yy82; + goto yy394; + } + } else { + if (yych <= '`') { + if (yych == '_') goto yy394; + goto yy82; } else { - if (yych <= '\r') goto yy482; - if (yych <= '/') goto yy166; - if (yych <= '9') goto yy395; - goto yy166; + if (yych <= 'z') goto yy394; + if (yych <= 0x7F) goto yy82; + goto yy394; + } + } +yy396: + YYDEBUG(396, *YYCURSOR); + ++YYCURSOR; +yy397: + YYDEBUG(397, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2249 "Zend/zend_language_scanner.l" + { + char *s; + unsigned char *saved_cursor; + int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0; + zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label)); + zend_bool is_heredoc = 1; + + CG(zend_lineno)++; + heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0); + s = yytext+bprefix+3; + while ((*s == ' ') || (*s == '\t')) { + s++; + heredoc_label->length--; + } + + if (*s == '\'') { + s++; + heredoc_label->length -= 2; + is_heredoc = 0; + + BEGIN(ST_NOWDOC); + } else { + if (*s == '"') { + s++; + heredoc_label->length -= 2; + } + + BEGIN(ST_HEREDOC); + } + + heredoc_label->label = estrndup(s, heredoc_label->length); + heredoc_label->indentation = 0; + saved_cursor = YYCURSOR; + + zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label); + + while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { + if (*YYCURSOR == '\t') { + spacing |= HEREDOC_USING_TABS; + } else { + spacing |= HEREDOC_USING_SPACES; + } + ++YYCURSOR; + ++indentation; + } + + if (YYCURSOR == YYLIMIT) { + YYCURSOR = saved_cursor; + RETURN_TOKEN(T_START_HEREDOC); + } + + /* Check for ending label on the next line */ + if (heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, heredoc_label->length)) { + if (!IS_LABEL_START(YYCURSOR[heredoc_label->length])) { + if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { + zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); + } + + YYCURSOR = saved_cursor; + heredoc_label->indentation = indentation; + + BEGIN(ST_END_HEREDOC); + RETURN_TOKEN(T_START_HEREDOC); + } + } + + YYCURSOR = saved_cursor; + + if (is_heredoc && !SCNG(heredoc_scan_ahead)) { + zend_lex_state current_state; + int heredoc_nesting_level = 1; + int first_token = 0; + + zend_save_lexical_state(¤t_state); + + SCNG(heredoc_scan_ahead) = 1; + SCNG(heredoc_indentation) = 0; + SCNG(heredoc_indentation_uses_spaces) = 0; + LANG_SCNG(on_event) = NULL; + + zend_ptr_stack_reverse_apply(¤t_state.heredoc_label_stack, copy_heredoc_label_stack); + + while (heredoc_nesting_level) { + zval zv; + int retval; + + ZVAL_UNDEF(&zv); + retval = lex_scan(&zv, NULL); + zval_dtor(&zv); + + if (EG(exception)) { + zend_clear_exception(); + break; } - } else { - if (yych <= '_') { - if (yych <= 'Z') goto yy395; - if (yych <= '^') goto yy166; - goto yy395; - } else { - if (yych <= '`') goto yy166; - if (yych <= 'z') goto yy395; - if (yych <= 0x7F) goto yy166; - goto yy395; + + if (!first_token) { + first_token = retval; + } + + switch (retval) { + case T_START_HEREDOC: + ++heredoc_nesting_level; + break; + case T_END_HEREDOC: + --heredoc_nesting_level; + break; + case END: + heredoc_nesting_level = 0; } } -yy397: - YYDEBUG(397, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy483; - if (yych == 'r') goto yy483; - goto yy128; + + if ( + (first_token == T_VARIABLE + || first_token == T_DOLLAR_OPEN_CURLY_BRACES + || first_token == T_CURLY_OPEN + ) && SCNG(heredoc_indentation)) { + zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation)); + } + + heredoc_label->indentation = SCNG(heredoc_indentation); + heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces); + + zend_restore_lexical_state(¤t_state); + SCNG(heredoc_scan_ahead) = 0; + CG(increment_lineno) = 0; + } + + RETURN_TOKEN(T_START_HEREDOC); +} +#line 4767 "Zend/zend_language_scanner.c" yy398: YYDEBUG(398, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy484; - if (yych == 'y') goto yy484; - goto yy128; + if (yych == '\n') goto yy396; + goto yy397; yy399: YYDEBUG(399, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'K') goto yy486; - if (yych == 'k') goto yy486; - goto yy128; + if (yych == 'A') goto yy484; + if (yych == 'a') goto yy484; + goto yy44; yy400: YYDEBUG(400, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy488; - if (yych == 'a') goto yy488; - goto yy128; -yy401: - YYDEBUG(401, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(402, *YYCURSOR); + YYDEBUG(401, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1356 "Zend/zend_language_scanner.l" +#line 1568 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CASE); + RETURN_TOKEN(T_ARRAY); } -#line 5003 "Zend/zend_language_scanner.c" -yy403: - YYDEBUG(403, *YYCURSOR); +#line 4791 "Zend/zend_language_scanner.c" +yy402: + YYDEBUG(402, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy489; - if (yych == 'h') goto yy489; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(403, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1364 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_BREAK); +} +#line 4804 "Zend/zend_language_scanner.c" yy404: YYDEBUG(404, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy491; - if (yych == 's') goto yy491; - goto yy128; + if (yych == 'B') goto yy485; + if (yych == 'b') goto yy485; + goto yy44; yy405: YYDEBUG(405, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy493; - if (yych == 'e') goto yy493; - goto yy128; -yy406: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(406, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy495; - if (yych == 't') goto yy495; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1276 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CATCH); +} +#line 4823 "Zend/zend_language_scanner.c" yy407: YYDEBUG(407, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy497; - if (yych == 'i') goto yy497; - goto yy128; -yy408: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(408, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy498; - if (yych == 'a') goto yy498; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1384 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CLASS); +} +#line 4836 "Zend/zend_language_scanner.c" yy409: YYDEBUG(409, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy499; - if (yych == 'u') goto yy499; - goto yy128; -yy410: - YYDEBUG(410, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(411, *YYCURSOR); + YYDEBUG(410, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1376 "Zend/zend_language_scanner.l" +#line 1448 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ECHO); + RETURN_TOKEN(T_CLONE); } -#line 5058 "Zend/zend_language_scanner.c" -yy412: - YYDEBUG(412, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy413; - if (yych <= '9') goto yy127; - } else { - if (yych == 'I') goto yy500; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'h') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'i') goto yy500; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } +#line 4849 "Zend/zend_language_scanner.c" +yy411: + YYDEBUG(411, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy413: - YYDEBUG(413, *YYCURSOR); + YYDEBUG(412, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1300 "Zend/zend_language_scanner.l" +#line 1254 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ELSE); + RETURN_TOKEN(T_CONST); } -#line 5086 "Zend/zend_language_scanner.c" +#line 4862 "Zend/zend_language_scanner.c" +yy413: + YYDEBUG(413, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy486; + if (yych == 'n') goto yy486; + goto yy44; yy414: YYDEBUG(414, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy501; - if (yych == 'y') goto yy501; - goto yy128; + if (yych == 'R') goto yy487; + if (yych == 'r') goto yy487; + goto yy44; yy415: YYDEBUG(415, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy503; - if (yych == 'e') goto yy503; - goto yy128; + if (yych == 'L') goto yy488; + if (yych == 'l') goto yy488; + goto yy44; yy416: YYDEBUG(416, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy504; - if (yych == 'o') goto yy504; - goto yy128; + if (yych == 'F') goto yy489; + if (yych == 'f') goto yy489; + goto yy44; yy417: YYDEBUG(417, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy505; - if (yych == 'f') goto yy505; - goto yy128; -yy418: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(418, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'W') goto yy507; - if (yych == 'w') goto yy507; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1524 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EMPTY); +} +#line 4899 "Zend/zend_language_scanner.c" yy419: YYDEBUG(419, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy508; - if (yych == 'h') goto yy508; - goto yy128; + if (yych == 'C') goto yy491; + if (yych == 'c') goto yy491; + goto yy44; yy420: YYDEBUG(420, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'R') goto yy492; + if (yych == 'r') goto yy492; + goto yy44; +yy421: YYDEBUG(421, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1484 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_EVAL); -} -#line 5135 "Zend/zend_language_scanner.c" -yy422: - YYDEBUG(422, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(423, *YYCURSOR); + YYDEBUG(422, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1242 "Zend/zend_language_scanner.l" +#line 1296 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXIT); + RETURN_TOKEN(T_ENDIF); } -#line 5148 "Zend/zend_language_scanner.c" +#line 4924 "Zend/zend_language_scanner.c" +yy423: + YYDEBUG(423, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy494; + if (yych == 'i') goto yy494; + goto yy44; yy424: YYDEBUG(424, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy509; - if (yych == 'n') goto yy509; - goto yy128; + if (yych == 'I') goto yy495; + if (yych == 'i') goto yy495; + goto yy44; yy425: YYDEBUG(425, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy510; - if (yych == 'l') goto yy510; - goto yy128; + if (yych == 'D') goto yy496; + if (yych == 'd') goto yy496; + goto yy44; yy426: YYDEBUG(426, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy512; - if (yych == 'a') goto yy512; - goto yy128; + if (yych <= '^') { + if (yych <= '@') { + if (yych <= '/') goto yy427; + if (yych <= '9') goto yy43; + } else { + if (yych == 'L') goto yy497; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= 'k') { + if (yych != '`') goto yy43; + } else { + if (yych <= 'l') goto yy497; + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } + } yy427: YYDEBUG(427, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy513; - if (yych == 't') goto yy513; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1540 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FINAL); +} +#line 4970 "Zend/zend_language_scanner.c" yy428: YYDEBUG(428, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy514; - if (yych == 'a') goto yy514; - goto yy128; + if (yych == 'C') goto yy498; + if (yych == 'c') goto yy498; + goto yy44; yy429: YYDEBUG(429, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'I') goto yy499; + if (yych == 'i') goto yy499; + goto yy44; +yy430: YYDEBUG(430, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1372 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_GOTO); -} -#line 5191 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy500; + if (yych == 'l') goto yy500; + goto yy44; yy431: YYDEBUG(431, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy515; - if (yych == 'e') goto yy515; - goto yy128; + if (yych == 'M') goto yy502; + if (yych == 'm') goto yy502; + goto yy44; yy432: YYDEBUG(432, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy516; - if (yych == 'u') goto yy516; - goto yy128; + if (yych == 'D') goto yy503; + if (yych == 'd') goto yy503; + goto yy44; yy433: YYDEBUG(433, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= 'E') { - if (yych == 'A') goto yy517; - if (yych <= 'D') goto yy128; - goto yy518; - } else { - if (yych <= 'a') { - if (yych <= '`') goto yy128; - goto yy517; - } else { - if (yych == 'e') goto yy518; - goto yy128; - } - } + if (yych == 'N') goto yy504; + if (yych == 'n') goto yy504; + goto yy44; yy434: YYDEBUG(434, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy519; - if (yych == 'r') goto yy519; - goto yy128; + if (yych == 'A') goto yy505; + if (yych == 'a') goto yy505; + goto yy44; yy435: YYDEBUG(435, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy520; - if (yych == 't') goto yy520; - goto yy128; + if (yych == 'F') goto yy506; + if (yych == 'f') goto yy506; + goto yy44; yy436: YYDEBUG(436, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(437, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1564 "Zend/zend_language_scanner.l" +#line 1520 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LIST); + RETURN_TOKEN(T_ISSET); } -#line 5244 "Zend/zend_language_scanner.c" +#line 5031 "Zend/zend_language_scanner.c" yy438: YYDEBUG(438, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy522; - if (yych == 's') goto yy522; - goto yy128; + if (yych == 'P') goto yy507; + if (yych == 'p') goto yy507; + goto yy44; yy439: YYDEBUG(439, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy523; - if (yych == 't') goto yy523; - goto yy128; -yy440: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(440, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy525; - if (yych == 'a') goto yy525; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1380 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PRINT); +} +#line 5050 "Zend/zend_language_scanner.c" yy441: YYDEBUG(441, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy526; - if (yych == 'e') goto yy526; - goto yy128; + if (yych == 'T') goto yy508; + if (yych == 't') goto yy508; + goto yy44; yy442: YYDEBUG(442, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy527; - if (yych == 'i') goto yy527; - goto yy128; + if (yych == 'C') goto yy509; + if (yych == 'c') goto yy509; + goto yy44; yy443: YYDEBUG(443, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy528; - if (yych == 'i') goto yy528; - goto yy128; + if (yych == 'C') goto yy510; + if (yych == 'c') goto yy510; + goto yy44; yy444: YYDEBUG(444, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy529; - if (yych == 'r') goto yy529; - goto yy128; + if (yych == 'R') goto yy512; + if (yych == 'r') goto yy512; + goto yy44; yy445: YYDEBUG(445, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy530; - if (yych == 'i') goto yy530; - goto yy128; + if (yych == 'N') goto yy513; + if (yych == 'n') goto yy513; + goto yy44; yy446: YYDEBUG(446, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy531; - if (yych == 'c') goto yy531; - goto yy128; + if (yych == 'C') goto yy515; + if (yych == 'c') goto yy515; + goto yy44; yy447: YYDEBUG(447, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'W') goto yy532; - if (yych == 'w') goto yy532; - goto yy128; + if (yych == 'H') goto yy517; + if (yych == 'h') goto yy517; + goto yy44; yy448: YYDEBUG(448, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy534; - if (yych == 't') goto yy534; - goto yy128; -yy449: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(449, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy536; - if (yych == 't') goto yy536; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1284 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_THROW); +} +#line 5105 "Zend/zend_language_scanner.c" yy450: YYDEBUG(450, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy538; - if (yych == 'e') goto yy538; - goto yy128; -yy451: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(451, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy540; - if (yych == 'd') goto yy540; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1392 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_TRAIT); +} +#line 5118 "Zend/zend_language_scanner.c" yy452: YYDEBUG(452, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy542; - if (yych == 'a') goto yy542; - goto yy128; -yy453: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(453, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy543; - if (yych == 'r') goto yy543; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1556 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_UNSET); +} +#line 5131 "Zend/zend_language_scanner.c" yy454: YYDEBUG(454, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy544; - if (yych == 'l') goto yy544; - goto yy128; -yy455: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(455, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy545; - if (yych == 'n') goto yy545; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1304 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_WHILE); +} +#line 5144 "Zend/zend_language_scanner.c" yy456: YYDEBUG(456, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy546; - if (yych == 'l') goto yy546; - goto yy128; + yyaccept = 6; + yych = *(YYMARKER = ++YYCURSOR); + if (yybm[0+yych] & 16) { + goto yy43; + } + if (yych <= '\f') { + if (yych <= 0x08) goto yy457; + if (yych <= '\n') goto yy519; + } else { + if (yych <= '\r') goto yy519; + if (yych == ' ') goto yy519; + } yy457: YYDEBUG(457, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy547; - if (yych == 'n') goto yy547; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1268 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_YIELD); +} +#line 5166 "Zend/zend_language_scanner.c" yy458: YYDEBUG(458, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy548; - if (yych == 't') goto yy548; - goto yy128; + if (yych == 'S') goto yy521; + if (yych == 's') goto yy521; + goto yy44; yy459: YYDEBUG(459, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy549; - if (yych == 'm') goto yy549; - goto yy128; + if (yych == '_') goto yy522; + goto yy44; yy460: YYDEBUG(460, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy550; - if (yych == 'a') goto yy550; - goto yy128; + if (yych == 'E') goto yy523; + if (yych == 'e') goto yy523; + goto yy44; yy461: YYDEBUG(461, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy551; - if (yych == 'y') goto yy551; - goto yy166; + if (yych == 'C') goto yy524; + if (yych == 'c') goto yy524; + goto yy44; yy462: YYDEBUG(462, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy553; - if (yych == 'r') goto yy553; - goto yy166; + if (yych == 'T') goto yy525; + if (yych == 't') goto yy525; + goto yy44; yy463: YYDEBUG(463, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy558; - if (yych == 'e') goto yy558; - goto yy555; + if (yych == 'E') goto yy526; + if (yych == 'e') goto yy526; + goto yy44; yy464: YYDEBUG(464, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy559; - if (yych == 'l') goto yy559; - goto yy166; + if (yych == 'H') goto yy527; + if (yych == 'h') goto yy527; + goto yy44; yy465: YYDEBUG(465, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy472; - if (yych == 't') goto yy472; - goto yy166; + if (yych == 'E') goto yy528; + if (yych == 'e') goto yy528; + goto yy44; yy466: YYDEBUG(466, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'I') goto yy529; + if (yych == 'i') goto yy529; + goto yy44; +yy467: + YYDEBUG(467, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy467: - YYDEBUG(467, *YYCURSOR); + YYDEBUG(468, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy466; - goto yy166; + if (yych == '\t') goto yy467; + goto yy82; } else { - if (yych <= ' ') goto yy466; - if (yych != ')') goto yy166; + if (yych <= ' ') goto yy467; + if (yych == ')') goto yy530; + goto yy82; } - YYDEBUG(468, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(469, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1456 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INT_CAST); -} -#line 5435 "Zend/zend_language_scanner.c" -yy470: - YYDEBUG(470, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'G') goto yy560; - if (yych == 'g') goto yy560; - goto yy166; -yy471: - YYDEBUG(471, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy561; - if (yych == 'c') goto yy561; - goto yy166; -yy472: - YYDEBUG(472, *YYCURSOR); +yy469: + YYDEBUG(469, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'Y') goto yy532; + if (yych == 'y') goto yy532; + goto yy82; +yy470: + YYDEBUG(470, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(473, *YYCURSOR); +yy471: + YYDEBUG(471, *YYCURSOR); if (yych <= 0x1F) { - if (yych == '\t') goto yy472; - goto yy166; + if (yych == '\t') goto yy470; + goto yy82; } else { - if (yych <= ' ') goto yy472; - if (yych == ')') goto yy562; - goto yy166; + if (yych <= ' ') goto yy470; + if (yych != ')') goto yy82; } + YYDEBUG(472, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(473, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1476 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_BOOL_CAST); +} +#line 5262 "Zend/zend_language_scanner.c" yy474: YYDEBUG(474, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy564; - if (yych == 'n') goto yy564; - goto yy166; + if (yych == 'A') goto yy534; + if (yych == 'a') goto yy534; + goto yy82; yy475: YYDEBUG(475, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy565; - if (yych == 't') goto yy565; - goto yy166; + if (yych == 'E') goto yy388; + if (yych == 'e') goto yy388; + goto yy82; yy476: YYDEBUG(476, *YYCURSOR); - ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy535; + if (yych == 'e') goto yy535; + goto yy82; yy477: YYDEBUG(477, *YYCURSOR); - if (yych <= 'Z') { - if (yych <= '/') { - if (yych == '"') goto yy567; - goto yy166; - } else { - if (yych <= '9') goto yy476; - if (yych <= '@') goto yy166; - goto yy476; - } - } else { - if (yych <= '`') { - if (yych == '_') goto yy476; - goto yy166; - } else { - if (yych <= 'z') goto yy476; - if (yych <= 0x7F) goto yy166; - goto yy476; - } - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy536; + if (yych == 't') goto yy536; + goto yy82; yy478: YYDEBUG(478, *YYCURSOR); ++YYCURSOR; - YYFILL(3); - yych = *YYCURSOR; -yy479: YYDEBUG(479, *YYCURSOR); - if (yych <= 'Z') { - if (yych <= '/') { - if (yych == '\'') goto yy567; - goto yy166; - } else { - if (yych <= '9') goto yy478; - if (yych <= '@') goto yy166; - goto yy478; - } - } else { - if (yych <= '`') { - if (yych == '_') goto yy478; - goto yy166; - } else { - if (yych <= 'z') goto yy478; - if (yych <= 0x7F) goto yy166; - goto yy478; - } - } + yyleng = YYCURSOR - SCNG(yy_text); +#line 1460 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DOUBLE_CAST); +} +#line 5296 "Zend/zend_language_scanner.c" yy480: YYDEBUG(480, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'G') goto yy532; + if (yych == 'g') goto yy532; + goto yy82; yy481: YYDEBUG(481, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2249 "Zend/zend_language_scanner.l" - { - char *s; - unsigned char *saved_cursor; - int bprefix = (yytext[0] != '<') ? 1 : 0, spacing = 0, indentation = 0; - zend_heredoc_label *heredoc_label = emalloc(sizeof(zend_heredoc_label)); - zend_bool is_heredoc = 1; - - CG(zend_lineno)++; - heredoc_label->length = yyleng-bprefix-3-1-(yytext[yyleng-2]=='\r'?1:0); - s = yytext+bprefix+3; - while ((*s == ' ') || (*s == '\t')) { - s++; - heredoc_label->length--; - } - - if (*s == '\'') { - s++; - heredoc_label->length -= 2; - is_heredoc = 0; - - BEGIN(ST_NOWDOC); - } else { - if (*s == '"') { - s++; - heredoc_label->length -= 2; - } - - BEGIN(ST_HEREDOC); - } - - heredoc_label->label = estrndup(s, heredoc_label->length); - heredoc_label->indentation = 0; - saved_cursor = YYCURSOR; - - zend_ptr_stack_push(&SCNG(heredoc_label_stack), (void *) heredoc_label); - - while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { - if (*YYCURSOR == '\t') { - spacing |= HEREDOC_USING_TABS; - } else { - spacing |= HEREDOC_USING_SPACES; - } ++YYCURSOR; - ++indentation; - } - - if (YYCURSOR == YYLIMIT) { - YYCURSOR = saved_cursor; - RETURN_TOKEN(T_START_HEREDOC); - } - - /* Check for ending label on the next line */ - if (heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, s, heredoc_label->length)) { - if (!IS_LABEL_START(YYCURSOR[heredoc_label->length])) { - if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { - zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); - } - - YYCURSOR = saved_cursor; - heredoc_label->indentation = indentation; - - BEGIN(ST_END_HEREDOC); - RETURN_TOKEN(T_START_HEREDOC); - } - } - - YYCURSOR = saved_cursor; - - if (is_heredoc && !SCNG(heredoc_scan_ahead)) { - zend_lex_state current_state; - int heredoc_nesting_level = 1; - int first_token = 0; - - zend_save_lexical_state(¤t_state); - - SCNG(heredoc_scan_ahead) = 1; - SCNG(heredoc_indentation) = 0; - SCNG(heredoc_indentation_uses_spaces) = 0; - LANG_SCNG(on_event) = NULL; - - zend_ptr_stack_reverse_apply(¤t_state.heredoc_label_stack, copy_heredoc_label_stack); - - while (heredoc_nesting_level) { - zval zv; - int retval; - - ZVAL_UNDEF(&zv); - retval = lex_scan(&zv, NULL); - zval_dtor(&zv); - - if (EG(exception)) { - zend_clear_exception(); - break; - } - - if (!first_token) { - first_token = retval; - } - - switch (retval) { - case T_START_HEREDOC: - ++heredoc_nesting_level; - break; - case T_END_HEREDOC: - --heredoc_nesting_level; - break; - case END: - heredoc_nesting_level = 0; - } - } - - if ( - (first_token == T_VARIABLE - || first_token == T_DOLLAR_OPEN_CURLY_BRACES - || first_token == T_CURLY_OPEN - ) && SCNG(heredoc_indentation)) { - zend_throw_exception_ex(zend_ce_parse_error, 0, "Invalid body indentation level (expecting an indentation level of at least %d)", SCNG(heredoc_indentation)); - } - - heredoc_label->indentation = SCNG(heredoc_indentation); - heredoc_label->indentation_uses_spaces = SCNG(heredoc_indentation_uses_spaces); - - zend_restore_lexical_state(¤t_state); - SCNG(heredoc_scan_ahead) = 0; - CG(increment_lineno) = 0; - } - - RETURN_TOKEN(T_START_HEREDOC); -} -#line 5662 "Zend/zend_language_scanner.c" -yy482: + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(482, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '\n') goto yy480; - goto yy481; + if (yych <= 0x1F) { + if (yych == '\t') goto yy481; + goto yy82; + } else { + if (yych <= ' ') goto yy481; + if (yych == ')') goto yy538; + goto yy82; + } yy483: YYDEBUG(483, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy568; - if (yych == 'a') goto yy568; - goto yy128; + if (yych == '\n') goto yy396; + if (yych == '\r') goto yy398; + goto yy82; yy484: YYDEBUG(484, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy540; + if (yych == 'c') goto yy540; + goto yy44; +yy485: YYDEBUG(485, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1568 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ARRAY); -} -#line 5686 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'L') goto yy541; + if (yych == 'l') goto yy541; + goto yy44; yy486: YYDEBUG(486, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'U') goto yy542; + if (yych == 'u') goto yy542; + goto yy44; +yy487: YYDEBUG(487, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1364 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_BREAK); -} -#line 5699 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy543; + if (yych == 'e') goto yy543; + goto yy44; yy488: YYDEBUG(488, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'B') goto yy569; - if (yych == 'b') goto yy569; - goto yy128; + if (yych == 'T') goto yy545; + if (yych == 't') goto yy545; + goto yy44; yy489: YYDEBUG(489, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(490, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1276 "Zend/zend_language_scanner.l" +#line 1292 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CATCH); + RETURN_TOKEN(T_ELSEIF); } -#line 5718 "Zend/zend_language_scanner.c" +#line 5365 "Zend/zend_language_scanner.c" yy491: YYDEBUG(491, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy547; + if (yych == 'l') goto yy547; + goto yy44; +yy492: YYDEBUG(492, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1384 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CLASS); -} -#line 5731 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych <= '^') { + if (yych <= '@') { + if (yych <= '/') goto yy493; + if (yych <= '9') goto yy43; + } else { + if (yych == 'E') goto yy548; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= 'd') { + if (yych != '`') goto yy43; + } else { + if (yych <= 'e') goto yy548; + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } + } yy493: YYDEBUG(493, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(494, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1448 "Zend/zend_language_scanner.l" +#line 1320 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CLONE); + RETURN_TOKEN(T_ENDFOR); } -#line 5744 "Zend/zend_language_scanner.c" +#line 5399 "Zend/zend_language_scanner.c" +yy494: + YYDEBUG(494, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy549; + if (yych == 't') goto yy549; + goto yy44; yy495: YYDEBUG(495, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy550; + if (yych == 'l') goto yy550; + goto yy44; +yy496: YYDEBUG(496, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1254 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CONST); -} -#line 5757 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy551; + if (yych == 's') goto yy551; + goto yy44; yy497: YYDEBUG(497, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy570; - if (yych == 'n') goto yy570; - goto yy128; + if (yych == 'Y') goto yy553; + if (yych == 'y') goto yy553; + goto yy44; yy498: YYDEBUG(498, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy571; - if (yych == 'r') goto yy571; - goto yy128; + if (yych == 'H') goto yy555; + if (yych == 'h') goto yy555; + goto yy44; yy499: YYDEBUG(499, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy572; - if (yych == 'l') goto yy572; - goto yy128; + if (yych == 'O') goto yy557; + if (yych == 'o') goto yy557; + goto yy44; yy500: YYDEBUG(500, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy573; - if (yych == 'f') goto yy573; - goto yy128; -yy501: - YYDEBUG(501, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(502, *YYCURSOR); + YYDEBUG(501, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1524 "Zend/zend_language_scanner.l" +#line 1516 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EMPTY); + RETURN_TOKEN(T_GLOBAL); } -#line 5794 "Zend/zend_language_scanner.c" +#line 5448 "Zend/zend_language_scanner.c" +yy502: + YYDEBUG(502, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy558; + if (yych == 'e') goto yy558; + goto yy44; yy503: YYDEBUG(503, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy575; - if (yych == 'c') goto yy575; - goto yy128; + if (yych == 'E') goto yy559; + if (yych == 'e') goto yy559; + goto yy44; yy504: YYDEBUG(504, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy576; - if (yych == 'r') goto yy576; - goto yy128; + if (yych == 'C') goto yy561; + if (yych == 'c') goto yy561; + goto yy44; yy505: YYDEBUG(505, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy562; + if (yych == 'd') goto yy562; + goto yy44; +yy506: YYDEBUG(506, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1296 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDIF); -} -#line 5819 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'A') goto yy563; + if (yych == 'a') goto yy563; + goto yy44; yy507: YYDEBUG(507, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy578; - if (yych == 'i') goto yy578; - goto yy128; + if (yych == 'A') goto yy564; + if (yych == 'a') goto yy564; + goto yy44; yy508: YYDEBUG(508, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy579; - if (yych == 'i') goto yy579; - goto yy128; + if (yych == 'E') goto yy565; + if (yych == 'e') goto yy565; + goto yy44; yy509: YYDEBUG(509, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy580; - if (yych == 'd') goto yy580; - goto yy128; + if (yych == 'T') goto yy567; + if (yych == 't') goto yy567; + goto yy44; yy510: YYDEBUG(510, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy511; - if (yych <= '9') goto yy127; - } else { - if (yych == 'L') goto yy581; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'k') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'l') goto yy581; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } -yy511: YYDEBUG(511, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1540 "Zend/zend_language_scanner.l" +#line 1552 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FINAL); + RETURN_TOKEN(T_PUBLIC); } -#line 5865 "Zend/zend_language_scanner.c" +#line 5509 "Zend/zend_language_scanner.c" yy512: YYDEBUG(512, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy582; - if (yych == 'c') goto yy582; - goto yy128; + if (yych == 'E') goto yy568; + if (yych == 'e') goto yy568; + goto yy44; yy513: YYDEBUG(513, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy583; - if (yych == 'i') goto yy583; - goto yy128; -yy514: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(514, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy584; - if (yych == 'l') goto yy584; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1258 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_RETURN); +} +#line 5528 "Zend/zend_language_scanner.c" yy515: YYDEBUG(515, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'M') goto yy586; - if (yych == 'm') goto yy586; - goto yy128; -yy516: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(516, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy587; - if (yych == 'd') goto yy587; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1532 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_STATIC); +} +#line 5541 "Zend/zend_language_scanner.c" yy517: YYDEBUG(517, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy588; - if (yych == 'n') goto yy588; - goto yy128; -yy518: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(518, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy589; - if (yych == 'a') goto yy589; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1348 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_SWITCH); +} +#line 5554 "Zend/zend_language_scanner.c" yy519: YYDEBUG(519, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy590; - if (yych == 'f') goto yy590; - goto yy128; -yy520: - YYDEBUG(520, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + YYFILL(5); + yych = *YYCURSOR; + YYDEBUG(520, *YYCURSOR); + if (yych <= 0x1F) { + if (yych <= '\n') { + if (yych <= 0x08) goto yy82; + goto yy519; + } else { + if (yych == '\r') goto yy519; + goto yy82; + } + } else { + if (yych <= 'F') { + if (yych <= ' ') goto yy519; + if (yych <= 'E') goto yy82; + goto yy570; + } else { + if (yych == 'f') goto yy570; + goto yy82; + } } +yy521: YYDEBUG(521, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1520 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ISSET); -} -#line 5926 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'S') goto yy571; + if (yych == 's') goto yy571; + goto yy44; yy522: YYDEBUG(522, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy591; - if (yych == 'p') goto yy591; - goto yy128; + if (yych == '_') goto yy572; + goto yy44; yy523: YYDEBUG(523, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == '_') goto yy574; + goto yy44; +yy524: YYDEBUG(524, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1380 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PRINT); -} -#line 5945 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'T') goto yy575; + if (yych == 't') goto yy575; + goto yy44; yy525: YYDEBUG(525, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy592; - if (yych == 't') goto yy592; - goto yy128; + if (yych == '_') goto yy576; + goto yy44; yy526: YYDEBUG(526, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy593; - if (yych == 'c') goto yy593; - goto yy128; + if (yych == '_') goto yy577; + goto yy44; yy527: YYDEBUG(527, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy594; - if (yych == 'c') goto yy594; - goto yy128; + if (yych == 'O') goto yy578; + if (yych == 'o') goto yy578; + goto yy44; yy528: YYDEBUG(528, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy596; - if (yych == 'r') goto yy596; - goto yy128; + if (yych == 'S') goto yy579; + if (yych == 's') goto yy579; + goto yy44; yy529: YYDEBUG(529, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy597; - if (yych == 'n') goto yy597; - goto yy128; + if (yych == 'T') goto yy580; + if (yych == 't') goto yy580; + goto yy44; yy530: YYDEBUG(530, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy599; - if (yych == 'c') goto yy599; - goto yy128; -yy531: + ++YYCURSOR; YYDEBUG(531, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy601; - if (yych == 'h') goto yy601; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1468 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ARRAY_CAST); +} +#line 5638 "Zend/zend_language_scanner.c" yy532: YYDEBUG(532, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(533, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1284 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_THROW); -} -#line 6000 "Zend/zend_language_scanner.c" + if (yych <= 0x1F) { + if (yych == '\t') goto yy532; + goto yy82; + } else { + if (yych <= ' ') goto yy532; + if (yych == ')') goto yy581; + goto yy82; + } yy534: YYDEBUG(534, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'N') goto yy470; + if (yych == 'n') goto yy470; + goto yy82; +yy535: YYDEBUG(535, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1392 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRAIT); -} -#line 6013 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'R') goto yy382; + if (yych == 'r') goto yy382; + goto yy82; yy536: YYDEBUG(536, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(537, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1556 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_UNSET); -} -#line 6026 "Zend/zend_language_scanner.c" + if (yych <= 0x1F) { + if (yych == '\t') goto yy536; + goto yy82; + } else { + if (yych <= ' ') goto yy536; + if (yych == ')') goto yy583; + goto yy82; + } yy538: YYDEBUG(538, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(539, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1304 "Zend/zend_language_scanner.l" +#line 1480 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_WHILE); + RETURN_TOKEN(T_UNSET_CAST); } -#line 6039 "Zend/zend_language_scanner.c" +#line 5688 "Zend/zend_language_scanner.c" yy540: YYDEBUG(540, *YYCURSOR); - yyaccept = 6; - yych = *(YYMARKER = ++YYCURSOR); - if (yybm[0+yych] & 16) { - goto yy127; - } - if (yych <= '\f') { - if (yych <= 0x08) goto yy541; - if (yych <= '\n') goto yy603; - } else { - if (yych <= '\r') goto yy603; - if (yych == ' ') goto yy603; - } + yych = *++YYCURSOR; + if (yych == 'T') goto yy585; + if (yych == 't') goto yy585; + goto yy44; yy541: YYDEBUG(541, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1268 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_YIELD); -} -#line 6061 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy587; + if (yych == 'e') goto yy587; + goto yy44; yy542: YYDEBUG(542, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy605; - if (yych == 's') goto yy605; - goto yy128; + if (yych == 'E') goto yy589; + if (yych == 'e') goto yy589; + goto yy44; yy543: YYDEBUG(543, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy606; - goto yy128; -yy544: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(544, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy607; - if (yych == 'e') goto yy607; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1332 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DECLARE); +} +#line 5719 "Zend/zend_language_scanner.c" yy545: YYDEBUG(545, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy608; - if (yych == 'c') goto yy608; - goto yy128; -yy546: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(546, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy609; - if (yych == 't') goto yy609; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1360 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_DEFAULT); +} +#line 5732 "Zend/zend_language_scanner.c" yy547: YYDEBUG(547, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy610; - if (yych == 'e') goto yy610; - goto yy128; + if (yych == 'A') goto yy591; + if (yych == 'a') goto yy591; + goto yy44; yy548: YYDEBUG(548, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy611; - if (yych == 'h') goto yy611; - goto yy128; + if (yych == 'A') goto yy592; + if (yych == 'a') goto yy592; + goto yy44; yy549: YYDEBUG(549, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy612; - if (yych == 'e') goto yy612; - goto yy128; + if (yych == 'C') goto yy593; + if (yych == 'c') goto yy593; + goto yy44; yy550: YYDEBUG(550, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy613; - if (yych == 'i') goto yy613; - goto yy128; + if (yych == 'E') goto yy594; + if (yych == 'e') goto yy594; + goto yy44; yy551: YYDEBUG(551, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(552, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy551; - goto yy166; - } else { - if (yych <= ' ') goto yy551; - if (yych == ')') goto yy614; - goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(552, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1396 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_EXTENDS); +} +#line 5769 "Zend/zend_language_scanner.c" yy553: YYDEBUG(553, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'Y') goto yy616; - if (yych == 'y') goto yy616; - goto yy166; -yy554: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(554, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1280 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FINALLY); +} +#line 5782 "Zend/zend_language_scanner.c" yy555: YYDEBUG(555, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy554; - goto yy166; - } else { - if (yych <= ' ') goto yy554; - if (yych != ')') goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(556, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(557, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1476 "Zend/zend_language_scanner.l" +#line 1324 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_BOOL_CAST); + RETURN_TOKEN(T_FOREACH); } -#line 6157 "Zend/zend_language_scanner.c" +#line 5795 "Zend/zend_language_scanner.c" +yy557: + YYDEBUG(557, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy596; + if (yych == 'n') goto yy596; + goto yy44; yy558: YYDEBUG(558, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy618; - if (yych == 'a') goto yy618; - goto yy166; + if (yych == 'N') goto yy598; + if (yych == 'n') goto yy598; + goto yy44; yy559: YYDEBUG(559, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy472; - if (yych == 'e') goto yy472; - goto yy166; + if (yych <= '^') { + if (yych <= '9') { + if (yych >= '0') goto yy43; + } else { + if (yych <= '@') goto yy560; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= '`') { + if (yych <= '_') goto yy599; + } else { + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } + } yy560: YYDEBUG(560, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy619; - if (yych == 'e') goto yy619; - goto yy166; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1488 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INCLUDE); +} +#line 5833 "Zend/zend_language_scanner.c" yy561: YYDEBUG(561, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy620; - if (yych == 't') goto yy620; - goto yy166; + if (yych == 'E') goto yy600; + if (yych == 'e') goto yy600; + goto yy44; yy562: YYDEBUG(562, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'O') goto yy601; + if (yych == 'o') goto yy601; + goto yy44; +yy563: YYDEBUG(563, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1460 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_DOUBLE_CAST); -} -#line 6191 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'C') goto yy602; + if (yych == 'c') goto yy602; + goto yy44; yy564: YYDEBUG(564, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'G') goto yy616; - if (yych == 'g') goto yy616; - goto yy166; + if (yych == 'C') goto yy603; + if (yych == 'c') goto yy603; + goto yy44; yy565: YYDEBUG(565, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(566, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy565; - goto yy166; - } else { - if (yych <= ' ') goto yy565; - if (yych == ')') goto yy622; - goto yy166; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(566, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1544 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PRIVATE); +} +#line 5870 "Zend/zend_language_scanner.c" yy567: YYDEBUG(567, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '\n') goto yy480; - if (yych == '\r') goto yy482; - goto yy166; + if (yych == 'E') goto yy604; + if (yych == 'e') goto yy604; + goto yy44; yy568: YYDEBUG(568, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy624; - if (yych == 'c') goto yy624; - goto yy128; + if (yych <= '^') { + if (yych <= '9') { + if (yych >= '0') goto yy43; + } else { + if (yych <= '@') goto yy569; + if (yych <= 'Z') goto yy43; + } + } else { + if (yych <= '`') { + if (yych <= '_') goto yy605; + } else { + if (yych <= 'z') goto yy43; + if (yych >= 0x80) goto yy43; + } + } yy569: YYDEBUG(569, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy625; - if (yych == 'l') goto yy625; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1496 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_REQUIRE); +} +#line 5902 "Zend/zend_language_scanner.c" yy570: YYDEBUG(570, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'U') goto yy626; - if (yych == 'u') goto yy626; - goto yy128; + if (yych == 'R') goto yy606; + if (yych == 'r') goto yy606; + goto yy82; yy571: YYDEBUG(571, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy627; - if (yych == 'e') goto yy627; - goto yy128; + if (yych == '_') goto yy607; + goto yy44; yy572: YYDEBUG(572, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy629; - if (yych == 't') goto yy629; - goto yy128; -yy573: - YYDEBUG(573, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(574, *YYCURSOR); + YYDEBUG(573, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1292 "Zend/zend_language_scanner.l" +#line 1898 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ELSEIF); + RETURN_TOKEN(T_DIR); } -#line 6260 "Zend/zend_language_scanner.c" +#line 5926 "Zend/zend_language_scanner.c" +yy574: + YYDEBUG(574, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '_') goto yy608; + goto yy44; yy575: YYDEBUG(575, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy631; - if (yych == 'l') goto yy631; - goto yy128; + if (yych == 'I') goto yy610; + if (yych == 'i') goto yy610; + goto yy44; yy576: YYDEBUG(576, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '@') { - if (yych <= '/') goto yy577; - if (yych <= '9') goto yy127; - } else { - if (yych == 'E') goto yy632; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= 'd') { - if (yych != '`') goto yy127; - } else { - if (yych <= 'e') goto yy632; - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy611; + if (yych == 'c') goto yy611; + goto yy44; yy577: YYDEBUG(577, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1320 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDFOR); -} -#line 6294 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy612; + goto yy44; yy578: YYDEBUG(578, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy633; - if (yych == 't') goto yy633; - goto yy128; + if (yych == 'D') goto yy614; + if (yych == 'd') goto yy614; + goto yy44; yy579: YYDEBUG(579, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'L') goto yy634; - if (yych == 'l') goto yy634; - goto yy128; + if (yych == 'P') goto yy615; + if (yych == 'p') goto yy615; + goto yy44; yy580: YYDEBUG(580, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy635; - if (yych == 's') goto yy635; - goto yy128; + if (yych == '_') goto yy616; + goto yy44; yy581: YYDEBUG(581, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'Y') goto yy637; - if (yych == 'y') goto yy637; - goto yy128; -yy582: + ++YYCURSOR; YYDEBUG(582, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy639; - if (yych == 'h') goto yy639; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1464 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_STRING_CAST); +} +#line 5975 "Zend/zend_language_scanner.c" yy583: YYDEBUG(583, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy641; - if (yych == 'o') goto yy641; - goto yy128; -yy584: - YYDEBUG(584, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(585, *YYCURSOR); + YYDEBUG(584, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1516 "Zend/zend_language_scanner.l" +#line 1472 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_GLOBAL); + RETURN_TOKEN(T_OBJECT_CAST); } -#line 6343 "Zend/zend_language_scanner.c" -yy586: - YYDEBUG(586, *YYCURSOR); +#line 5985 "Zend/zend_language_scanner.c" +yy585: + YYDEBUG(585, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy642; - if (yych == 'e') goto yy642; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(586, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1536 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ABSTRACT); +} +#line 5998 "Zend/zend_language_scanner.c" yy587: YYDEBUG(587, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy643; - if (yych == 'e') goto yy643; - goto yy128; -yy588: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(588, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy645; - if (yych == 'c') goto yy645; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1572 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CALLABLE); +} +#line 6011 "Zend/zend_language_scanner.c" yy589: YYDEBUG(589, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy646; - if (yych == 'd') goto yy646; - goto yy128; -yy590: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(590, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'A') goto yy647; - if (yych == 'a') goto yy647; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1368 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_CONTINUE); +} +#line 6024 "Zend/zend_language_scanner.c" yy591: YYDEBUG(591, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy648; - if (yych == 'a') goto yy648; - goto yy128; + if (yych == 'R') goto yy617; + if (yych == 'r') goto yy617; + goto yy44; yy592: YYDEBUG(592, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy649; - if (yych == 'e') goto yy649; - goto yy128; + if (yych == 'C') goto yy618; + if (yych == 'c') goto yy618; + goto yy44; yy593: YYDEBUG(593, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy651; - if (yych == 't') goto yy651; - goto yy128; + if (yych == 'H') goto yy619; + if (yych == 'h') goto yy619; + goto yy44; yy594: YYDEBUG(594, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(595, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1552 "Zend/zend_language_scanner.l" +#line 1308 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_PUBLIC); + RETURN_TOKEN(T_ENDWHILE); } -#line 6404 "Zend/zend_language_scanner.c" +#line 6055 "Zend/zend_language_scanner.c" yy596: YYDEBUG(596, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy652; - if (yych == 'e') goto yy652; - goto yy128; -yy597: - YYDEBUG(597, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(598, *YYCURSOR); + YYDEBUG(597, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1258 "Zend/zend_language_scanner.l" +#line 1250 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_RETURN); + RETURN_TOKEN(T_FUNCTION); } -#line 6423 "Zend/zend_language_scanner.c" +#line 6068 "Zend/zend_language_scanner.c" +yy598: + YYDEBUG(598, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'T') goto yy621; + if (yych == 't') goto yy621; + goto yy44; yy599: YYDEBUG(599, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'O') goto yy622; + if (yych == 'o') goto yy622; + goto yy44; +yy600: YYDEBUG(600, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1532 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_STATIC); -} -#line 6436 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'O') goto yy623; + if (yych == 'o') goto yy623; + goto yy44; yy601: YYDEBUG(601, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'F') goto yy624; + if (yych == 'f') goto yy624; + goto yy44; +yy602: YYDEBUG(602, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1348 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_SWITCH); -} -#line 6449 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'E') goto yy626; + if (yych == 'e') goto yy626; + goto yy44; yy603: YYDEBUG(603, *YYCURSOR); - ++YYCURSOR; - YYFILL(5); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'E') goto yy628; + if (yych == 'e') goto yy628; + goto yy44; +yy604: YYDEBUG(604, *YYCURSOR); - if (yych <= 0x1F) { - if (yych <= '\n') { - if (yych <= 0x08) goto yy166; - goto yy603; - } else { - if (yych == '\r') goto yy603; - goto yy166; - } - } else { - if (yych <= 'F') { - if (yych <= ' ') goto yy603; - if (yych <= 'E') goto yy166; - goto yy654; - } else { - if (yych == 'f') goto yy654; - goto yy166; - } - } + yych = *++YYCURSOR; + if (yych == 'D') goto yy630; + if (yych == 'd') goto yy630; + goto yy44; yy605: YYDEBUG(605, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy655; - if (yych == 's') goto yy655; - goto yy128; + if (yych == 'O') goto yy632; + if (yych == 'o') goto yy632; + goto yy44; yy606: YYDEBUG(606, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy656; - goto yy128; + if (yych == 'O') goto yy633; + if (yych == 'o') goto yy633; + goto yy82; yy607: YYDEBUG(607, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy658; - goto yy128; + if (yych == '_') goto yy634; + goto yy44; yy608: YYDEBUG(608, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy659; - if (yych == 't') goto yy659; - goto yy128; -yy609: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(609, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy660; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1894 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_FILE); +} +#line 6140 "Zend/zend_language_scanner.c" yy610: YYDEBUG(610, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy661; - goto yy128; + if (yych == 'O') goto yy636; + if (yych == 'o') goto yy636; + goto yy44; yy611: YYDEBUG(611, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy662; - if (yych == 'o') goto yy662; - goto yy128; + if (yych == 'O') goto yy637; + if (yych == 'o') goto yy637; + goto yy44; yy612: YYDEBUG(612, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'S') goto yy663; - if (yych == 's') goto yy663; - goto yy128; -yy613: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(613, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy664; - if (yych == 't') goto yy664; - goto yy128; -yy614: - YYDEBUG(614, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(615, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1468 "Zend/zend_language_scanner.l" +#line 1890 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ARRAY_CAST); + RETURN_TOKEN(T_LINE); } -#line 6533 "Zend/zend_language_scanner.c" +#line 6165 "Zend/zend_language_scanner.c" +yy614: + YYDEBUG(614, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '_') goto yy638; + goto yy44; +yy615: + YYDEBUG(615, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'A') goto yy639; + if (yych == 'a') goto yy639; + goto yy44; yy616: YYDEBUG(616, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yych = *++YYCURSOR; + if (yych == '_') goto yy640; + goto yy44; +yy617: YYDEBUG(617, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy616; - goto yy166; - } else { - if (yych <= ' ') goto yy616; - if (yych == ')') goto yy665; - goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'E') goto yy642; + if (yych == 'e') goto yy642; + goto yy44; yy618: YYDEBUG(618, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy554; - if (yych == 'n') goto yy554; - goto yy166; + if (yych == 'H') goto yy644; + if (yych == 'h') goto yy644; + goto yy44; yy619: YYDEBUG(619, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy466; - if (yych == 'r') goto yy466; - goto yy166; -yy620: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(620, *YYCURSOR); - ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1352 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ENDSWITCH); +} +#line 6206 "Zend/zend_language_scanner.c" +yy621: YYDEBUG(621, *YYCURSOR); - if (yych <= 0x1F) { - if (yych == '\t') goto yy620; - goto yy166; - } else { - if (yych <= ' ') goto yy620; - if (yych == ')') goto yy667; - goto yy166; - } + yych = *++YYCURSOR; + if (yych == 'S') goto yy646; + if (yych == 's') goto yy646; + goto yy44; yy622: YYDEBUG(622, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yych == 'N') goto yy648; + if (yych == 'n') goto yy648; + goto yy44; +yy623: YYDEBUG(623, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1480 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_UNSET_CAST); -} -#line 6583 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == 'F') goto yy649; + if (yych == 'f') goto yy649; + goto yy44; yy624: YYDEBUG(624, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'T') goto yy669; - if (yych == 't') goto yy669; - goto yy128; -yy625: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(625, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy671; - if (yych == 'e') goto yy671; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1512 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_INSTEADOF); +} +#line 6237 "Zend/zend_language_scanner.c" yy626: YYDEBUG(626, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy673; - if (yych == 'e') goto yy673; - goto yy128; -yy627: - YYDEBUG(627, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(628, *YYCURSOR); + YYDEBUG(627, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1332 "Zend/zend_language_scanner.l" +#line 1388 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DECLARE); + RETURN_TOKEN(T_INTERFACE); } -#line 6614 "Zend/zend_language_scanner.c" -yy629: - YYDEBUG(629, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; +#line 6250 "Zend/zend_language_scanner.c" +yy628: + YYDEBUG(628, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(630, *YYCURSOR); + YYDEBUG(629, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1360 "Zend/zend_language_scanner.l" +#line 1504 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DEFAULT); + RETURN_TOKEN(T_NAMESPACE); } -#line 6627 "Zend/zend_language_scanner.c" -yy631: - YYDEBUG(631, *YYCURSOR); +#line 6263 "Zend/zend_language_scanner.c" +yy630: + YYDEBUG(630, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy675; - if (yych == 'a') goto yy675; - goto yy128; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(631, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1548 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_PROTECTED); +} +#line 6276 "Zend/zend_language_scanner.c" yy632: YYDEBUG(632, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy676; - if (yych == 'a') goto yy676; - goto yy128; + if (yych == 'N') goto yy651; + if (yych == 'n') goto yy651; + goto yy44; yy633: YYDEBUG(633, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy677; - if (yych == 'c') goto yy677; - goto yy128; + if (yych == 'M') goto yy652; + if (yych == 'm') goto yy652; + goto yy82; yy634: YYDEBUG(634, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy678; - if (yych == 'e') goto yy678; - goto yy128; -yy635: - YYDEBUG(635, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(636, *YYCURSOR); + YYDEBUG(635, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1396 "Zend/zend_language_scanner.l" +#line 1874 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_EXTENDS); + RETURN_TOKEN(T_CLASS_C); } -#line 6664 "Zend/zend_language_scanner.c" +#line 6301 "Zend/zend_language_scanner.c" +yy636: + YYDEBUG(636, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'N') goto yy653; + if (yych == 'n') goto yy653; + goto yy44; yy637: YYDEBUG(637, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'M') goto yy654; + if (yych == 'm') goto yy654; + goto yy44; +yy638: YYDEBUG(638, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1280 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_FINALLY); -} -#line 6677 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy655; + goto yy44; yy639: YYDEBUG(639, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'C') goto yy657; + if (yych == 'c') goto yy657; + goto yy44; +yy640: YYDEBUG(640, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(641, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1324 "Zend/zend_language_scanner.l" +#line 1878 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FOREACH); + RETURN_TOKEN(T_TRAIT_C); } -#line 6690 "Zend/zend_language_scanner.c" -yy641: - YYDEBUG(641, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy680; - if (yych == 'n') goto yy680; - goto yy128; +#line 6337 "Zend/zend_language_scanner.c" yy642: YYDEBUG(642, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'N') goto yy682; - if (yych == 'n') goto yy682; - goto yy128; -yy643: - YYDEBUG(643, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { - if (yych <= '9') { - if (yych >= '0') goto yy127; - } else { - if (yych <= '@') goto yy644; - if (yych <= 'Z') goto yy127; - } - } else { - if (yych <= '`') { - if (yych <= '_') goto yy683; - } else { - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; - } + if (yybm[0+yych] & 16) { + goto yy43; } + YYDEBUG(643, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1336 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_ENDDECLARE); +} +#line 6350 "Zend/zend_language_scanner.c" yy644: YYDEBUG(644, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(645, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1488 "Zend/zend_language_scanner.l" +#line 1328 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INCLUDE); + RETURN_TOKEN(T_ENDFOREACH); } -#line 6728 "Zend/zend_language_scanner.c" -yy645: - YYDEBUG(645, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy684; - if (yych == 'e') goto yy684; - goto yy128; +#line 6363 "Zend/zend_language_scanner.c" yy646: YYDEBUG(646, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'O') goto yy685; - if (yych == 'o') goto yy685; - goto yy128; -yy647: + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(647, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy686; - if (yych == 'c') goto yy686; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1400 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN(T_IMPLEMENTS); +} +#line 6376 "Zend/zend_language_scanner.c" yy648: YYDEBUG(648, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy687; - if (yych == 'c') goto yy687; - goto yy128; + if (yych == 'C') goto yy658; + if (yych == 'c') goto yy658; + goto yy44; yy649: YYDEBUG(649, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(650, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1544 "Zend/zend_language_scanner.l" +#line 1340 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_PRIVATE); + RETURN_TOKEN(T_INSTANCEOF); } -#line 6765 "Zend/zend_language_scanner.c" +#line 6395 "Zend/zend_language_scanner.c" yy651: YYDEBUG(651, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy688; - if (yych == 'e') goto yy688; - goto yy128; + if (yych == 'C') goto yy659; + if (yych == 'c') goto yy659; + goto yy44; yy652: YYDEBUG(652, *YYCURSOR); - ++YYCURSOR; - if ((yych = *YYCURSOR) <= '^') { + yych = *++YYCURSOR; + if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy127; + if (yych <= '/') goto yy660; + goto yy82; } else { - if (yych <= '@') goto yy653; - if (yych <= 'Z') goto yy127; + if (yych <= '@') goto yy660; + if (yych <= 'Z') goto yy82; + goto yy660; } } else { if (yych <= '`') { - if (yych <= '_') goto yy689; + if (yych <= '_') goto yy82; + goto yy660; } else { - if (yych <= 'z') goto yy127; - if (yych >= 0x80) goto yy127; + if (yych <= 'z') goto yy82; + if (yych <= 0x7F) goto yy660; + goto yy82; } } yy653: YYDEBUG(653, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1496 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_REQUIRE); -} -#line 6797 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy662; + goto yy44; yy654: YYDEBUG(654, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy690; - if (yych == 'r') goto yy690; - goto yy166; + if (yych == 'P') goto yy663; + if (yych == 'p') goto yy663; + goto yy44; yy655: YYDEBUG(655, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy691; - goto yy128; -yy656: - YYDEBUG(656, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(657, *YYCURSOR); + YYDEBUG(656, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1898 "Zend/zend_language_scanner.l" +#line 1886 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_DIR); + RETURN_TOKEN(T_METHOD_C); } -#line 6821 "Zend/zend_language_scanner.c" +#line 6447 "Zend/zend_language_scanner.c" +yy657: + YYDEBUG(657, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'E') goto yy664; + if (yych == 'e') goto yy664; + goto yy44; yy658: YYDEBUG(658, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy692; - goto yy128; + if (yych == 'E') goto yy665; + if (yych == 'e') goto yy665; + goto yy44; yy659: YYDEBUG(659, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'I') goto yy694; - if (yych == 'i') goto yy694; - goto yy128; + if (yych == 'E') goto yy667; + if (yych == 'e') goto yy667; + goto yy44; yy660: YYDEBUG(660, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy695; - if (yych == 'c') goto yy695; - goto yy128; -yy661: + ++YYCURSOR; YYDEBUG(661, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy696; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1262 "Zend/zend_language_scanner.l" + { + yyless(yyleng - 1); + HANDLE_NEWLINES(yytext, yyleng); + RETURN_TOKEN(T_YIELD_FROM); +} +#line 6477 "Zend/zend_language_scanner.c" yy662: YYDEBUG(662, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'D') goto yy698; - if (yych == 'd') goto yy698; - goto yy128; + if (yych == '_') goto yy669; + goto yy44; yy663: YYDEBUG(663, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'P') goto yy699; - if (yych == 'p') goto yy699; - goto yy128; + if (yych == 'I') goto yy671; + if (yych == 'i') goto yy671; + goto yy44; yy664: YYDEBUG(664, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy700; - goto yy128; + if (yych == '_') goto yy672; + goto yy44; yy665: YYDEBUG(665, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(666, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1464 "Zend/zend_language_scanner.l" +#line 1492 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_STRING_CAST); + RETURN_TOKEN(T_INCLUDE_ONCE); } -#line 6870 "Zend/zend_language_scanner.c" +#line 6506 "Zend/zend_language_scanner.c" yy667: YYDEBUG(667, *YYCURSOR); - ++YYCURSOR; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } YYDEBUG(668, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1472 "Zend/zend_language_scanner.l" +#line 1500 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_OBJECT_CAST); + RETURN_TOKEN(T_REQUIRE_ONCE); } -#line 6880 "Zend/zend_language_scanner.c" +#line 6519 "Zend/zend_language_scanner.c" yy669: YYDEBUG(669, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; } YYDEBUG(670, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1536 "Zend/zend_language_scanner.l" +#line 1882 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ABSTRACT); + RETURN_TOKEN(T_FUNC_C); } -#line 6893 "Zend/zend_language_scanner.c" +#line 6532 "Zend/zend_language_scanner.c" yy671: YYDEBUG(671, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'L') goto yy673; + if (yych == 'l') goto yy673; + goto yy44; +yy672: YYDEBUG(672, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1572 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CALLABLE); -} -#line 6906 "Zend/zend_language_scanner.c" + yych = *++YYCURSOR; + if (yych == '_') goto yy674; + goto yy44; yy673: YYDEBUG(673, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + yych = *++YYCURSOR; + if (yych == 'E') goto yy676; + if (yych == 'e') goto yy676; + goto yy44; +yy674: YYDEBUG(674, *YYCURSOR); + yych = *++YYCURSOR; + if (yybm[0+yych] & 16) { + goto yy43; + } + YYDEBUG(675, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1368 "Zend/zend_language_scanner.l" +#line 1902 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_CONTINUE); + RETURN_TOKEN(T_NS_C); } -#line 6919 "Zend/zend_language_scanner.c" -yy675: - YYDEBUG(675, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'R') goto yy701; - if (yych == 'r') goto yy701; - goto yy128; +#line 6562 "Zend/zend_language_scanner.c" yy676: YYDEBUG(676, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'C') goto yy702; - if (yych == 'c') goto yy702; - goto yy128; + if (yych == 'R') goto yy677; + if (yych != 'r') goto yy44; yy677: YYDEBUG(677, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'H') goto yy703; - if (yych == 'h') goto yy703; - goto yy128; -yy678: - YYDEBUG(678, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yybm[0+yych] & 16) { + goto yy43; } - YYDEBUG(679, *YYCURSOR); + YYDEBUG(678, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1308 "Zend/zend_language_scanner.l" +#line 1528 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDWHILE); + RETURN_TOKEN(T_HALT_COMPILER); } -#line 6950 "Zend/zend_language_scanner.c" -yy680: - YYDEBUG(680, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; +#line 6580 "Zend/zend_language_scanner.c" + } +/* *********************************** */ +yyc_ST_LOOKING_FOR_PROPERTY: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 64, 64, 0, 0, 64, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(679, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yybm[0+yych] & 64) { + goto yy683; + } + if (yych <= '^') { + if (yych <= '-') { + if (yych >= '-') goto yy686; + } else { + if (yych <= '@') goto yy681; + if (yych <= 'Z') goto yy687; + } + } else { + if (yych <= '`') { + if (yych <= '_') goto yy687; + } else { + if (yych <= 'z') goto yy687; + if (yych >= 0x80) goto yy687; + } } +yy681: YYDEBUG(681, *YYCURSOR); + ++YYCURSOR; +yy682: + YYDEBUG(682, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1250 "Zend/zend_language_scanner.l" +#line 1422 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FUNCTION); + yyless(0); + yy_pop_state(); + goto restart; } -#line 6963 "Zend/zend_language_scanner.c" -yy682: - YYDEBUG(682, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'T') goto yy705; - if (yych == 't') goto yy705; - goto yy128; +#line 6652 "Zend/zend_language_scanner.c" yy683: YYDEBUG(683, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy706; - if (yych == 'o') goto yy706; - goto yy128; -yy684: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(684, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy707; - if (yych == 'o') goto yy707; - goto yy128; -yy685: + if (yybm[0+yych] & 64) { + goto yy683; + } YYDEBUG(685, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'F') goto yy708; - if (yych == 'f') goto yy708; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1409 "Zend/zend_language_scanner.l" + { + goto return_whitespace; +} +#line 6668 "Zend/zend_language_scanner.c" yy686: YYDEBUG(686, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy710; - if (yych == 'e') goto yy710; - goto yy128; + if (yych == '>') goto yy690; + goto yy682; yy687: YYDEBUG(687, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy712; - if (yych == 'e') goto yy712; - goto yy128; -yy688: + ++YYCURSOR; + YYFILL(1); + yych = *YYCURSOR; YYDEBUG(688, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'D') goto yy714; - if (yych == 'd') goto yy714; - goto yy128; -yy689: + if (yybm[0+yych] & 128) { + goto yy687; + } YYDEBUG(689, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy716; - if (yych == 'o') goto yy716; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 1417 "Zend/zend_language_scanner.l" + { + yy_pop_state(); + RETURN_TOKEN_WITH_STR(T_STRING, 0); +} +#line 6690 "Zend/zend_language_scanner.c" yy690: YYDEBUG(690, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy717; - if (yych == 'o') goto yy717; - goto yy166; -yy691: - YYDEBUG(691, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy718; - goto yy128; -yy692: - YYDEBUG(692, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(693, *YYCURSOR); + YYDEBUG(691, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1894 "Zend/zend_language_scanner.l" +#line 1413 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FILE); + RETURN_TOKEN(T_OBJECT_OPERATOR); } -#line 7035 "Zend/zend_language_scanner.c" -yy694: +#line 6700 "Zend/zend_language_scanner.c" + } +/* *********************************** */ +yyc_ST_BACKQUOTE: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; + YYDEBUG(692, *YYCURSOR); + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '_') { + if (yych == '$') goto yy696; + } else { + if (yych <= '`') goto yy697; + if (yych == '{') goto yy699; + } YYDEBUG(694, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy720; - if (yych == 'o') goto yy720; - goto yy128; + ++YYCURSOR; yy695: YYDEBUG(695, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'O') goto yy721; - if (yych == 'o') goto yy721; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2472 "Zend/zend_language_scanner.l" + { + if (YYCURSOR > YYLIMIT) { + RETURN_TOKEN(END); + } + if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '`': + break; + case '$': + if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { + break; + } + continue; + case '{': + if (*YYCURSOR == '$') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + /* fall through */ + default: + continue; + } + + YYCURSOR--; + break; + } + + yyleng = YYCURSOR - SCNG(yy_text); + + if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '`') == SUCCESS) + || !PARSER_MODE()) { + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + } else { + RETURN_TOKEN(T_ERROR); + } +} +#line 6798 "Zend/zend_language_scanner.c" yy696: YYDEBUG(696, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + yych = *++YYCURSOR; + if (yych <= '_') { + if (yych <= '@') goto yy695; + if (yych <= 'Z') goto yy700; + if (yych <= '^') goto yy695; + goto yy700; + } else { + if (yych <= 'z') { + if (yych <= '`') goto yy695; + goto yy700; + } else { + if (yych <= '{') goto yy703; + if (yych <= 0x7F) goto yy695; + goto yy700; + } } +yy697: YYDEBUG(697, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(698, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1890 "Zend/zend_language_scanner.l" +#line 2412 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_LINE); + BEGIN(ST_IN_SCRIPTING); + RETURN_TOKEN('`'); } -#line 7060 "Zend/zend_language_scanner.c" -yy698: - YYDEBUG(698, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy722; - goto yy128; +#line 6827 "Zend/zend_language_scanner.c" yy699: YYDEBUG(699, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'A') goto yy723; - if (yych == 'a') goto yy723; - goto yy128; + if (yych == '$') goto yy705; + goto yy695; yy700: YYDEBUG(700, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy724; - goto yy128; -yy701: + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; YYDEBUG(701, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy726; - if (yych == 'e') goto yy726; - goto yy128; + if (yybm[0+yych] & 128) { + goto yy700; + } + if (yych == '-') goto yy707; + if (yych <= '@') goto yy702; + if (yych <= '[') goto yy709; yy702: YYDEBUG(702, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'H') goto yy728; - if (yych == 'h') goto yy728; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2003 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); +} +#line 6852 "Zend/zend_language_scanner.c" yy703: YYDEBUG(703, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(704, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1352 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDSWITCH); + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7101 "Zend/zend_language_scanner.c" +#line 6863 "Zend/zend_language_scanner.c" yy705: YYDEBUG(705, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'S') goto yy730; - if (yych == 's') goto yy730; - goto yy128; -yy706: + ++YYCURSOR; YYDEBUG(706, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy732; - if (yych == 'n') goto yy732; - goto yy128; + yyleng = YYCURSOR - SCNG(yy_text); +#line 2400 "Zend/zend_language_scanner.l" + { + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); +} +#line 6875 "Zend/zend_language_scanner.c" yy707: YYDEBUG(707, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'F') goto yy733; - if (yych == 'f') goto yy733; - goto yy128; + if (yych == '>') goto yy711; yy708: YYDEBUG(708, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } + YYCURSOR = YYMARKER; + goto yy702; +yy709: YYDEBUG(709, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1512 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_INSTEADOF); -} -#line 7132 "Zend/zend_language_scanner.c" -yy710: - YYDEBUG(710, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(711, *YYCURSOR); + YYDEBUG(710, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1388 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INTERFACE); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7145 "Zend/zend_language_scanner.c" +#line 6895 "Zend/zend_language_scanner.c" +yy711: + YYDEBUG(711, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '_') { + if (yych <= '@') goto yy708; + if (yych <= 'Z') goto yy712; + if (yych <= '^') goto yy708; + } else { + if (yych <= '`') goto yy708; + if (yych <= 'z') goto yy712; + if (yych <= 0x7F) goto yy708; + } yy712: YYDEBUG(712, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } YYDEBUG(713, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1504 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NAMESPACE); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7158 "Zend/zend_language_scanner.c" -yy714: +#line 6919 "Zend/zend_language_scanner.c" + } +/* *********************************** */ +yyc_ST_DOUBLE_QUOTES: + { + static const unsigned char yybm[] = { + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 0, 0, 0, 0, 0, 0, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 128, + 0, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 0, 0, 0, 0, 0, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, + }; YYDEBUG(714, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + YYFILL(2); + yych = *YYCURSOR; + if (yych <= '#') { + if (yych == '"') goto yy718; + } else { + if (yych <= '$') goto yy720; + if (yych == '{') goto yy721; } - YYDEBUG(715, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1548 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_PROTECTED); -} -#line 7171 "Zend/zend_language_scanner.c" -yy716: YYDEBUG(716, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy735; - if (yych == 'n') goto yy735; - goto yy128; + ++YYCURSOR; yy717: YYDEBUG(717, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'M') goto yy736; - if (yych == 'm') goto yy736; - goto yy166; -yy718: - YYDEBUG(718, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(719, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1874 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_CLASS_C); -} -#line 7196 "Zend/zend_language_scanner.c" -yy720: - YYDEBUG(720, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'N') goto yy737; - if (yych == 'n') goto yy737; - goto yy128; -yy721: - YYDEBUG(721, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'M') goto yy738; - if (yych == 'm') goto yy738; - goto yy128; -yy722: - YYDEBUG(722, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy739; - goto yy128; -yy723: - YYDEBUG(723, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy741; - if (yych == 'c') goto yy741; - goto yy128; -yy724: - YYDEBUG(724, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(725, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1878 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_TRAIT_C); -} -#line 7232 "Zend/zend_language_scanner.c" -yy726: - YYDEBUG(726, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(727, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1336 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_ENDDECLARE); -} -#line 7245 "Zend/zend_language_scanner.c" -yy728: - YYDEBUG(728, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(729, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1328 "Zend/zend_language_scanner.l" +#line 2418 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_ENDFOREACH); -} -#line 7258 "Zend/zend_language_scanner.c" -yy730: - YYDEBUG(730, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (GET_DOUBLE_QUOTES_SCANNED_LENGTH()) { + YYCURSOR += GET_DOUBLE_QUOTES_SCANNED_LENGTH() - 1; + SET_DOUBLE_QUOTES_SCANNED_LENGTH(0); + + goto double_quotes_scan_done; + } + + if (YYCURSOR > YYLIMIT) { + RETURN_TOKEN(END); + } + if (yytext[0] == '\\' && YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '"': + break; + case '$': + if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { + break; + } + continue; + case '{': + if (*YYCURSOR == '$') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT) { + YYCURSOR++; + } + /* fall through */ + default: + continue; } - YYDEBUG(731, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1400 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_IMPLEMENTS); + + YYCURSOR--; + break; + } + +double_quotes_scan_done: + yyleng = YYCURSOR - SCNG(yy_text); + + if (EXPECTED(zend_scan_escape_string(zendlval, yytext, yyleng, '"') == SUCCESS) + || !PARSER_MODE()) { + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + } else { + RETURN_TOKEN(T_ERROR); + } } -#line 7271 "Zend/zend_language_scanner.c" -yy732: - YYDEBUG(732, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy742; - if (yych == 'c') goto yy742; - goto yy128; -yy733: - YYDEBUG(733, *YYCURSOR); +#line 7025 "Zend/zend_language_scanner.c" +yy718: + YYDEBUG(718, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(734, *YYCURSOR); + YYDEBUG(719, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1340 "Zend/zend_language_scanner.l" +#line 2407 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INSTANCEOF); + BEGIN(ST_IN_SCRIPTING); + RETURN_TOKEN('"'); } -#line 7290 "Zend/zend_language_scanner.c" -yy735: - YYDEBUG(735, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'C') goto yy743; - if (yych == 'c') goto yy743; - goto yy128; -yy736: - YYDEBUG(736, *YYCURSOR); +#line 7036 "Zend/zend_language_scanner.c" +yy720: + YYDEBUG(720, *YYCURSOR); yych = *++YYCURSOR; - if (yych <= '^') { - if (yych <= '9') { - if (yych <= '/') goto yy744; - goto yy166; - } else { - if (yych <= '@') goto yy744; - if (yych <= 'Z') goto yy166; - goto yy744; - } + if (yych <= '_') { + if (yych <= '@') goto yy717; + if (yych <= 'Z') goto yy722; + if (yych <= '^') goto yy717; + goto yy722; } else { - if (yych <= '`') { - if (yych <= '_') goto yy166; - goto yy744; + if (yych <= 'z') { + if (yych <= '`') goto yy717; + goto yy722; } else { - if (yych <= 'z') goto yy166; - if (yych <= 0x7F) goto yy744; - goto yy166; + if (yych <= '{') goto yy725; + if (yych <= 0x7F) goto yy717; + goto yy722; } } -yy737: - YYDEBUG(737, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy746; - goto yy128; -yy738: - YYDEBUG(738, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'P') goto yy747; - if (yych == 'p') goto yy747; - goto yy128; -yy739: - YYDEBUG(739, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(740, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1886 "Zend/zend_language_scanner.l" - { - RETURN_TOKEN(T_METHOD_C); -} -#line 7342 "Zend/zend_language_scanner.c" -yy741: - YYDEBUG(741, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy748; - if (yych == 'e') goto yy748; - goto yy128; -yy742: - YYDEBUG(742, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy749; - if (yych == 'e') goto yy749; - goto yy128; -yy743: - YYDEBUG(743, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'E') goto yy751; - if (yych == 'e') goto yy751; - goto yy128; -yy744: - YYDEBUG(744, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(745, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 1262 "Zend/zend_language_scanner.l" - { - yyless(yyleng - 1); - HANDLE_NEWLINES(yytext, yyleng); - RETURN_TOKEN(T_YIELD_FROM); -} -#line 7372 "Zend/zend_language_scanner.c" -yy746: - YYDEBUG(746, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy753; - goto yy128; -yy747: - YYDEBUG(747, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'I') goto yy755; - if (yych == 'i') goto yy755; - goto yy128; -yy748: - YYDEBUG(748, *YYCURSOR); +yy721: + YYDEBUG(721, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '_') goto yy756; - goto yy128; -yy749: - YYDEBUG(749, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yych == '$') goto yy727; + goto yy717; +yy722: + YYDEBUG(722, *YYCURSOR); + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; + YYDEBUG(723, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy722; } - YYDEBUG(750, *YYCURSOR); + if (yych == '-') goto yy729; + if (yych <= '@') goto yy724; + if (yych <= '[') goto yy731; +yy724: + YYDEBUG(724, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1492 "Zend/zend_language_scanner.l" +#line 2003 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_INCLUDE_ONCE); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7401 "Zend/zend_language_scanner.c" -yy751: - YYDEBUG(751, *YYCURSOR); +#line 7079 "Zend/zend_language_scanner.c" +yy725: + YYDEBUG(725, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(752, *YYCURSOR); + YYDEBUG(726, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1500 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_REQUIRE_ONCE); + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7414 "Zend/zend_language_scanner.c" -yy753: - YYDEBUG(753, *YYCURSOR); +#line 7090 "Zend/zend_language_scanner.c" +yy727: + YYDEBUG(727, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(754, *YYCURSOR); + YYDEBUG(728, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1882 "Zend/zend_language_scanner.l" +#line 2400 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_FUNC_C); + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); } -#line 7427 "Zend/zend_language_scanner.c" -yy755: - YYDEBUG(755, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == 'L') goto yy757; - if (yych == 'l') goto yy757; - goto yy128; -yy756: - YYDEBUG(756, *YYCURSOR); - yych = *++YYCURSOR; - if (yych == '_') goto yy758; - goto yy128; -yy757: - YYDEBUG(757, *YYCURSOR); +#line 7102 "Zend/zend_language_scanner.c" +yy729: + YYDEBUG(729, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'E') goto yy760; - if (yych == 'e') goto yy760; - goto yy128; -yy758: - YYDEBUG(758, *YYCURSOR); + if (yych == '>') goto yy733; +yy730: + YYDEBUG(730, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy724; +yy731: + YYDEBUG(731, *YYCURSOR); ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; - } - YYDEBUG(759, *YYCURSOR); + YYDEBUG(732, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1902 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_NS_C); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7457 "Zend/zend_language_scanner.c" -yy760: - YYDEBUG(760, *YYCURSOR); +#line 7122 "Zend/zend_language_scanner.c" +yy733: + YYDEBUG(733, *YYCURSOR); yych = *++YYCURSOR; - if (yych == 'R') goto yy761; - if (yych != 'r') goto yy128; -yy761: - YYDEBUG(761, *YYCURSOR); - ++YYCURSOR; - if (yybm[0+(yych = *YYCURSOR)] & 16) { - goto yy127; + if (yych <= '_') { + if (yych <= '@') goto yy730; + if (yych <= 'Z') goto yy734; + if (yych <= '^') goto yy730; + } else { + if (yych <= '`') goto yy730; + if (yych <= 'z') goto yy734; + if (yych <= 0x7F) goto yy730; } - YYDEBUG(762, *YYCURSOR); +yy734: + YYDEBUG(734, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(735, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1528 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_HALT_COMPILER); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7475 "Zend/zend_language_scanner.c" +#line 7146 "Zend/zend_language_scanner.c" } /* *********************************** */ -yyc_ST_LOOKING_FOR_PROPERTY: +yyc_ST_HEREDOC: { static const unsigned char yybm[] = { 0, 0, 0, 0, 0, 0, 0, 0, - 0, 64, 64, 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 64, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 0, 0, 0, 0, 0, 0, @@ -7510,88 +7181,244 @@ int start_line = CG(zend_lineno); 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(763, *YYCURSOR); + YYDEBUG(736, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; - if (yybm[0+yych] & 64) { - goto yy767; + if (yych == '$') goto yy740; + if (yych == '{') goto yy741; + YYDEBUG(738, *YYCURSOR); + ++YYCURSOR; +yy739: + YYDEBUG(739, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2518 "Zend/zend_language_scanner.l" + { + zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack)); + int newline = 0, indentation = 0, spacing = 0; + + if (YYCURSOR > YYLIMIT) { + RETURN_TOKEN(END); + } + + YYCURSOR--; + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '\r': + if (*YYCURSOR == '\n') { + YYCURSOR++; + } + /* fall through */ + case '\n': + indentation = spacing = 0; + + while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { + if (*YYCURSOR == '\t') { + spacing |= HEREDOC_USING_TABS; + } else { + spacing |= HEREDOC_USING_SPACES; + } + ++YYCURSOR; + ++indentation; + } + + if (YYCURSOR == YYLIMIT) { + yyleng = YYCURSOR - SCNG(yy_text); + HANDLE_NEWLINES(yytext, yyleng); + ZVAL_NULL(zendlval); + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + } + + /* Check for ending label on the next line */ + if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) { + if (IS_LABEL_START(YYCURSOR[heredoc_label->length])) { + continue; + } + + if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { + zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); + } + + /* newline before label will be subtracted from returned text, but + * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */ + if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') { + newline = 2; /* Windows newline */ + } else { + newline = 1; + } + + CG(increment_lineno) = 1; /* For newline before label */ + + if (SCNG(heredoc_scan_ahead)) { + SCNG(heredoc_indentation) = indentation; + SCNG(heredoc_indentation_uses_spaces) = (spacing == HEREDOC_USING_SPACES); + } else { + YYCURSOR -= indentation; + } + + BEGIN(ST_END_HEREDOC); + + goto heredoc_scan_done; + } + continue; + case '$': + if (IS_LABEL_START(*YYCURSOR) || *YYCURSOR == '{') { + break; + } + continue; + case '{': + if (*YYCURSOR == '$') { + break; + } + continue; + case '\\': + if (YYCURSOR < YYLIMIT && *YYCURSOR != '\n' && *YYCURSOR != '\r') { + YYCURSOR++; + } + /* fall through */ + default: + continue; } - if (yych <= '^') { - if (yych <= '-') { - if (yych >= '-') goto yy770; - } else { - if (yych <= '@') goto yy765; - if (yych <= 'Z') goto yy771; - } + + YYCURSOR--; + break; + } + +heredoc_scan_done: + + yyleng = YYCURSOR - SCNG(yy_text); + ZVAL_STRINGL(zendlval, yytext, yyleng); + + if (!SCNG(heredoc_scan_ahead) && !EG(exception) && PARSER_MODE()) { + zend_string *copy = Z_STR_P(zendlval); + + if (!strip_multiline_string_indentation(zendlval, newline, heredoc_label->indentation, heredoc_label->indentation_uses_spaces)) { + RETURN_TOKEN(T_ERROR); + } + + if (UNEXPECTED(zend_scan_escape_string(zendlval, ZSTR_VAL(copy), ZSTR_LEN(copy), 0) != SUCCESS)) { + zend_string_efree(copy); + RETURN_TOKEN(T_ERROR); + } + + zend_string_efree(copy); + } else { + HANDLE_NEWLINES(yytext, yyleng - newline); + } + + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); +} +#line 7312 "Zend/zend_language_scanner.c" +yy740: + YYDEBUG(740, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '_') { + if (yych <= '@') goto yy739; + if (yych <= 'Z') goto yy742; + if (yych <= '^') goto yy739; + goto yy742; } else { - if (yych <= '`') { - if (yych <= '_') goto yy771; + if (yych <= 'z') { + if (yych <= '`') goto yy739; + goto yy742; } else { - if (yych <= 'z') goto yy771; - if (yych >= 0x80) goto yy771; + if (yych <= '{') goto yy745; + if (yych <= 0x7F) goto yy739; + goto yy742; } } -yy765: - YYDEBUG(765, *YYCURSOR); +yy741: + YYDEBUG(741, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '$') goto yy747; + goto yy739; +yy742: + YYDEBUG(742, *YYCURSOR); + YYMARKER = ++YYCURSOR; + YYFILL(3); + yych = *YYCURSOR; + YYDEBUG(743, *YYCURSOR); + if (yybm[0+yych] & 128) { + goto yy742; + } + if (yych == '-') goto yy749; + if (yych <= '@') goto yy744; + if (yych <= '[') goto yy751; +yy744: + YYDEBUG(744, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2003 "Zend/zend_language_scanner.l" + { + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); +} +#line 7355 "Zend/zend_language_scanner.c" +yy745: + YYDEBUG(745, *YYCURSOR); ++YYCURSOR; -yy766: - YYDEBUG(766, *YYCURSOR); + YYDEBUG(746, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1422 "Zend/zend_language_scanner.l" +#line 1703 "Zend/zend_language_scanner.l" { - yyless(0); - yy_pop_state(); - goto restart; + yy_push_state(ST_LOOKING_FOR_VARNAME); + RETURN_TOKEN(T_DOLLAR_OPEN_CURLY_BRACES); } -#line 7547 "Zend/zend_language_scanner.c" -yy767: - YYDEBUG(767, *YYCURSOR); +#line 7366 "Zend/zend_language_scanner.c" +yy747: + YYDEBUG(747, *YYCURSOR); ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(768, *YYCURSOR); - if (yybm[0+yych] & 64) { - goto yy767; - } - YYDEBUG(769, *YYCURSOR); + YYDEBUG(748, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1409 "Zend/zend_language_scanner.l" +#line 2400 "Zend/zend_language_scanner.l" { - goto return_whitespace; + yy_push_state(ST_IN_SCRIPTING); + yyless(1); + RETURN_TOKEN(T_CURLY_OPEN); } -#line 7563 "Zend/zend_language_scanner.c" -yy770: - YYDEBUG(770, *YYCURSOR); +#line 7378 "Zend/zend_language_scanner.c" +yy749: + YYDEBUG(749, *YYCURSOR); yych = *++YYCURSOR; - if (yych == '>') goto yy774; - goto yy766; -yy771: - YYDEBUG(771, *YYCURSOR); + if (yych == '>') goto yy753; +yy750: + YYDEBUG(750, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy744; +yy751: + YYDEBUG(751, *YYCURSOR); ++YYCURSOR; - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(772, *YYCURSOR); - if (yybm[0+yych] & 128) { - goto yy771; - } - YYDEBUG(773, *YYCURSOR); + YYDEBUG(752, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1417 "Zend/zend_language_scanner.l" +#line 1997 "Zend/zend_language_scanner.l" { - yy_pop_state(); - RETURN_TOKEN_WITH_STR(T_STRING, 0); + yyless(yyleng - 1); + yy_push_state(ST_VAR_OFFSET); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7585 "Zend/zend_language_scanner.c" -yy774: - YYDEBUG(774, *YYCURSOR); +#line 7398 "Zend/zend_language_scanner.c" +yy753: + YYDEBUG(753, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '_') { + if (yych <= '@') goto yy750; + if (yych <= 'Z') goto yy754; + if (yych <= '^') goto yy750; + } else { + if (yych <= '`') goto yy750; + if (yych <= 'z') goto yy754; + if (yych <= 0x7F) goto yy750; + } +yy754: + YYDEBUG(754, *YYCURSOR); ++YYCURSOR; - YYDEBUG(775, *YYCURSOR); + YYDEBUG(755, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); -#line 1413 "Zend/zend_language_scanner.l" +#line 1989 "Zend/zend_language_scanner.l" { - RETURN_TOKEN(T_OBJECT_OPERATOR); + yyless(yyleng - 3); + yy_push_state(ST_LOOKING_FOR_PROPERTY); + RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 7595 "Zend/zend_language_scanner.c" +#line 7422 "Zend/zend_language_scanner.c" } /* *********************************** */ yyc_ST_LOOKING_FOR_VARNAME: @@ -7630,23 +7457,23 @@ int start_line = CG(zend_lineno); 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, }; - YYDEBUG(776, *YYCURSOR); + YYDEBUG(756, *YYCURSOR); YYFILL(2); yych = *YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy778; - if (yych <= 'Z') goto yy780; - if (yych >= '_') goto yy780; + if (yych <= '@') goto yy758; + if (yych <= 'Z') goto yy760; + if (yych >= '_') goto yy760; } else { - if (yych <= '`') goto yy778; - if (yych <= 'z') goto yy780; - if (yych >= 0x80) goto yy780; + if (yych <= '`') goto yy758; + if (yych <= 'z') goto yy760; + if (yych >= 0x80) goto yy760; } -yy778: - YYDEBUG(778, *YYCURSOR); +yy758: + YYDEBUG(758, *YYCURSOR); ++YYCURSOR; -yy779: - YYDEBUG(779, *YYCURSOR); +yy759: + YYDEBUG(759, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1726 "Zend/zend_language_scanner.l" { @@ -7655,52 +7482,52 @@ int start_line = CG(zend_lineno); yy_push_state(ST_IN_SCRIPTING); goto restart; } -#line 7659 "Zend/zend_language_scanner.c" -yy780: - YYDEBUG(780, *YYCURSOR); +#line 7486 "Zend/zend_language_scanner.c" +yy760: + YYDEBUG(760, *YYCURSOR); yych = *(YYMARKER = ++YYCURSOR); if (yych <= '_') { if (yych <= '@') { - if (yych <= '/') goto yy779; - if (yych <= '9') goto yy782; - goto yy779; + if (yych <= '/') goto yy759; + if (yych <= '9') goto yy762; + goto yy759; } else { - if (yych <= '[') goto yy782; - if (yych <= '^') goto yy779; - goto yy782; + if (yych <= '[') goto yy762; + if (yych <= '^') goto yy759; + goto yy762; } } else { if (yych <= '|') { - if (yych <= '`') goto yy779; - if (yych <= 'z') goto yy782; - goto yy779; + if (yych <= '`') goto yy759; + if (yych <= 'z') goto yy762; + goto yy759; } else { - if (yych <= '}') goto yy782; - if (yych <= 0x7F) goto yy779; - goto yy782; + if (yych <= '}') goto yy762; + if (yych <= 0x7F) goto yy759; + goto yy762; } } -yy781: - YYDEBUG(781, *YYCURSOR); +yy761: + YYDEBUG(761, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; -yy782: - YYDEBUG(782, *YYCURSOR); +yy762: + YYDEBUG(762, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy781; + goto yy761; } - if (yych <= '@') goto yy783; - if (yych <= '[') goto yy784; - if (yych == '}') goto yy784; -yy783: - YYDEBUG(783, *YYCURSOR); + if (yych <= '@') goto yy763; + if (yych <= '[') goto yy764; + if (yych == '}') goto yy764; +yy763: + YYDEBUG(763, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy779; -yy784: - YYDEBUG(784, *YYCURSOR); + goto yy759; +yy764: + YYDEBUG(764, *YYCURSOR); ++YYCURSOR; - YYDEBUG(785, *YYCURSOR); + YYDEBUG(765, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1718 "Zend/zend_language_scanner.l" { @@ -7709,101 +7536,8 @@ int start_line = CG(zend_lineno); yy_push_state(ST_IN_SCRIPTING); RETURN_TOKEN_WITH_STR(T_STRING_VARNAME, 0); } -#line 7713 "Zend/zend_language_scanner.c" - } -/* *********************************** */ -yyc_ST_NOWDOC: - YYDEBUG(786, *YYCURSOR); - YYFILL(1); - yych = *YYCURSOR; - YYDEBUG(788, *YYCURSOR); - ++YYCURSOR; - YYDEBUG(789, *YYCURSOR); - yyleng = YYCURSOR - SCNG(yy_text); -#line 2636 "Zend/zend_language_scanner.l" - { - zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack)); - int newline = 0, indentation = 0, spacing = -1; - - if (YYCURSOR > YYLIMIT) { - RETURN_TOKEN(END); - } - - YYCURSOR--; - - while (YYCURSOR < YYLIMIT) { - switch (*YYCURSOR++) { - case '\r': - if (*YYCURSOR == '\n') { - YYCURSOR++; - } - /* fall through */ - case '\n': - indentation = spacing = 0; - - while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { - if (*YYCURSOR == '\t') { - spacing |= HEREDOC_USING_TABS; - } else { - spacing |= HEREDOC_USING_SPACES; - } - ++YYCURSOR; - ++indentation; - } - - if (YYCURSOR == YYLIMIT) { - yyleng = YYCURSOR - SCNG(yy_text); - HANDLE_NEWLINES(yytext, yyleng); - ZVAL_NULL(zendlval); - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); - } - - /* Check for ending label on the next line */ - if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) { - if (IS_LABEL_START(YYCURSOR[heredoc_label->length])) { - continue; - } - - if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { - zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); - } - - /* newline before label will be subtracted from returned text, but - * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */ - if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') { - newline = 2; /* Windows newline */ - } else { - newline = 1; - } - - CG(increment_lineno) = 1; /* For newline before label */ - - YYCURSOR -= indentation; - heredoc_label->indentation = indentation; - - BEGIN(ST_END_HEREDOC); - - goto nowdoc_scan_done; - } - /* fall through */ - default: - continue; - } - } - -nowdoc_scan_done: - yyleng = YYCURSOR - SCNG(yy_text); - ZVAL_STRINGL(zendlval, yytext, yyleng); - - if (!EG(exception) && spacing != -1 && PARSER_MODE() - && !strip_multiline_string_indentation(zendlval, newline, indentation, spacing == HEREDOC_USING_SPACES)) { - RETURN_TOKEN(T_ERROR); +#line 7540 "Zend/zend_language_scanner.c" } - - HANDLE_NEWLINES(yytext, yyleng - newline); - RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); -} -#line 7807 "Zend/zend_language_scanner.c" /* *********************************** */ yyc_ST_VAR_OFFSET: { @@ -7841,55 +7575,55 @@ int start_line = CG(zend_lineno); 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, }; - YYDEBUG(790, *YYCURSOR); + YYDEBUG(766, *YYCURSOR); YYFILL(3); yych = *YYCURSOR; if (yych <= '0') { if (yych <= ' ') { if (yych <= '\f') { - if (yych <= 0x08) goto yy792; - if (yych <= '\n') goto yy794; + if (yych <= 0x08) goto yy768; + if (yych <= '\n') goto yy770; } else { - if (yych <= '\r') goto yy794; - if (yych >= ' ') goto yy794; + if (yych <= '\r') goto yy770; + if (yych >= ' ') goto yy770; } } else { if (yych <= '$') { - if (yych <= '"') goto yy796; - if (yych <= '#') goto yy794; - goto yy798; + if (yych <= '"') goto yy772; + if (yych <= '#') goto yy770; + goto yy774; } else { - if (yych == '\'') goto yy794; - if (yych <= '/') goto yy796; - goto yy799; + if (yych == '\'') goto yy770; + if (yych <= '/') goto yy772; + goto yy775; } } } else { if (yych <= ']') { if (yych <= 'Z') { - if (yych <= '9') goto yy801; - if (yych <= '@') goto yy796; - goto yy803; + if (yych <= '9') goto yy777; + if (yych <= '@') goto yy772; + goto yy779; } else { - if (yych <= '[') goto yy796; - if (yych <= '\\') goto yy794; - goto yy806; + if (yych <= '[') goto yy772; + if (yych <= '\\') goto yy770; + goto yy782; } } else { if (yych <= '`') { - if (yych == '_') goto yy803; - goto yy796; + if (yych == '_') goto yy779; + goto yy772; } else { - if (yych <= 'z') goto yy803; - if (yych <= '~') goto yy796; - if (yych >= 0x80) goto yy803; + if (yych <= 'z') goto yy779; + if (yych <= '~') goto yy772; + if (yych >= 0x80) goto yy779; } } } -yy792: - YYDEBUG(792, *YYCURSOR); +yy768: + YYDEBUG(768, *YYCURSOR); ++YYCURSOR; - YYDEBUG(793, *YYCURSOR); + YYDEBUG(769, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2720 "Zend/zend_language_scanner.l" { @@ -7900,11 +7634,11 @@ int start_line = CG(zend_lineno); zend_error(E_COMPILE_WARNING,"Unexpected character in input: '%c' (ASCII=%d) state=%d", yytext[0], yytext[0], YYSTATE); goto restart; } -#line 7904 "Zend/zend_language_scanner.c" -yy794: - YYDEBUG(794, *YYCURSOR); +#line 7638 "Zend/zend_language_scanner.c" +yy770: + YYDEBUG(770, *YYCURSOR); ++YYCURSOR; - YYDEBUG(795, *YYCURSOR); + YYDEBUG(771, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2017 "Zend/zend_language_scanner.l" { @@ -7914,52 +7648,52 @@ int start_line = CG(zend_lineno); ZVAL_NULL(zendlval); RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); } -#line 7918 "Zend/zend_language_scanner.c" -yy796: - YYDEBUG(796, *YYCURSOR); +#line 7652 "Zend/zend_language_scanner.c" +yy772: + YYDEBUG(772, *YYCURSOR); ++YYCURSOR; -yy797: - YYDEBUG(797, *YYCURSOR); +yy773: + YYDEBUG(773, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2012 "Zend/zend_language_scanner.l" { /* Only '[' or '-' can be valid, but returning other tokens will allow a more explicit parse error */ RETURN_TOKEN(yytext[0]); } -#line 7930 "Zend/zend_language_scanner.c" -yy798: - YYDEBUG(798, *YYCURSOR); +#line 7664 "Zend/zend_language_scanner.c" +yy774: + YYDEBUG(774, *YYCURSOR); yych = *++YYCURSOR; if (yych <= '_') { - if (yych <= '@') goto yy797; - if (yych <= 'Z') goto yy808; - if (yych <= '^') goto yy797; - goto yy808; + if (yych <= '@') goto yy773; + if (yych <= 'Z') goto yy784; + if (yych <= '^') goto yy773; + goto yy784; } else { - if (yych <= '`') goto yy797; - if (yych <= 'z') goto yy808; - if (yych <= 0x7F) goto yy797; - goto yy808; + if (yych <= '`') goto yy773; + if (yych <= 'z') goto yy784; + if (yych <= 0x7F) goto yy773; + goto yy784; } -yy799: - YYDEBUG(799, *YYCURSOR); +yy775: + YYDEBUG(775, *YYCURSOR); yych = *(YYMARKER = ++YYCURSOR); if (yych <= 'W') { if (yych <= '9') { - if (yych >= '0') goto yy811; + if (yych >= '0') goto yy787; } else { - if (yych == 'B') goto yy814; + if (yych == 'B') goto yy790; } } else { if (yych <= 'b') { - if (yych <= 'X') goto yy816; - if (yych >= 'b') goto yy814; + if (yych <= 'X') goto yy792; + if (yych >= 'b') goto yy790; } else { - if (yych == 'x') goto yy816; + if (yych == 'x') goto yy792; } } -yy800: - YYDEBUG(800, *YYCURSOR); +yy776: + YYDEBUG(776, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1840 "Zend/zend_language_scanner.l" { /* Offset could be treated as a long */ @@ -7977,83 +7711,83 @@ int start_line = CG(zend_lineno); } RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } -#line 7981 "Zend/zend_language_scanner.c" -yy801: - YYDEBUG(801, *YYCURSOR); +#line 7715 "Zend/zend_language_scanner.c" +yy777: + YYDEBUG(777, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(802, *YYCURSOR); + YYDEBUG(778, *YYCURSOR); if (yybm[0+yych] & 16) { - goto yy801; + goto yy777; } - goto yy800; -yy803: - YYDEBUG(803, *YYCURSOR); + goto yy776; +yy779: + YYDEBUG(779, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(804, *YYCURSOR); + YYDEBUG(780, *YYCURSOR); if (yybm[0+yych] & 32) { - goto yy803; + goto yy779; } - YYDEBUG(805, *YYCURSOR); + YYDEBUG(781, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2025 "Zend/zend_language_scanner.l" { RETURN_TOKEN_WITH_STR(T_STRING, 0); } -#line 8007 "Zend/zend_language_scanner.c" -yy806: - YYDEBUG(806, *YYCURSOR); +#line 7741 "Zend/zend_language_scanner.c" +yy782: + YYDEBUG(782, *YYCURSOR); ++YYCURSOR; - YYDEBUG(807, *YYCURSOR); + YYDEBUG(783, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2007 "Zend/zend_language_scanner.l" { yy_pop_state(); RETURN_TOKEN(']'); } -#line 8018 "Zend/zend_language_scanner.c" -yy808: - YYDEBUG(808, *YYCURSOR); +#line 7752 "Zend/zend_language_scanner.c" +yy784: + YYDEBUG(784, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(809, *YYCURSOR); + YYDEBUG(785, *YYCURSOR); if (yych <= '^') { if (yych <= '9') { - if (yych >= '0') goto yy808; + if (yych >= '0') goto yy784; } else { - if (yych <= '@') goto yy810; - if (yych <= 'Z') goto yy808; + if (yych <= '@') goto yy786; + if (yych <= 'Z') goto yy784; } } else { if (yych <= '`') { - if (yych <= '_') goto yy808; + if (yych <= '_') goto yy784; } else { - if (yych <= 'z') goto yy808; - if (yych >= 0x80) goto yy808; + if (yych <= 'z') goto yy784; + if (yych >= 0x80) goto yy784; } } -yy810: - YYDEBUG(810, *YYCURSOR); +yy786: + YYDEBUG(786, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 2003 "Zend/zend_language_scanner.l" { RETURN_TOKEN_WITH_STR(T_VARIABLE, 1); } -#line 8047 "Zend/zend_language_scanner.c" -yy811: - YYDEBUG(811, *YYCURSOR); +#line 7781 "Zend/zend_language_scanner.c" +yy787: + YYDEBUG(787, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(812, *YYCURSOR); - if (yych <= '/') goto yy813; - if (yych <= '9') goto yy811; -yy813: - YYDEBUG(813, *YYCURSOR); + YYDEBUG(788, *YYCURSOR); + if (yych <= '/') goto yy789; + if (yych <= '9') goto yy787; +yy789: + YYDEBUG(789, *YYCURSOR); yyleng = YYCURSOR - SCNG(yy_text); #line 1856 "Zend/zend_language_scanner.l" { /* Offset must be treated as a string */ @@ -8064,45 +7798,307 @@ int start_line = CG(zend_lineno); } RETURN_TOKEN_WITH_VAL(T_NUM_STRING); } -#line 8068 "Zend/zend_language_scanner.c" -yy814: - YYDEBUG(814, *YYCURSOR); +#line 7802 "Zend/zend_language_scanner.c" +yy790: + YYDEBUG(790, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 64) { - goto yy817; + goto yy793; } -yy815: - YYDEBUG(815, *YYCURSOR); +yy791: + YYDEBUG(791, *YYCURSOR); YYCURSOR = YYMARKER; - goto yy800; -yy816: - YYDEBUG(816, *YYCURSOR); + goto yy776; +yy792: + YYDEBUG(792, *YYCURSOR); yych = *++YYCURSOR; if (yybm[0+yych] & 128) { - goto yy819; + goto yy795; } - goto yy815; -yy817: - YYDEBUG(817, *YYCURSOR); + goto yy791; +yy793: + YYDEBUG(793, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(818, *YYCURSOR); + YYDEBUG(794, *YYCURSOR); if (yybm[0+yych] & 64) { - goto yy817; + goto yy793; } - goto yy813; -yy819: - YYDEBUG(819, *YYCURSOR); + goto yy789; +yy795: + YYDEBUG(795, *YYCURSOR); ++YYCURSOR; YYFILL(1); yych = *YYCURSOR; - YYDEBUG(820, *YYCURSOR); + YYDEBUG(796, *YYCURSOR); if (yybm[0+yych] & 128) { - goto yy819; + goto yy795; + } + goto yy789; + } +/* *********************************** */ +yyc_INITIAL: + YYDEBUG(797, *YYCURSOR); + YYFILL(7); + yych = *YYCURSOR; + if (yych == '<') goto yy801; + YYDEBUG(799, *YYCURSOR); + ++YYCURSOR; +yy800: + YYDEBUG(800, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1938 "Zend/zend_language_scanner.l" + { + if (YYCURSOR > YYLIMIT) { + RETURN_TOKEN(END); + } + +inline_char_handler: + + while (1) { + YYCTYPE *ptr = memchr(YYCURSOR, '<', YYLIMIT - YYCURSOR); + + YYCURSOR = ptr ? ptr + 1 : YYLIMIT; + + if (YYCURSOR >= YYLIMIT) { + break; + } + + if (*YYCURSOR == '?') { + if (CG(short_tags) || !strncasecmp((char*)YYCURSOR + 1, "php", 3) || (*(YYCURSOR + 1) == '=')) { /* Assume [ \t\n\r] follows "php" */ + + YYCURSOR--; + break; + } + } + } + + yyleng = YYCURSOR - SCNG(yy_text); + + if (SCNG(output_filter)) { + size_t readsize; + char *s = NULL; + size_t sz = 0; + // TODO: avoid reallocation ??? + readsize = SCNG(output_filter)((unsigned char **)&s, &sz, (unsigned char *)yytext, (size_t)yyleng); + ZVAL_STRINGL(zendlval, s, sz); + efree(s); + if (readsize < yyleng) { + yyless(readsize); + } + } else if (yyleng == 1) { + ZVAL_INTERNED_STR(zendlval, ZSTR_CHAR((zend_uchar)*yytext)); + } else { + ZVAL_STRINGL(zendlval, yytext, yyleng); + } + HANDLE_NEWLINES(yytext, yyleng); + RETURN_TOKEN_WITH_VAL(T_INLINE_HTML); +} +#line 7899 "Zend/zend_language_scanner.c" +yy801: + YYDEBUG(801, *YYCURSOR); + yych = *++YYCURSOR; + if (yych != '?') goto yy800; + YYDEBUG(802, *YYCURSOR); + yych = *(YYMARKER = ++YYCURSOR); + if (yych <= 'O') { + if (yych == '=') goto yy804; + } else { + if (yych <= 'P') goto yy806; + if (yych == 'p') goto yy806; + } +yy803: + YYDEBUG(803, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1926 "Zend/zend_language_scanner.l" + { + if (CG(short_tags)) { + BEGIN(ST_IN_SCRIPTING); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_OPEN_TAG); + } + RETURN_TOKEN(T_OPEN_TAG); + } else { + goto inline_char_handler; + } +} +#line 7927 "Zend/zend_language_scanner.c" +yy804: + YYDEBUG(804, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(805, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1907 "Zend/zend_language_scanner.l" + { + BEGIN(ST_IN_SCRIPTING); + if (PARSER_MODE()) { + RETURN_TOKEN(T_ECHO); + } + RETURN_TOKEN(T_OPEN_TAG_WITH_ECHO); +} +#line 7941 "Zend/zend_language_scanner.c" +yy806: + YYDEBUG(806, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'H') goto yy808; + if (yych == 'h') goto yy808; +yy807: + YYDEBUG(807, *YYCURSOR); + YYCURSOR = YYMARKER; + goto yy803; +yy808: + YYDEBUG(808, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == 'P') goto yy809; + if (yych != 'p') goto yy807; +yy809: + YYDEBUG(809, *YYCURSOR); + yych = *++YYCURSOR; + if (yych <= '\f') { + if (yych <= 0x08) goto yy807; + if (yych >= '\v') goto yy807; + } else { + if (yych <= '\r') goto yy812; + if (yych != ' ') goto yy807; + } +yy810: + YYDEBUG(810, *YYCURSOR); + ++YYCURSOR; +yy811: + YYDEBUG(811, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 1916 "Zend/zend_language_scanner.l" + { + HANDLE_NEWLINE(yytext[yyleng-1]); + BEGIN(ST_IN_SCRIPTING); + if (EXPECTED(elem != NULL)) { + SKIP_TOKEN(T_OPEN_TAG); + } + RETURN_TOKEN(T_OPEN_TAG); +} +#line 7981 "Zend/zend_language_scanner.c" +yy812: + YYDEBUG(812, *YYCURSOR); + yych = *++YYCURSOR; + if (yych == '\n') goto yy810; + goto yy811; +/* *********************************** */ +yyc_ST_END_HEREDOC: + YYDEBUG(813, *YYCURSOR); + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(815, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(816, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2386 "Zend/zend_language_scanner.l" + { + zend_heredoc_label *heredoc_label = zend_ptr_stack_pop(&SCNG(heredoc_label_stack)); + + yyleng = heredoc_label->indentation + heredoc_label->length; + YYCURSOR += yyleng - 1; + + heredoc_label_dtor(heredoc_label); + efree(heredoc_label); + + BEGIN(ST_IN_SCRIPTING); + RETURN_TOKEN(T_END_HEREDOC); +} +#line 8009 "Zend/zend_language_scanner.c" +/* *********************************** */ +yyc_ST_NOWDOC: + YYDEBUG(817, *YYCURSOR); + YYFILL(1); + yych = *YYCURSOR; + YYDEBUG(819, *YYCURSOR); + ++YYCURSOR; + YYDEBUG(820, *YYCURSOR); + yyleng = YYCURSOR - SCNG(yy_text); +#line 2636 "Zend/zend_language_scanner.l" + { + zend_heredoc_label *heredoc_label = zend_ptr_stack_top(&SCNG(heredoc_label_stack)); + int newline = 0, indentation = 0, spacing = -1; + + if (YYCURSOR > YYLIMIT) { + RETURN_TOKEN(END); + } + + YYCURSOR--; + + while (YYCURSOR < YYLIMIT) { + switch (*YYCURSOR++) { + case '\r': + if (*YYCURSOR == '\n') { + YYCURSOR++; + } + /* fall through */ + case '\n': + indentation = spacing = 0; + + while (YYCURSOR < YYLIMIT && (*YYCURSOR == ' ' || *YYCURSOR == '\t')) { + if (*YYCURSOR == '\t') { + spacing |= HEREDOC_USING_TABS; + } else { + spacing |= HEREDOC_USING_SPACES; + } + ++YYCURSOR; + ++indentation; + } + + if (YYCURSOR == YYLIMIT) { + yyleng = YYCURSOR - SCNG(yy_text); + HANDLE_NEWLINES(yytext, yyleng); + ZVAL_NULL(zendlval); + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); + } + + /* Check for ending label on the next line */ + if (IS_LABEL_START(*YYCURSOR) && heredoc_label->length < YYLIMIT - YYCURSOR && !memcmp(YYCURSOR, heredoc_label->label, heredoc_label->length)) { + if (IS_LABEL_START(YYCURSOR[heredoc_label->length])) { + continue; + } + + if (spacing == (HEREDOC_USING_SPACES | HEREDOC_USING_TABS)) { + zend_throw_exception(zend_ce_parse_error, "Invalid indentation - tabs and spaces cannot be mixed", 0); + } + + /* newline before label will be subtracted from returned text, but + * yyleng/yytext will include it, for zend_highlight/strip, tokenizer, etc. */ + if (YYCURSOR[-indentation - 2] == '\r' && YYCURSOR[-indentation - 1] == '\n') { + newline = 2; /* Windows newline */ + } else { + newline = 1; + } + + CG(increment_lineno) = 1; /* For newline before label */ + + YYCURSOR -= indentation; + heredoc_label->indentation = indentation; + + BEGIN(ST_END_HEREDOC); + + goto nowdoc_scan_done; + } + /* fall through */ + default: + continue; } - goto yy813; } + +nowdoc_scan_done: + yyleng = YYCURSOR - SCNG(yy_text); + ZVAL_STRINGL(zendlval, yytext, yyleng); + + if (!EG(exception) && spacing != -1 && PARSER_MODE() + && !strip_multiline_string_indentation(zendlval, newline, indentation, spacing == HEREDOC_USING_SPACES)) { + RETURN_TOKEN(T_ERROR); + } + + HANDLE_NEWLINES(yytext, yyleng - newline); + RETURN_TOKEN_WITH_VAL(T_ENCAPSED_AND_WHITESPACE); +} +#line 8102 "Zend/zend_language_scanner.c" } #line 2729 "Zend/zend_language_scanner.l" diff --git a/Zend/zend_language_scanner_defs.h b/Zend/zend_language_scanner_defs.h index c89b1bba457d0..3c01b5bc76161 100644 --- a/Zend/zend_language_scanner_defs.h +++ b/Zend/zend_language_scanner_defs.h @@ -1,4 +1,4 @@ -/* Generated by re2c 0.16 */ +/* Generated by re2c 1.0.1 */ #line 3 "Zend/zend_language_scanner_defs.h" enum YYCONDTYPE { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index de391a931acc6..9114a9689c06a 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -872,7 +872,7 @@ ZEND_VM_C_LABEL(assign_op_object): } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -2387,7 +2387,7 @@ ZEND_VM_C_LABEL(assign_object): if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -9190,7 +9190,7 @@ ZEND_VM_HOT_TYPE_SPEC_HANDLER(ZEND_FE_FETCH_R, op->op2_type == IS_CV && (op1_inf } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7ab280342b7e6..448b24afa3002 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22059,7 +22059,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -22961,7 +22961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23102,7 +23102,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23243,7 +23243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23384,7 +23384,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23935,7 +23935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -24061,7 +24061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -24850,7 +24850,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -25757,7 +25757,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25898,7 +25898,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26039,7 +26039,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26180,7 +26180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26675,7 +26675,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -26801,7 +26801,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -29104,7 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -30006,7 +30006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30147,7 +30147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30288,7 +30288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -30429,7 +30429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31029,7 +31029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -31155,7 +31155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -31797,7 +31797,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -31849,7 +31849,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_R_SIMPLE_ } variable_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op2.var EXECUTE_DATA_CC); - zend_assign_to_variable(variable_ptr, value, IS_CV); + zend_assign_to_variable(variable_ptr, value, IS_CV, EX_USES_STRICT_TYPES()); ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } @@ -32126,7 +32126,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -32810,7 +32810,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -32951,7 +32951,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -33092,7 +33092,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -33233,7 +33233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -33378,7 +33378,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -33503,7 +33503,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -34341,7 +34341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -35029,7 +35029,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -35170,7 +35170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -35311,7 +35311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -35452,7 +35452,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -35597,7 +35597,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -35722,7 +35722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -37189,7 +37189,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -37873,7 +37873,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -38014,7 +38014,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -38155,7 +38155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -38296,7 +38296,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -38441,7 +38441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -38566,7 +38566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -41726,7 +41726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -42999,7 +42999,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -43140,7 +43140,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -43281,7 +43281,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -43422,7 +43422,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -43973,7 +43973,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -44098,7 +44098,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -46093,7 +46093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -47248,7 +47248,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -47389,7 +47389,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -47530,7 +47530,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -47671,7 +47671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op2); @@ -48166,7 +48166,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -48291,7 +48291,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -52155,7 +52155,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } } else { - zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op, OPLINE_CC EXECUTE_DATA_CC); + zend_assign_op_overloaded_property(object, property, cache_slot, value, binary_op OPLINE_CC EXECUTE_DATA_CC); } } while (0); @@ -53303,7 +53303,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -53444,7 +53444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -53585,7 +53585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); zval_ptr_dtor_nogc(free_op_data); @@ -53726,7 +53726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property_name), value); + zend_verify_property_type_error(prop_info, Z_STR_P(property), value); @@ -54325,7 +54325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data); + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { @@ -54450,7 +54450,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W(execute_data, (opline+1)->op1.var); + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) || UNEXPECTED(Z_ISERROR(variable))) { diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index aaeb8fc4327a8..027e47f5caaad 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -573,10 +573,10 @@ $op_data_get_zval_ptr_ptr = array( "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", "TMP" => "NULL", - "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, execute_data, &free_op_data)", + "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)", "CONST" => "NULL", "UNUSED" => "NULL", - "CV" => "_get_zval_ptr_cv_\\1(execute_data, (opline+1)->op1.var)", + "CV" => "_get_zval_ptr_cv_\\1((opline+1)->op1.var EXECUTE_DATA_CC)", "TMPVAR" => "???", "TMPVARCV" => "???", ); diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 812f81ff04e60..20ce0710593a9 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2281,7 +2281,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss ce = ssa->var_info[ssa->ops[i].op1_use].ce; } if (ce) { - prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline->op2, ssa->rt_constants))); + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); } } diff --git a/ext/standard/file.c b/ext/standard/file.c index c57602bedfb22..8517f3c167555 100644 --- a/ext/standard/file.c +++ b/ext/standard/file.c @@ -342,11 +342,7 @@ PHP_FUNCTION(flock) Z_PARAM_RESOURCE(res) Z_PARAM_LONG(operation) Z_PARAM_OPTIONAL -<<<<<<< HEAD Z_PARAM_ZVAL(wouldblock) -======= - Z_PARAM_ZVAL_DEREF(wouldblock) ->>>>>>> master ZEND_PARSE_PARAMETERS_END(); PHP_STREAM_TO_ZVAL(stream, res); @@ -358,12 +354,7 @@ PHP_FUNCTION(flock) } if (wouldblock) { -<<<<<<< HEAD ZEND_TRY_ASSIGN_LONG(wouldblock, 0); -======= - zval_ptr_dtor(wouldblock); - ZVAL_LONG(wouldblock, 0); ->>>>>>> master } /* flock_values contains all possible actions if (operation & 4) we won't block on the lock */ diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index b7e5f1299a770..4f02f0ebf1eed 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -1,4 +1,4 @@ -/* Generated by re2c 0.14.3 */ +/* Generated by re2c 1.0.1 */ #line 1 "ext/standard/var_unserializer.re" /* +----------------------------------------------------------------------+ @@ -241,15 +241,11 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) var_dtor_hash = next; } -<<<<<<< HEAD - zval_ptr_dtor(&wakeup_name); + zval_ptr_dtor_nogc(&wakeup_name); if ((*var_hashx)->refs) { zend_array_destroy((*var_hashx)->refs); } -======= - zval_ptr_dtor_nogc(&wakeup_name); ->>>>>>> master } /* }}} */ @@ -548,7 +544,6 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab return 0; } -<<<<<<< HEAD if (UNEXPECTED(info)) { data = zend_verify_property_type(info, data, &tmp, 1); if (UNEXPECTED(!data)) { @@ -558,21 +553,8 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab ZVAL_COPY(old_data, data); } - if (UNEXPECTED(Z_ISUNDEF_P(data))) { - if (Z_TYPE(key) == IS_LONG) { - zend_hash_index_del(ht, Z_LVAL(key)); - } else { - zend_hash_del_ind(ht, Z_STR(key)); - } - } else { - var_push_dtor(var_hash, data); - } - - zval_dtor(&key); -======= var_push_dtor(var_hash, data); zval_ptr_dtor(&key); ->>>>>>> master if (elements && *(*p-1) != ';' && *(*p-1) != '}') { (*p)--; @@ -659,17 +641,12 @@ static inline int object_common2(UNSERIALIZE_PARAMETER, zend_long elements) && zend_hash_str_exists(&Z_OBJCE_P(rval)->function_table, "__wakeup", sizeof("__wakeup")-1); ht = Z_OBJPROP_P(rval); -<<<<<<< HEAD - zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, (ht->u.flags & HASH_FLAG_PACKED)); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { -======= if (elements >= (zend_long)(HT_MAX_SIZE - zend_hash_num_elements(ht))) { return 0; } zend_hash_extend(ht, zend_hash_num_elements(ht) + elements, HT_FLAGS(ht) & HASH_FLAG_PACKED); - if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, 1)) { ->>>>>>> master + if (!process_nested_data(UNSERIALIZE_PASSTHRU, ht, elements, Z_OBJCE_P(rval))) { if (has_wakeup) { ZVAL_DEREF(rval); GC_ADD_FLAGS(Z_OBJ_P(rval), IS_OBJ_DESTRUCTOR_CALLED); @@ -737,11 +714,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) start = cursor; -<<<<<<< HEAD -#line 668 "ext/standard/var_unserializer.c" -======= -#line 672 "ext/standard/var_unserializer.c" ->>>>>>> master +#line 718 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -778,127 +751,100 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, }; - if ((YYLIMIT - YYCURSOR) < 7) YYFILL(7); yych = *YYCURSOR; switch (yych) { case 'C': - case 'O': goto yy13; + case 'O': goto yy4; case 'N': goto yy5; - case 'R': goto yy2; - case 'S': goto yy10; - case 'a': goto yy11; - case 'b': goto yy6; - case 'd': goto yy8; - case 'i': goto yy7; + case 'R': goto yy6; + case 'S': goto yy7; + case 'a': goto yy8; + case 'b': goto yy9; + case 'd': goto yy10; + case 'i': goto yy11; case 'o': goto yy12; - case 'r': goto yy4; - case 's': goto yy9; - case '}': goto yy14; - default: goto yy16; + case 'r': goto yy13; + case 's': goto yy14; + case '}': goto yy15; + default: goto yy2; } yy2: - yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy95; + ++YYCURSOR; yy3: -<<<<<<< HEAD -#line 1045 "ext/standard/var_unserializer.re" - { return 0; } -#line 730 "ext/standard/var_unserializer.c" -======= -#line 1071 "ext/standard/var_unserializer.re" +#line 1117 "ext/standard/var_unserializer.re" { return 0; } -#line 732 "ext/standard/var_unserializer.c" ->>>>>>> master +#line 778 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy89; + if (yych == ':') goto yy17; goto yy3; yy5: yych = *++YYCURSOR; - if (yych == ';') goto yy87; + if (yych == ';') goto yy19; goto yy3; yy6: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy83; + if (yych == ':') goto yy21; goto yy3; yy7: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy77; + if (yych == ':') goto yy22; goto yy3; yy8: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy53; + if (yych == ':') goto yy23; goto yy3; yy9: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy46; + if (yych == ':') goto yy24; goto yy3; yy10: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy39; + if (yych == ':') goto yy25; goto yy3; yy11: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy32; + if (yych == ':') goto yy26; goto yy3; yy12: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy25; + if (yych == ':') goto yy27; goto yy3; yy13: yych = *(YYMARKER = ++YYCURSOR); - if (yych == ':') goto yy17; + if (yych == ':') goto yy28; goto yy3; yy14: + yych = *(YYMARKER = ++YYCURSOR); + if (yych == ':') goto yy29; + goto yy3; +yy15: ++YYCURSOR; -<<<<<<< HEAD -#line 1039 "ext/standard/var_unserializer.re" -======= -#line 1065 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 1111 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -<<<<<<< HEAD -#line 779 "ext/standard/var_unserializer.c" -yy16: - yych = *++YYCURSOR; - goto yy3; -yy17: - yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } - if (yych == '+') goto yy19; -======= -#line 785 "ext/standard/var_unserializer.c" +#line 831 "ext/standard/var_unserializer.c" yy17: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { goto yy30; } ->>>>>>> master yy18: YYCURSOR = YYMARKER; goto yy3; yy19: -<<<<<<< HEAD - yych = *++YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } -======= ++YYCURSOR; -#line 726 "ext/standard/var_unserializer.re" +#line 772 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 802 "ext/standard/var_unserializer.c" +#line 848 "ext/standard/var_unserializer.c" yy21: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -913,155 +859,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych <= '9') goto yy36; ->>>>>>> master goto yy18; -yy20: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if (yybm[0+yych] & 128) { - goto yy20; - } - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych >= ';') goto yy18; +yy24: yych = *++YYCURSOR; - if (yych != '"') goto yy18; - ++YYCURSOR; -#line 887 "ext/standard/var_unserializer.re" - { - size_t len, len2, len3, maxlen; - zend_long elements; - char *str; - zend_string *class_name; - zend_class_entry *ce; - int incomplete_class = 0; - - int custom_object = 0; - - zval user_func; - zval retval; - zval args[1]; - - if (!var_hash) return 0; - if (*start == 'C') { - custom_object = 1; - } - - len2 = len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len || len == 0) { - *p = start + 2; - return 0; - } - - str = (char*)YYCURSOR; - - YYCURSOR += len; - - if (*(YYCURSOR) != '"') { - *p = YYCURSOR; - return 0; - } - if (*(YYCURSOR+1) != ':') { - *p = YYCURSOR+1; - return 0; - } - - len3 = strspn(str, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\"); - if (len3 != len) - { - *p = YYCURSOR + len3 - len; - return 0; - } - - class_name = zend_string_init(str, len, 0); - - do { - if(!unserialize_allowed_class(class_name, var_hash)) { - incomplete_class = 1; - ce = PHP_IC_ENTRY; - break; - } - - /* Try to find class directly */ - BG(serialize_lock)++; - ce = zend_lookup_class(class_name); - if (ce) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release(class_name); - return 0; - } - break; - } - BG(serialize_lock)--; - - if (EG(exception)) { - zend_string_release(class_name); - return 0; - } - - /* Check for unserialize callback */ - if ((PG(unserialize_callback_func) == NULL) || (PG(unserialize_callback_func)[0] == '\0')) { - incomplete_class = 1; - ce = PHP_IC_ENTRY; - break; - } - - /* Call unserialize callback */ - ZVAL_STRING(&user_func, PG(unserialize_callback_func)); - - ZVAL_STR_COPY(&args[0], class_name); - BG(serialize_lock)++; - if (call_user_function_ex(CG(function_table), NULL, &user_func, &retval, 1, args, 0, NULL) != SUCCESS) { - BG(serialize_lock)--; - if (EG(exception)) { - zend_string_release(class_name); - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - return 0; - } - php_error_docref(NULL, E_WARNING, "defined (%s) but not found", Z_STRVAL(user_func)); - incomplete_class = 1; - ce = PHP_IC_ENTRY; - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - break; - } - BG(serialize_lock)--; - zval_ptr_dtor(&retval); - if (EG(exception)) { - zend_string_release(class_name); - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - return 0; - } - - /* The callback function may have defined the class */ - BG(serialize_lock)++; - if ((ce = zend_lookup_class(class_name)) == NULL) { - php_error_docref(NULL, E_WARNING, "Function %s() hasn't defined the class it was called for", Z_STRVAL(user_func)); - incomplete_class = 1; - ce = PHP_IC_ENTRY; - } - BG(serialize_lock)--; - - zval_ptr_dtor(&user_func); - zval_ptr_dtor(&args[0]); - break; - } while (1); - - *p = YYCURSOR; - - if (custom_object) { - int ret; - - ret = object_custom(UNSERIALIZE_PASSTHRU, ce); - - if (ret && incomplete_class) { - php_store_class_name(rval, ZSTR_VAL(class_name), len2); -======= + if (yych <= '/') goto yy18; if (yych <= '0') goto yy38; if (yych <= '1') goto yy39; goto yy18; @@ -1084,52 +885,8 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } else { if (yych == 'N') goto yy46; goto yy18; ->>>>>>> master } - zend_string_release(class_name); - return ret; - } -<<<<<<< HEAD - - elements = object_common1(UNSERIALIZE_PASSTHRU, ce); - - if (elements < 0) { - zend_string_release(class_name); - return 0; - } - - if (incomplete_class) { - php_store_class_name(rval, ZSTR_VAL(class_name), len2); } - zend_string_release(class_name); - - return object_common2(UNSERIALIZE_PASSTHRU, elements); -} -#line 962 "ext/standard/var_unserializer.c" -yy25: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy26; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy27; - goto yy18; - } -yy26: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy27: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy27; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; -======= yy26: yych = *++YYCURSOR; if (yych <= ',') { @@ -1167,74 +924,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych <= ':') goto yy56; goto yy18; yy32: ->>>>>>> master ++YYCURSOR; -#line 876 "ext/standard/var_unserializer.re" - { - long elements; - if (!var_hash) return 0; - - elements = object_common1(UNSERIALIZE_PASSTHRU, ZEND_STANDARD_CLASS_DEF_PTR); - if (elements < 0) { - return 0; - } - return object_common2(UNSERIALIZE_PASSTHRU, elements); -} -#line 998 "ext/standard/var_unserializer.c" -yy32: - yych = *++YYCURSOR; - if (yych == '+') goto yy33; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy34; - goto yy18; -yy33: - yych = *++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -======= if (yych <= '9') goto yy32; if (yych == ';') goto yy57; goto yy18; ->>>>>>> master yy34: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; if (yych <= '9') goto yy34; -<<<<<<< HEAD - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '{') goto yy18; - ++YYCURSOR; -#line 852 "ext/standard/var_unserializer.re" - { - zend_long elements = parse_iv(start + 2); - /* use iv() not uiv() in order to check data range */ - *p = YYCURSOR; - if (!var_hash) return 0; - - if (elements < 0) { - return 0; - } - - array_init_size(rval, elements); - if (elements) { - /* we can't convert from packed to hash during unserialization, because - reference to some zvals might be keept in var_hash (to support references) */ - zend_hash_real_init(Z_ARRVAL_P(rval), 0); - } - - if (!process_nested_data(UNSERIALIZE_PASSTHRU, Z_ARRVAL_P(rval), elements, 0)) { - return 0; - } - - return finish_nested_data(UNSERIALIZE_PASSTHRU); -} -#line 1043 "ext/standard/var_unserializer.c" -yy39: -======= if (yych <= ':') goto yy59; goto yy18; yy36: @@ -1305,20 +1007,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych == 'A') goto yy71; goto yy18; yy47: ->>>>>>> master - yych = *++YYCURSOR; - if (yych == '+') goto yy40; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy41; - goto yy18; -yy40: yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych >= ':') goto yy18; -yy41: -======= - if (yych >= ':') goto yy18; yy48: ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); @@ -1328,88 +1019,26 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (yych == ';') goto yy72; goto yy18; yy50: ->>>>>>> master ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy41; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; -======= if (yych <= '9') goto yy50; if (yych <= ':') goto yy74; goto yy18; yy52: ->>>>>>> master ++YYCURSOR; -#line 818 "ext/standard/var_unserializer.re" - { - size_t len, maxlen; - zend_string *str; - - len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len) { - *p = start + 2; - return 0; - } - - if ((str = unserialize_str(&YYCURSOR, len, maxlen)) == NULL) { - return 0; - } - - if (*(YYCURSOR) != '"') { - zend_string_free(str); - *p = YYCURSOR; - return 0; - } - - if (*(YYCURSOR + 1) != ';') { - efree(str); - *p = YYCURSOR + 1; - return 0; - } - - YYCURSOR += 2; - *p = YYCURSOR; - - ZVAL_STR(rval, str); - return 1; -} -#line 1098 "ext/standard/var_unserializer.c" -yy46: - yych = *++YYCURSOR; - if (yych == '+') goto yy47; - if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy48; - goto yy18; -yy47: - yych = *++YYCURSOR; + if (YYLIMIT <= YYCURSOR) YYFILL(1); + yych = *YYCURSOR; if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy48: -======= if (yych <= '9') goto yy52; if (yych == ';') goto yy75; goto yy18; yy54: ->>>>>>> master ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 2) YYFILL(2); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy48; - if (yych >= ';') goto yy18; - yych = *++YYCURSOR; - if (yych != '"') goto yy18; - ++YYCURSOR; -#line 786 "ext/standard/var_unserializer.re" -======= if (yych <= '9') goto yy54; if (yych <= ':') goto yy77; goto yy18; @@ -1419,33 +1048,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy57: ++YYCURSOR; -#line 676 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 722 "ext/standard/var_unserializer.re" { - size_t len, maxlen; - char *str; - -<<<<<<< HEAD - len = parse_uiv(start + 2); - maxlen = max - YYCURSOR; - if (maxlen < len) { - *p = start + 2; - return 0; - } - - str = (char*)YYCURSOR; - - YYCURSOR += len; + zend_long id; - if (*(YYCURSOR) != '"') { - *p = YYCURSOR; - return 0; - } + *p = YYCURSOR; + if (!var_hash) return 0; - if (*(YYCURSOR + 1) != ';') { - *p = YYCURSOR + 1; - return 0; -======= id = parse_uiv(start + 2) - 1; if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { return 0; @@ -1460,88 +1069,11 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } else { ZVAL_NEW_REF(rval_ref, rval_ref); ZVAL_COPY(rval, rval_ref); ->>>>>>> master } - YYCURSOR += 2; - *p = YYCURSOR; - - ZVAL_STRINGL(rval, str, len); return 1; } -<<<<<<< HEAD -#line 1151 "ext/standard/var_unserializer.c" -yy53: - yych = *++YYCURSOR; - if (yych <= '/') { - if (yych <= ',') { - if (yych == '+') goto yy57; - goto yy18; - } else { - if (yych <= '-') goto yy55; - if (yych <= '.') goto yy60; - goto yy18; - } - } else { - if (yych <= 'I') { - if (yych <= '9') goto yy58; - if (yych <= 'H') goto yy18; - goto yy56; - } else { - if (yych != 'N') goto yy18; - } - } - yych = *++YYCURSOR; - if (yych == 'A') goto yy76; - goto yy18; -yy55: - yych = *++YYCURSOR; - if (yych <= '/') { - if (yych == '.') goto yy60; - goto yy18; - } else { - if (yych <= '9') goto yy58; - if (yych != 'I') goto yy18; - } -yy56: - yych = *++YYCURSOR; - if (yych == 'N') goto yy72; - goto yy18; -yy57: - yych = *++YYCURSOR; - if (yych == '.') goto yy60; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy58: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - if (yych <= ':') { - if (yych <= '.') { - if (yych <= '-') goto yy18; - goto yy70; - } else { - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy58; - goto yy18; - } - } else { - if (yych <= 'E') { - if (yych <= ';') goto yy63; - if (yych <= 'D') goto yy18; - goto yy65; - } else { - if (yych == 'e') goto yy65; - goto yy18; - } - } -yy60: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy61: -======= -#line 1031 "ext/standard/var_unserializer.c" +#line 1077 "ext/standard/var_unserializer.c" yy59: yych = *++YYCURSOR; if (yych == '"') goto yy80; @@ -1552,49 +1084,33 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy61: ++YYCURSOR; -#line 732 "ext/standard/var_unserializer.re" +#line 778 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_FALSE(rval); return 1; } -#line 1048 "ext/standard/var_unserializer.c" +#line 1094 "ext/standard/var_unserializer.c" yy63: ->>>>>>> master ++YYCURSOR; -#line 738 "ext/standard/var_unserializer.re" +#line 784 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_TRUE(rval); return 1; } -#line 1057 "ext/standard/var_unserializer.c" +#line 1103 "ext/standard/var_unserializer.c" yy65: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); yych = *YYCURSOR; if (yych <= ';') { if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy61; -======= if (yych <= '9') goto yy65; ->>>>>>> master if (yych <= ':') goto yy18; } else { if (yych <= 'E') { if (yych <= 'D') goto yy18; -<<<<<<< HEAD - goto yy65; - } else { - if (yych == 'e') goto yy65; - goto yy18; - } - } -yy63: - ++YYCURSOR; -#line 777 "ext/standard/var_unserializer.re" -======= goto yy69; } else { if (yych == 'e') goto yy69; @@ -1603,8 +1119,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } yy67: ++YYCURSOR; -#line 786 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 832 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1613,56 +1128,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -<<<<<<< HEAD -#line 1248 "ext/standard/var_unserializer.c" -yy65: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy66; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - goto yy18; - } -yy66: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych == '+') goto yy69; - goto yy18; - } else { - if (yych <= '-') goto yy69; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; - } -yy67: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - if (yych == ';') goto yy63; - goto yy18; -yy69: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy67; - goto yy18; -yy70: - ++YYCURSOR; - if ((YYLIMIT - YYCURSOR) < 4) YYFILL(4); - yych = *YYCURSOR; - if (yych <= ';') { - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy70; - if (yych <= ':') goto yy18; - goto yy63; - } else { - if (yych <= 'E') { - if (yych <= 'D') goto yy18; - goto yy65; -======= -#line 1086 "ext/standard/var_unserializer.c" +#line 1132 "ext/standard/var_unserializer.c" yy69: yych = *++YYCURSOR; if (yych <= ',') { @@ -1684,7 +1150,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy72: ++YYCURSOR; -#line 744 "ext/standard/var_unserializer.re" +#line 790 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1701,46 +1167,23 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) { goto use_double; } ->>>>>>> master } else { - if (yych == 'e') goto yy65; - goto yy18; + goto use_double; } } -<<<<<<< HEAD -yy72: - yych = *++YYCURSOR; - if (yych != 'F') goto yy18; -yy73: - yych = *++YYCURSOR; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 761 "ext/standard/var_unserializer.re" - { - *p = YYCURSOR; - - if (!strncmp((char*)start + 2, "NAN", 3)) { - ZVAL_DOUBLE(rval, ZEND_NAN); - } else if (!strncmp((char*)start + 2, "INF", 3)) { - ZVAL_DOUBLE(rval, ZEND_INFINITY); - } else if (!strncmp((char*)start + 2, "-INF", 4)) { - ZVAL_DOUBLE(rval, -ZEND_INFINITY); - } else { - ZVAL_NULL(rval); -======= #endif *p = YYCURSOR; ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1134 "ext/standard/var_unserializer.c" +#line 1180 "ext/standard/var_unserializer.c" yy74: yych = *++YYCURSOR; if (yych == '"') goto yy88; goto yy18; yy75: ++YYCURSOR; -#line 701 "ext/standard/var_unserializer.re" +#line 747 "ext/standard/var_unserializer.re" { zend_long id; @@ -1759,87 +1202,66 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DEREF(rval_ref); if (Z_TYPE_P(rval_ref) != IS_OBJECT) { return 0; ->>>>>>> master } + ZVAL_COPY(rval, rval_ref); + return 1; } -<<<<<<< HEAD -#line 1323 "ext/standard/var_unserializer.c" -yy76: - yych = *++YYCURSOR; - if (yych == 'N') goto yy73; - goto yy18; -yy77: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy78; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy79; - goto yy18; - } -yy78: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy79: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy79; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 735 "ext/standard/var_unserializer.re" -======= -#line 1166 "ext/standard/var_unserializer.c" +#line 1212 "ext/standard/var_unserializer.c" yy77: yych = *++YYCURSOR; if (yych == '"') goto yy90; goto yy18; yy78: ++YYCURSOR; -#line 913 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 959 "ext/standard/var_unserializer.re" { -#if SIZEOF_ZEND_LONG == 4 - int digits = YYCURSOR - start - 3; + size_t len, len2, len3, maxlen; + zend_long elements; + char *str; + zend_string *class_name; + zend_class_entry *ce; + int incomplete_class = 0; - if (start[2] == '-' || start[2] == '+') { - digits--; + int custom_object = 0; + + zval user_func; + zval retval; + zval args[1]; + + if (!var_hash) return 0; + if (*start == 'C') { + custom_object = 1; } -<<<<<<< HEAD - /* Use double for large zend_long values that were serialized on a 64-bit system */ - if (digits >= MAX_LENGTH_OF_LONG - 1) { - if (digits == MAX_LENGTH_OF_LONG - 1) { - int cmp = strncmp((char*)YYCURSOR - MAX_LENGTH_OF_LONG, long_min_digits, MAX_LENGTH_OF_LONG - 1); + len2 = len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len || len == 0) { + *p = start + 2; + return 0; + } - if (!(cmp < 0 || (cmp == 0 && start[2] == '-'))) { - goto use_double; - } - } else { - goto use_double; - } + str = (char*)YYCURSOR; + + YYCURSOR += len; + + if (*(YYCURSOR) != '"') { + *p = YYCURSOR; + return 0; } -#endif - *p = YYCURSOR; - ZVAL_LONG(rval, parse_iv(start + 2)); - return 1; -} -#line 1376 "ext/standard/var_unserializer.c" -yy83: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= '2') goto yy18; - yych = *++YYCURSOR; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 729 "ext/standard/var_unserializer.re" + if (*(YYCURSOR+1) != ':') { + *p = YYCURSOR+1; + return 0; + } + + len3 = strspn(str, "0123456789_abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ\177\200\201\202\203\204\205\206\207\210\211\212\213\214\215\216\217\220\221\222\223\224\225\226\227\230\231\232\233\234\235\236\237\240\241\242\243\244\245\246\247\250\251\252\253\254\255\256\257\260\261\262\263\264\265\266\267\270\271\272\273\274\275\276\277\300\301\302\303\304\305\306\307\310\311\312\313\314\315\316\317\320\321\322\323\324\325\326\327\330\331\332\333\334\335\336\337\340\341\342\343\344\345\346\347\350\351\352\353\354\355\356\357\360\361\362\363\364\365\366\367\370\371\372\373\374\375\376\377\\"); + if (len3 != len) { -======= + *p = YYCURSOR + len3 - len; + return 0; + } + class_name = zend_string_init(str, len, 0); do { @@ -1945,10 +1367,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1325 "ext/standard/var_unserializer.c" +#line 1371 "ext/standard/var_unserializer.c" yy80: ++YYCURSOR; -#line 835 "ext/standard/var_unserializer.re" +#line 881 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -1977,45 +1399,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } YYCURSOR += 2; ->>>>>>> master *p = YYCURSOR; - ZVAL_BOOL(rval, parse_iv(start + 2)); + + ZVAL_STR(rval, str); return 1; } -<<<<<<< HEAD -#line 1390 "ext/standard/var_unserializer.c" -yy87: - ++YYCURSOR; -#line 723 "ext/standard/var_unserializer.re" -======= -#line 1362 "ext/standard/var_unserializer.c" +#line 1408 "ext/standard/var_unserializer.c" yy82: ++YYCURSOR; -#line 869 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 915 "ext/standard/var_unserializer.re" { + zend_long elements = parse_iv(start + 2); + /* use iv() not uiv() in order to check data range */ *p = YYCURSOR; -<<<<<<< HEAD - ZVAL_NULL(rval); - return 1; -} -#line 1399 "ext/standard/var_unserializer.c" -yy89: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy90; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy91; - goto yy18; - } -yy90: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy91: -======= if (!var_hash) return 0; if (elements < 0 || elements >= HT_MAX_SIZE) { @@ -2044,28 +1440,16 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 1398 "ext/standard/var_unserializer.c" +#line 1444 "ext/standard/var_unserializer.c" yy84: yych = *++YYCURSOR; if (yych <= '/') goto yy18; if (yych >= ':') goto yy18; yy85: ->>>>>>> master ++YYCURSOR; if (YYLIMIT <= YYCURSOR) YYFILL(1); yych = *YYCURSOR; if (yych <= '/') goto yy18; -<<<<<<< HEAD - if (yych <= '9') goto yy91; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 698 "ext/standard/var_unserializer.re" - { - zend_long id; - - *p = YYCURSOR; - if (!var_hash) return 0; -======= if (yych <= '9') goto yy85; if (yych == ';') goto yy67; goto yy18; @@ -2075,7 +1459,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy88: ++YYCURSOR; -#line 902 "ext/standard/var_unserializer.re" +#line 948 "ext/standard/var_unserializer.re" { zend_long elements; if (!var_hash) return 0; @@ -2086,59 +1470,38 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1428 "ext/standard/var_unserializer.c" +#line 1474 "ext/standard/var_unserializer.c" yy90: ++YYCURSOR; -#line 795 "ext/standard/var_unserializer.re" +#line 841 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; ->>>>>>> master - id = parse_iv(start + 2) - 1; - if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { + len = parse_uiv(start + 2); + maxlen = max - YYCURSOR; + if (maxlen < len) { + *p = start + 2; return 0; } - if (rval_ref == rval) { + str = (char*)YYCURSOR; + + YYCURSOR += len; + + if (*(YYCURSOR) != '"') { + *p = YYCURSOR; return 0; } - if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) { - ZVAL_UNDEF(rval); - return 1; + if (*(YYCURSOR + 1) != ';') { + *p = YYCURSOR + 1; + return 0; } - ZVAL_COPY(rval, rval_ref); + YYCURSOR += 2; + *p = YYCURSOR; -<<<<<<< HEAD - return 1; -} -#line 1447 "ext/standard/var_unserializer.c" -yy95: - yych = *++YYCURSOR; - if (yych <= ',') { - if (yych != '+') goto yy18; - } else { - if (yych <= '-') goto yy96; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy97; - goto yy18; - } -yy96: - yych = *++YYCURSOR; - if (yych <= '/') goto yy18; - if (yych >= ':') goto yy18; -yy97: - ++YYCURSOR; - if (YYLIMIT <= YYCURSOR) YYFILL(1); - yych = *YYCURSOR; - if (yych <= '/') goto yy18; - if (yych <= '9') goto yy97; - if (yych != ';') goto yy18; - ++YYCURSOR; -#line 672 "ext/standard/var_unserializer.re" -======= if (len == 0) { ZVAL_EMPTY_STRING(rval); } else if (len == 1) { @@ -2150,45 +1513,28 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return 1; } -#line 1471 "ext/standard/var_unserializer.c" +#line 1517 "ext/standard/var_unserializer.c" yy92: ++YYCURSOR; -#line 770 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 816 "ext/standard/var_unserializer.re" { - zend_long id; - - *p = YYCURSOR; - if (!var_hash) return 0; - - id = parse_iv(start + 2) - 1; - if (id == -1 || (rval_ref = var_access(var_hash, id)) == NULL) { - return 0; - } + *p = YYCURSOR; - zval_ptr_dtor(rval); - if (Z_ISUNDEF_P(rval_ref) || (Z_ISREF_P(rval_ref) && Z_ISUNDEF_P(Z_REFVAL_P(rval_ref)))) { - ZVAL_UNDEF(rval); - return 1; - } - if (Z_ISREF_P(rval_ref)) { - ZVAL_COPY(rval, rval_ref); + if (!strncmp((char*)start + 2, "NAN", 3)) { + ZVAL_DOUBLE(rval, ZEND_NAN); + } else if (!strncmp((char*)start + 2, "INF", 3)) { + ZVAL_DOUBLE(rval, ZEND_INFINITY); + } else if (!strncmp((char*)start + 2, "-INF", 4)) { + ZVAL_DOUBLE(rval, -ZEND_INFINITY); } else { - ZVAL_NEW_REF(rval_ref, rval_ref); - ZVAL_COPY(rval, rval_ref); + ZVAL_NULL(rval); } return 1; } -<<<<<<< HEAD -#line 1496 "ext/standard/var_unserializer.c" -} -#line 1047 "ext/standard/var_unserializer.re" -======= -#line 1490 "ext/standard/var_unserializer.c" +#line 1536 "ext/standard/var_unserializer.c" } -#line 1073 "ext/standard/var_unserializer.re" ->>>>>>> master +#line 1119 "ext/standard/var_unserializer.re" return 0; From f42495d9ba81fa8516be6afaa28e8bba8ef88a00 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 7 Jun 2018 00:57:20 +0200 Subject: [PATCH 226/369] Initial ref type in MAKE_REF_EX --- Zend/zend_types.h | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 62bee89b39630..5d1abceb45f02 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -895,6 +895,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, (refcount)); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, _z); \ + _ref->type = 0; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ } while (0) From ed00f11ad5c6d6e83c1fb2b4286208427bd80026 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 7 Jun 2018 12:35:56 +0200 Subject: [PATCH 227/369] Solve the clashing FETCH_REF|CACHE_SLOT --- Zend/zend_execute.c | 5 +- Zend/zend_vm_def.h | 8 ++- Zend/zend_vm_execute.h | 114 ++++++++++++++++------------------------- 3 files changed, 50 insertions(+), 77 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 75cd475319f05..75bf319868001 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2476,12 +2476,11 @@ static zend_never_inline int ZEND_FASTCALL zend_isempty_dim_slow(zval *container } } -/* TODO(typed_refs) Can we use OPLINE_DC instead of passing by_ref? */ static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t by_ref OPLINE_DC) { zval *ptr; - if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { + if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { do { if (Z_ISREF_P(container)) { container = Z_REFVAL_P(container); @@ -2508,7 +2507,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if ((by_ref & ZEND_FETCH_REF) + if (by_ref && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && Z_TYPE_P(ptr) != IS_REFERENCE) { zend_property_info *prop_info; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9114a9689c06a..cae7330582760 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2126,7 +2126,6 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) { USE_OPLINE @@ -2142,7 +2141,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2267,7 +2266,6 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ ZEND_VM_COLD_CONST_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -2687,7 +2685,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -2706,7 +2704,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S } else { variable_ptr = Z_INDIRECT(variable); - if ((OP2_TYPE == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (OP2_TYPE == IS_CONST) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 448b24afa3002..901009b7b37ad 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4810,7 +4810,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -4905,7 +4904,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -6897,7 +6895,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -6993,7 +6990,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -9968,7 +9964,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -10063,7 +10058,6 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -13626,7 +13620,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -13721,7 +13714,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CONST ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15213,7 +15205,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -15309,7 +15300,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_TMPVA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17076,7 +17066,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -17171,7 +17160,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_TMPVAR_CV_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -22826,7 +22814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -23924,7 +23912,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -23943,7 +23931,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -24050,7 +24038,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -24069,7 +24057,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -25621,7 +25609,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -26664,7 +26652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -26683,7 +26671,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -26790,7 +26778,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -26809,7 +26797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29871,7 +29859,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -31018,7 +31006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -31037,7 +31025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -31144,7 +31132,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -31163,7 +31151,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -32587,7 +32575,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -32603,7 +32590,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32727,7 +32714,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CONST ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -33367,7 +33353,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -33386,7 +33372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -33492,7 +33478,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -33511,7 +33497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -34805,7 +34791,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -34821,7 +34806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -34946,7 +34931,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_TMPVA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -35586,7 +35570,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -35605,7 +35589,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -35711,7 +35695,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -35730,7 +35714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -37650,7 +37634,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -37666,7 +37649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -37790,7 +37773,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_UNUSED_CV_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -38430,7 +38412,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -38449,7 +38431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -38555,7 +38537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -38574,7 +38556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -42753,7 +42735,6 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -42769,7 +42750,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -42893,7 +42874,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CONST_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -43962,7 +43942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -43981,7 +43961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -44087,7 +44067,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -44106,7 +44086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CONST == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CONST == IS_CONST) { @@ -47000,7 +46980,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -47016,7 +46995,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -47141,7 +47120,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_TMPVAR_HA ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -48155,7 +48133,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -48174,7 +48152,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -48280,7 +48258,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -48299,7 +48277,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -53057,7 +53035,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF + CACHE_SLOT collision */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -53073,7 +53050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL), BP_VAR_W, opline->extended_value OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -53197,7 +53174,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_IS_SPEC_CV_CV_HANDLE ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -/* TODO(typed_refs) FETCH_REF collision. Maybe also missing flag on forwarding */ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_FUNC_ARG_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { if (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) { @@ -54314,7 +54290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -54333,7 +54309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { @@ -54439,7 +54415,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; - zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0); + zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && UNEXPECTED(!Z_ISERROR(variable))) { @@ -54458,7 +54434,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { variable_ptr = Z_INDIRECT(variable); - if ((IS_CV == IS_CONST) ? EXPECTED(ZEND_DYNAMIC_PROPERTY_OFFSET != (uint32_t)(intptr_t) CACHED_PTR_EX(cache_addr + 1)) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; if (IS_CV == IS_CONST) { From 6709fbb5114ba806e6dca72579c515010edb9fda Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 7 Jun 2018 20:05:41 +0200 Subject: [PATCH 228/369] Fix few tests --- .../typed_properties_004.phpt | 2 +- .../typed_properties_006.phpt | 2 +- .../typed_properties_008.phpt | 2 +- .../typed_properties_013.phpt | 2 +- .../typed_properties_019.phpt | 2 +- .../typed_properties_029.phpt | 2 +- .../typed_properties_030.phpt | 2 +- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 4 ++-- .../typed_properties_037.phpt | 2 +- .../typed_properties_038.phpt | 8 +++---- .../typed_properties_039.phpt | 2 +- .../typed_properties_040.phpt | 2 +- .../typed_properties_044.phpt | 4 ++-- .../typed_properties_045.phpt | 2 +- .../typed_properties_046.phpt | 12 +++++----- .../typed_properties_047.phpt | 2 +- .../typed_properties_048.phpt | 2 +- .../typed_properties_049.phpt | 2 +- .../typed_properties_055.phpt | 2 +- .../typed_properties_056.phpt | 2 +- .../typed_properties_057.phpt | 4 ++-- .../typed_properties_058.phpt | 4 ++-- .../typed_properties_059.phpt | 4 ++-- .../typed_properties_060.phpt | 2 +- .../typed_properties_061.phpt | 6 ++--- .../typed_properties_062.phpt | 8 +++---- .../typed_properties_063.phpt | 8 +++---- .../typed_properties_064.phpt | 8 +++---- .../typed_properties_065.phpt | 6 ++--- Zend/zend_compile.c | 3 +-- Zend/zend_compile.h | 3 +-- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 24 +++++++++---------- 34 files changed, 71 insertions(+), 73 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_004.phpt b/Zend/tests/type_declarations/typed_properties_004.phpt index 1d9e6400e00fd..bb0314583bc78 100644 --- a/Zend/tests/type_declarations/typed_properties_004.phpt +++ b/Zend/tests/type_declarations/typed_properties_004.phpt @@ -11,7 +11,7 @@ new class("PHP 7 is better than you, and it knows it ...") { }; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be integer, string used in %s:6 +Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must be int, string used in %s:6 Stack trace: #0 %s(2): class@anonymous->__construct('PHP 7 is better...') #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_006.phpt b/Zend/tests/type_declarations/typed_properties_006.phpt index 2e775395c43e7..3b0165ac55730 100644 --- a/Zend/tests/type_declarations/typed_properties_006.phpt +++ b/Zend/tests/type_declarations/typed_properties_006.phpt @@ -11,5 +11,5 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be integer (as in class Foo) in %s on line 8 +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_008.phpt b/Zend/tests/type_declarations/typed_properties_008.phpt index 0efff906fa836..b8c37c7147465 100644 --- a/Zend/tests/type_declarations/typed_properties_008.phpt +++ b/Zend/tests/type_declarations/typed_properties_008.phpt @@ -11,6 +11,6 @@ class Bar extends Foo { } ?> --EXPECTF-- -Fatal error: Type of Bar::$qux must be integer (as in class Foo) in %s on line 8 +Fatal error: Type of Bar::$qux must be int (as in class Foo) in %s on line 8 diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index 177200ada7e39..e6b4751f3a46a 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,7 +7,7 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with integer type can only be integer in %s on line 3 +Fatal error: Default value for properties with int type can only be int in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_019.phpt b/Zend/tests/type_declarations/typed_properties_019.phpt index e9149e1c1c79f..0a11b98989dae 100644 --- a/Zend/tests/type_declarations/typed_properties_019.phpt +++ b/Zend/tests/type_declarations/typed_properties_019.phpt @@ -15,7 +15,7 @@ $foo = new Foo(); var_dump($foo->inc()); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, float used in %s:6 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, float used in %s:6 Stack trace: #0 %s(12): Foo->inc() #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_029.phpt b/Zend/tests/type_declarations/typed_properties_029.phpt index 9e27d74d97bd6..a5418c91a85c9 100644 --- a/Zend/tests/type_declarations/typed_properties_029.phpt +++ b/Zend/tests/type_declarations/typed_properties_029.phpt @@ -12,7 +12,7 @@ $foo = new Foo; $foo->bar = "1"; ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:9 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:9 Stack trace: #0 {main} thrown in %s on line 9 diff --git a/Zend/tests/type_declarations/typed_properties_030.phpt b/Zend/tests/type_declarations/typed_properties_030.phpt index 2749948a6839b..a835ae5fae790 100644 --- a/Zend/tests/type_declarations/typed_properties_030.phpt +++ b/Zend/tests/type_declarations/typed_properties_030.phpt @@ -19,7 +19,7 @@ unset($foo->bar); # ok var_dump($foo->bar); # not okay, __get is nasty ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, string used in %s:16 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, string used in %s:16 Stack trace: #0 {main} thrown in %s on line 16 diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index d40df54b1e378..7ab7afec8ec23 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference of type integer +Cannot assign float to reference of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index 99f9e3b592063..e6cb2ad271d65 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -38,11 +38,11 @@ var_dump($foo); ?> --EXPECTF-- int(42) -Cannot assign null to reference of type integer +Cannot assign null to reference of type int int(1) int(10) int(10) -Cannot assign null to reference of type integer +Cannot assign null to reference of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt index 8bdd6748b2e96..ed0869af30aa4 100644 --- a/Zend/tests/type_declarations/typed_properties_037.phpt +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -12,6 +12,6 @@ object(class@anonymous)#%d (%d) { ["bar"]=> int(10) ["qux"]=> - uninitialized(integer) + uninitialized(int) } diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index d25d2fc1a9061..49e0fa93af7ea 100644 --- a/Zend/tests/type_declarations/typed_properties_038.phpt +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -39,22 +39,22 @@ try { var_dump($foo); --EXPECTF-- -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) } -string(64) "Typed property class@anonymous::$bar must be integer, float used" +string(60) "Typed property class@anonymous::$bar must be int, float used" object(class@anonymous)#%d (%d) { ["bar"]=> int(%d) diff --git a/Zend/tests/type_declarations/typed_properties_039.phpt b/Zend/tests/type_declarations/typed_properties_039.phpt index 2b2513bd925b8..62413d804c19c 100644 --- a/Zend/tests/type_declarations/typed_properties_039.phpt +++ b/Zend/tests/type_declarations/typed_properties_039.phpt @@ -25,7 +25,7 @@ var_dump($objs); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property A::$foo must be integer, A used in %s:%d +Fatal error: Uncaught TypeError: Typed property A::$foo must be int, A used in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_040.phpt b/Zend/tests/type_declarations/typed_properties_040.phpt index 075fbb1eacfa5..e2927eea86828 100644 --- a/Zend/tests/type_declarations/typed_properties_040.phpt +++ b/Zend/tests/type_declarations/typed_properties_040.phpt @@ -19,7 +19,7 @@ var_dump($foo->bar); --EXPECTF-- string(3) "bar" -Fatal error: Uncaught TypeError: Typed property Foo::$bar must be integer, null used in %s:14 +Fatal error: Uncaught TypeError: Typed property Foo::$bar must be int, null used in %s:14 Stack trace: #0 {main} thrown in %s on line 14 diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 490c6ff85913f..2fe689d95f077 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference of type ?integer -Cannot assign float to reference of type ?integer +Cannot assign float to reference of type ?int +Cannot assign float to reference of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index a70eaf198ae85..830bbb121cb28 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference of type integer +Cannot assign array to reference of type int float(0.5) float(20) Cannot assign array to reference of type float diff --git a/Zend/tests/type_declarations/typed_properties_046.phpt b/Zend/tests/type_declarations/typed_properties_046.phpt index 8c160a98e75b9..050e64a2a4ed4 100644 --- a/Zend/tests/type_declarations/typed_properties_046.phpt +++ b/Zend/tests/type_declarations/typed_properties_046.phpt @@ -1,5 +1,5 @@ --TEST-- -Memory leaks on wrong assignment to typed roperty +Memory leaks on wrong assignment to typed property --FILE-- --EXPECTF-- -Fatal error: Default value for properties with integer type can only be integer in %styped_properties_049.php on line 3 +Fatal error: Default value for properties with int type can only be int in %styped_properties_049.php on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index 24ad1f6f91452..fd4921e07892d 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -22,7 +22,7 @@ $f($o->a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference of type integer in %s:%d +Fatal error: Uncaught TypeError: Cannot assign string to reference of type int in %s:%d Stack trace: #0 %s(%d): {closure}(2) #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_056.phpt b/Zend/tests/type_declarations/typed_properties_056.phpt index 4fc7b014b2a93..54013f44f2295 100644 --- a/Zend/tests/type_declarations/typed_properties_056.phpt +++ b/Zend/tests/type_declarations/typed_properties_056.phpt @@ -19,5 +19,5 @@ var_dump($o->foo); unset($o); ?> --EXPECT-- -Typed property A::$foo must be string, integer used +Typed property A::$foo must be string, int used string(3) "100" diff --git a/Zend/tests/type_declarations/typed_properties_057.phpt b/Zend/tests/type_declarations/typed_properties_057.phpt index fefe8d0738d74..6b53a42600a67 100644 --- a/Zend/tests/type_declarations/typed_properties_057.phpt +++ b/Zend/tests/type_declarations/typed_properties_057.phpt @@ -25,7 +25,7 @@ var_dump($o->foo); unset($o); ?> --EXPECT-- -Typed property A::$foo must be string, integer used +Typed property A::$foo must be string, int used string(3) "100" -Typed property A::$foo must be string, integer used +Typed property A::$foo must be string, int used string(3) "100" diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 2be5aa7aba8df..007fbd3d0b5d1 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -32,6 +32,6 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) -Typed property B::$foo must be string, integer used -Typed property B::$foo must be string, integer used +Typed property B::$foo must be string, int used +Typed property B::$foo must be string, int used diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt index e0c6d4d5ad271..f54b3df278e19 100644 --- a/Zend/tests/type_declarations/typed_properties_059.phpt +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -19,11 +19,11 @@ var_dump($x); --EXPECT-- object(A)#1 (2) { ["a2"]=> - uninitialized(integer) + uninitialized(int) ["b2"]=> NULL ["a1"]=> - uninitialized(integer) + uninitialized(int) ["b1"]=> NULL } diff --git a/Zend/tests/type_declarations/typed_properties_060.phpt b/Zend/tests/type_declarations/typed_properties_060.phpt index b1d16bd3c6bec..03087a017d665 100644 --- a/Zend/tests/type_declarations/typed_properties_060.phpt +++ b/Zend/tests/type_declarations/typed_properties_060.phpt @@ -16,7 +16,7 @@ $o->a = "a"; --EXPECTF-- int(1) -Fatal error: Uncaught TypeError: Typed property A::$a must be integer, string used in %s:%d +Fatal error: Uncaught TypeError: Typed property A::$a must be int, string used in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index d3219d25b86eb..2b9e8b38f42bd 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -48,11 +48,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index 95d22f4ae7c0b..2f36daba93e7e 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index 10e926e78eafc..abfde99d5b333 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 40df2e0392d2d..08bc33a22febb 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign array to reference of type integer +Cannot assign array to reference of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index 4c0285ee8a367..0ca8fecba7c16 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -45,11 +45,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type integer +Cannot assign string to reference of type int int(21) int(20) int(19) -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer -Cannot assign float to reference of type integer +Cannot assign float to reference of type int integer diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3ae0bc0aa5026..439cc99cc4e9f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2708,8 +2708,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i { uint32_t offset = zend_delayed_compile_begin(); zend_op *opline = zend_delayed_compile_prop(result, ast, type); - if (by_ref) { - /* TODO(typed_props) extended_value is now used for the cache slot */ + if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ opline->extended_value |= ZEND_FETCH_REF; } return zend_delayed_compile_end(offset); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f2c6cd6f8f2c6..610a76d17d9df 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -876,8 +876,7 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe -/* TODO(typed_refs) Is this still free? */ -#define ZEND_FETCH_REF 0x00400000 +#define ZEND_FETCH_REF (1<<0) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cae7330582760..d5a378f617772 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2066,7 +2066,7 @@ ZEND_VM_HOT_OBJ_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMPVAR|UNUSED|THIS|CV, CONST zval *retval; if (OP2_TYPE == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 901009b7b37ad..609da2eebb420 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4751,7 +4751,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -6835,7 +6835,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -9905,7 +9905,7 @@ static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_ zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -13561,7 +13561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CONST_ zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -15145,7 +15145,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_TMPVAR zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -17007,7 +17007,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_TMPVAR_CV_HAN zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -32516,7 +32516,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_U zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -34731,7 +34731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_TMPVAR zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -37575,7 +37575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_UNUSED_CV_HAN zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -42676,7 +42676,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_C zval *retval; if (IS_CONST == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -46920,7 +46920,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_TMPVAR_HAN zval *retval; if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); @@ -52976,7 +52976,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_R_SPEC_CV_CV_HANDLER zval *retval; if (IS_CV == IS_CONST) { - cache_slot = CACHE_ADDR(opline->extended_value); + cache_slot = CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF /* FUNC_ARG fetch may contain it */); if (EXPECTED(zobj->ce == CACHED_PTR_EX(cache_slot))) { uintptr_t prop_offset = (uintptr_t)CACHED_PTR_EX(cache_slot + 1); From f55663f47d80510015c881a04a1df9792ad55af5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 10:11:09 +0200 Subject: [PATCH 229/369] Fix cache_slot of ASSIGN_OBJ_REF --- Zend/zend_compile.c | 3 +- Zend/zend_compile.h | 4 +- Zend/zend_vm_def.h | 6 +-- Zend/zend_vm_execute.h | 72 +++++++++++++++---------------- Zend/zend_vm_opcodes.c | 2 +- ext/opcache/Optimizer/zend_dump.c | 2 +- 6 files changed, 45 insertions(+), 44 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 439cc99cc4e9f..64977a4e4b42c 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3091,10 +3091,11 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_make_var_result(result, opline); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline->extended_value = 0; } if (zend_is_call(source_ast)) { - opline->extended_value = ZEND_RETURNS_FUNCTION; + opline->extended_value |= ZEND_RETURNS_FUNCTION; } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 610a76d17d9df..3ed021ed88f87 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -945,8 +945,8 @@ static zend_always_inline int zend_check_arg_send_type(const zend_function *zf, #define ZEND_RETURN_REF 1 -#define ZEND_RETURNS_FUNCTION 1<<0 -#define ZEND_RETURNS_VALUE 1<<1 +#define ZEND_RETURNS_FUNCTION (1<<0) +#define ZEND_RETURNS_VALUE (1<<1) #define ZEND_ARRAY_ELEMENT_REF (1<<0) #define ZEND_ARRAY_NOT_PACKED (1<<1) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d5a378f617772..655873f724631 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2646,7 +2646,7 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV, SRC) ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SRC, SPEC(OP_DATA=VAR|CV)) +ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) { USE_OPLINE zend_free_op free_op1, free_op2, free_op_data; @@ -2660,7 +2660,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S SAVE_OPLINE(); if (OP_DATA_TYPE == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -2683,7 +2683,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, S HANDLE_EXCEPTION(); } - cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 609da2eebb420..fd839ae3ab71d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23887,7 +23887,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -23910,7 +23910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -24013,7 +24013,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -24036,7 +24036,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26627,7 +26627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -26650,7 +26650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26753,7 +26753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -26776,7 +26776,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -30981,7 +30981,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -31004,7 +31004,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -31107,7 +31107,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -31130,7 +31130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33328,7 +33328,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -33351,7 +33351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33453,7 +33453,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -33476,7 +33476,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35545,7 +35545,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -35568,7 +35568,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35670,7 +35670,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -35693,7 +35693,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38387,7 +38387,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -38410,7 +38410,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38512,7 +38512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -38535,7 +38535,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -43917,7 +43917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -43940,7 +43940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -44042,7 +44042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -44065,7 +44065,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } - cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48108,7 +48108,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -48131,7 +48131,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48233,7 +48233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -48256,7 +48256,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } - cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54265,7 +54265,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); if (IS_VAR == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -54288,7 +54288,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54390,7 +54390,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); if (IS_CV == IS_VAR - && opline->extended_value == ZEND_RETURNS_FUNCTION + && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { zend_error(E_NOTICE, "Only variables should be assigned by reference"); if (UNEXPECTED(EG(exception) != NULL)) { @@ -54413,7 +54413,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } - cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL; + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 8d72fbb26eec6..bb62e817e5f84 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -425,7 +425,7 @@ static uint32_t zend_vm_opcodes_flags[200] = { 0x00000101, 0x00020101, 0x00000701, - 0x0b000751, + 0x0b040751, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/ext/opcache/Optimizer/zend_dump.c b/ext/opcache/Optimizer/zend_dump.c index a4c324c5b1f4b..caf672e686272 100644 --- a/ext/opcache/Optimizer/zend_dump.c +++ b/ext/opcache/Optimizer/zend_dump.c @@ -554,7 +554,7 @@ static void zend_dump_op(const zend_op_array *op_array, const zend_basic_block * } else if (ZEND_VM_EXT_SRC == (flags & ZEND_VM_EXT_MASK)) { if (opline->extended_value == ZEND_RETURNS_VALUE) { fprintf(stderr, " (value)"); - } else if (opline->extended_value == ZEND_RETURNS_FUNCTION) { + } else if (opline->extended_value & ZEND_RETURNS_FUNCTION) { fprintf(stderr, " (function)"); } } else { From 6d0c4437ccb8aac4318e5403a73f160309800b43 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:10:08 +0200 Subject: [PATCH 230/369] Opcache fixes --- ext/opcache/Optimizer/compact_literals.c | 7 +- ext/opcache/Optimizer/dce.c | 1 + ext/opcache/Optimizer/escape_analysis.c | 6 +- ext/opcache/Optimizer/sccp.c | 1 + ext/opcache/Optimizer/zend_dfg.c | 1 + ext/opcache/Optimizer/zend_inference.c | 101 ++++++++++++++++++----- ext/opcache/Optimizer/zend_ssa.c | 1 + 7 files changed, 93 insertions(+), 25 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index e98a2e75c0983..2dbbd230c2a45 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -507,6 +507,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx } break; case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_FETCH_OBJ_R: case ZEND_FETCH_OBJ_W: case ZEND_FETCH_OBJ_RW: @@ -522,12 +523,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant]; + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_REF); } else { - opline->extended_value = cache_size; + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_REF); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value; + property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_REF; } } } diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 4a35c9e5d3ecc..6133fd084bde0 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -326,6 +326,7 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z switch (def_opline->opcode) { case ZEND_ASSIGN: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: case ZEND_ASSIGN_ADD: diff --git a/ext/opcache/Optimizer/escape_analysis.c b/ext/opcache/Optimizer/escape_analysis.c index 66866e8b24b64..ebae51f7dbb12 100644 --- a/ext/opcache/Optimizer/escape_analysis.c +++ b/ext/opcache/Optimizer/escape_analysis.c @@ -217,6 +217,7 @@ static int is_allocation_def(zend_op_array *op_array, zend_ssa *ssa, int def, in break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: if (OP1_INFO() & (MAY_BE_UNDEF | MAY_BE_NULL | MAY_BE_FALSE)) { /* implicit object/array allocation */ return 1; @@ -259,6 +260,7 @@ static int is_local_def(zend_op_array *op_array, zend_ssa *ssa, int def, int var return 1; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: return 1; case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: @@ -328,6 +330,7 @@ static int is_escape_use(zend_op_array *op_array, zend_ssa *ssa, int use, int va /* break missing intentionally */ case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: @@ -508,7 +511,8 @@ int zend_ssa_escape_analysis(const zend_script *script, zend_op_array *op_array, if (opline->opcode == ZEND_OP_DATA && ((opline-1)->opcode == ZEND_ASSIGN_DIM || - (opline-1)->opcode == ZEND_ASSIGN_OBJ) && + (opline-1)->opcode == ZEND_ASSIGN_OBJ || + (opline-1)->opcode == ZEND_ASSIGN_OBJ_REF) && op->op1_use == i && (op-1)->op1_use >= 0) { enclosing_root = ees[(op-1)->op1_use]; diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 5511313fae768..315b1338ec7da 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -203,6 +203,7 @@ static zend_bool can_replace_op1( case ZEND_ASSIGN_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index 224ea56167a1f..aca528b404384 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -92,6 +92,7 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg case ZEND_UNSET_CV: case ZEND_ASSIGN: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_BIND_GLOBAL: case ZEND_BIND_STATIC: case ZEND_SEND_VAR_EX: diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 20ce0710593a9..6e5af2f5d178c 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2231,6 +2231,24 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_ return NULL; } +static uint32_t zend_convert_type_code_to_may_be(zend_uchar type_code) { + if (type_code == IS_VOID) { + return MAY_BE_NULL; + } else if (type_code == IS_CALLABLE) { + return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == IS_ITERABLE) { + return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == IS_ARRAY) { + return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + } else if (type_code == _IS_BOOL) { + return MAY_BE_TRUE|MAY_BE_FALSE; + } + + ZEND_ASSERT(type_code < IS_REFERENCE); + return 1 << type_code; + +} + static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce) { uint32_t tmp = 0; @@ -2243,22 +2261,7 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar *pce = get_class_entry(script, lcname); zend_string_release_ex(lcname, 0); } else if (ZEND_TYPE_IS_CODE(arg_info->type)) { - zend_uchar type_hint = ZEND_TYPE_CODE(arg_info->type); - - if (type_hint == IS_VOID) { - tmp |= MAY_BE_NULL; - } else if (type_hint == IS_CALLABLE) { - tmp |= MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ITERABLE) { - tmp |= MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == IS_ARRAY) { - tmp |= MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_hint == _IS_BOOL) { - tmp |= MAY_BE_TRUE|MAY_BE_FALSE; - } else { - ZEND_ASSERT(type_hint < IS_REFERENCE); - tmp |= 1 << type_hint; - } + tmp |= zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(arg_info->type)); } else { tmp |= MAY_BE_ANY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; } @@ -2286,7 +2289,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss } if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { - uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (1 << (ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type))); + uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type))); if (ZEND_TYPE_ALLOW_NULL(prop_info->type)) { type |= MAY_BE_NULL; @@ -2868,6 +2871,58 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + tmp = t1; + if (t1 & (MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE)) { + tmp &= ~(MAY_BE_UNDEF|MAY_BE_NULL|MAY_BE_FALSE); + tmp |= MAY_BE_OBJECT | MAY_BE_RC1 | MAY_BE_RCN; + } + if (tmp & MAY_BE_OBJECT) { + tmp |= MAY_BE_RC1 | MAY_BE_RCN; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); + } + t2 = OP1_DATA_INFO(); + if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION)) { + tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF; + } else { + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_ERROR|MAY_BE_RC1|MAY_BE_RCN); + } + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + if (ssa_ops[i].result_def >= 0) { + // TODO: ??? + t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + if (t1) { + tmp &= t1; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } + } + if ((opline+1)->op1_type == IS_CV) { + opline++; + i++; + tmp = (MAY_BE_REF | t2) & ~(MAY_BE_UNDEF|MAY_BE_RC1|MAY_BE_RCN); + if (t2 & MAY_BE_UNDEF) { + tmp |= MAY_BE_NULL; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + + tmp = OP1_INFO(); + if (tmp & (MAY_BE_ANY | MAY_BE_REF)) { + if (tmp & MAY_BE_RC1) { + tmp |= MAY_BE_RCN; + } + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); + } + break; case ZEND_BIND_GLOBAL: tmp = MAY_BE_REF | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; @@ -3300,6 +3355,7 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_SEND_VAR_NO_REF_EX: case ZEND_SEND_REF: case ZEND_ASSIGN_REF: + case ZEND_ASSIGN_OBJ_REF: case ZEND_YIELD: case ZEND_INIT_ARRAY: case ZEND_ADD_ARRAY_ELEMENT: @@ -4234,7 +4290,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { + } else if (opline->op1_type & (IS_TMP_VAR|IS_VAR)) { if (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)) { switch (opline->opcode) { case ZEND_CASE: @@ -4258,9 +4314,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } - if (opline->op2_type == IS_CV) { + if (opline->op2_type == IS_CV) { if (t2 & MAY_BE_UNDEF) { switch (opline->opcode) { case ZEND_ASSIGN_REF: @@ -4280,7 +4336,7 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return 1; } } - } + } switch (opline->opcode) { case ZEND_NOP: @@ -4442,6 +4498,9 @@ int zend_may_throw(const zend_op *opline, zend_op_array *op_array, zend_ssa *ssa return (t1 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)) || (t2 & (MAY_BE_STRING|MAY_BE_ARRAY|MAY_BE_OBJECT)); case ZEND_ASSIGN: + if (t1 & MAY_BE_REF) { + return 1; + } case ZEND_UNSET_VAR: return (t1 & (MAY_BE_OBJECT|MAY_BE_RESOURCE|MAY_BE_ARRAY_OF_OBJECT|MAY_BE_ARRAY_OF_RESOURCE|MAY_BE_ARRAY_OF_ARRAY)); case ZEND_ASSIGN_DIM: diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index a18f4a875c09d..04e398fb75d01 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -629,6 +629,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: if (opline->op1_type == IS_CV) { ssa_ops[k].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; From c453c98f6bbd3998be16b0895102735bc12df12a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:31:43 +0200 Subject: [PATCH 231/369] Fix build failure in exif --- ext/exif/exif.c | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ext/exif/exif.c b/ext/exif/exif.c index c57902bcecb67..500609530016e 100644 --- a/ext/exif/exif.c +++ b/ext/exif/exif.c @@ -4650,11 +4650,11 @@ PHP_FUNCTION(exif_thumbnail) if (!ImageInfo.Thumbnail.width || !ImageInfo.Thumbnail.height) { exif_scan_thumbnail(&ImageInfo); } - ZEND_TRY_ASSIGN_LONG(p_width, ImageInfo.Thumbnail.width); - ZEND_TRY_ASSIGN_LONG(p_height, ImageInfo.Thumbnail.height); + ZEND_TRY_ASSIGN_LONG(z_width, ImageInfo.Thumbnail.width); + ZEND_TRY_ASSIGN_LONG(z_height, ImageInfo.Thumbnail.height); } if (arg_c >= 4) { - ZEND_TRY_ASSIGN_LONG(p_imagetype, ImageInfo.Thumbnail.filetype); + ZEND_TRY_ASSIGN_LONG(z_imagetype, ImageInfo.Thumbnail.filetype); } #ifdef EXIF_DEBUG From 64a309f8878014dfe43d07edff6ecad643a5e561 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:39:32 +0200 Subject: [PATCH 232/369] Add one more test for iterables by ref --- .../typed_properties_067.phpt | 37 +++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_067.phpt diff --git a/Zend/tests/type_declarations/typed_properties_067.phpt b/Zend/tests/type_declarations/typed_properties_067.phpt new file mode 100644 index 0000000000000..546ea9167af4d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_067.phpt @@ -0,0 +1,37 @@ +--TEST-- +Iterable typed properties must be accepted to by-ref array arguments +--FILE-- +it); +var_dump($obj->it); +array_shift($obj->it); +var_dump($obj->it); +parse_str("foo=bar", $obj->it); +var_dump($obj->it); +$obj->it = []; +var_dump($obj->it); + +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +array(0) { +} +array(1) { + ["foo"]=> + string(3) "bar" +} +array(0) { +} + From 98019a9c7d4469621d26d9c5ed49bf46bac53282 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 8 Jun 2018 14:54:22 +0200 Subject: [PATCH 233/369] Fix foreach object iteration with holes --- Zend/zend_vm_def.h | 3 ++- Zend/zend_vm_execute.h | 3 ++- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 655873f724631..c1f33438efc6e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -6426,7 +6426,8 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) break; } } - break; + pos++; + p++; } if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index fd839ae3ab71d..6bbef8adb7f1f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -21511,7 +21511,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z break; } } - break; + pos++; + p++; } if ((value_type & Z_TYPE_MASK) != IS_REFERENCE) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); From 83ec0dfc74d26386de0b79ef7150d1bb114ccebd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:39:15 +0200 Subject: [PATCH 234/369] Restore old code for post_incdec as well --- Zend/zend_execute.c | 49 +++++++++++---------------------------------- 1 file changed, 12 insertions(+), 37 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index cc187e9a76835..465f69cc0e337 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1611,7 +1611,7 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { zval rv, obj; - zval *z, *tmp; + zval *z; zval z_copy; ZVAL_OBJ(&obj, Z_OBJ_P(object)); @@ -1632,46 +1632,21 @@ static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, ZVAL_COPY_VALUE(z, value); } - /* TODO(typed_refs) Is this even necessary? The increment here is (was) performed on - * a dereferenced value and then written back. The type check in write_property should - * thus be sufficient. */ - if (UNEXPECTED(Z_ISREF_P(z))) { - zend_property_info *prop_info; - zend_type ref_type = Z_REFTYPE_P(z); - tmp = Z_REFVAL_P(z); - ZVAL_COPY(EX_VAR(opline->result.var), tmp); - - if (inc) { - increment_function(tmp); - } else { - decrement_function(tmp); - } - - if (UNEXPECTED(ref_type || (prop_info = zend_object_fetch_property_type_info(Z_OBJCE(obj), Z_STR_P(property), NULL)))) { - /* ref types are always stricter than prop types */ - if (UNEXPECTED(ref_type ? !zend_verify_ref_type_assignable_zval(ref_type, tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))) : !zend_verify_property_type(prop_info, &z_copy, &z_copy, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { - if (ref_type) { - zend_throw_ref_type_error(ref_type, tmp); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), tmp); - } - zval_ptr_dtor(tmp); - ZVAL_COPY_VALUE(tmp, EX_VAR(opline->result.var)); - } - } + if (UNEXPECTED(Z_TYPE_P(z) == IS_REFERENCE)) { + ZVAL_COPY(EX_VAR(opline->result.var), Z_REFVAL_P(z)); } else { ZVAL_COPY(EX_VAR(opline->result.var), z); - ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); - zval_ptr_dtor(&z_copy); } - zval_ptr_dtor(z); + ZVAL_COPY(&z_copy, EX_VAR(opline->result.var)); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + Z_OBJ_HT(obj)->write_property(&obj, property, &z_copy, cache_slot); OBJ_RELEASE(Z_OBJ(obj)); + zval_ptr_dtor(&z_copy); + zval_ptr_dtor(z); } else { zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); ZVAL_NULL(EX_VAR(opline->result.var)); From 7f596811380398f4c83ab2524f5afc216f091236 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:42:55 +0200 Subject: [PATCH 235/369] Adjust test with new behavior The reference is no longer modified, so no problems. Any necessary type check would occur in the write_property part. --- .../typed_properties_061.phpt | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index 2b9e8b38f42bd..a12d2c76eaa7a 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -11,7 +11,7 @@ $a = new class { } function __set($x, $y) { - print "ERROR: __set() called on by-ref __get()"; + echo "set($y)\n"; } }; @@ -21,9 +21,7 @@ var_dump($a->foo); $a->_ .= "1"; var_dump($a->foo); -try { - $a->_ .= "e50"; -} catch (Error $e) { echo $e->getMessage(), "\n"; } +$a->_ .= "e50"; var_dump($a->foo); $a->_--; @@ -34,25 +32,25 @@ var_dump($a->foo); $a->foo = PHP_INT_MAX; -try { - $a->_++; -} catch (Error $e) { echo $e->getMessage(), "\n"; } -echo gettype($a->foo),"\n"; +$a->_++; +var_dump($a->foo); -try { - ++$a->_; -} catch (Error $e) { echo $e->getMessage(), "\n"; } -echo gettype($a->foo),"\n"; +++$a->_; +var_dump($a->foo); ?> --EXPECT-- -int(2) -int(21) -Cannot assign string to reference of type int -int(21) -int(20) -int(19) -Cannot assign float to reference of type int -integer -Cannot assign float to reference of type int -integer +set(2) +int(1) +set(11) +int(1) +set(1e50) +int(1) +set(0) +int(1) +set(0) +int(1) +set(9.2233720368548E+18) +int(9223372036854775807) +set(9.2233720368548E+18) +int(9223372036854775807) From 1b0bc3374c62adc1f01a8c3cc6e6050265c10a56 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 10:50:00 +0200 Subject: [PATCH 236/369] Fix compiler warning --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d03d6936d1974..462605240c5dc 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1526,7 +1526,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) { USE_OPLINE zend_free_op free_op1; - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index e2b703065ca6b..40e8de7a7b270 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -20443,7 +20443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND { USE_OPLINE zend_free_op free_op1; - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -39451,7 +39451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ { USE_OPLINE - zval *var_ptr, *val; + zval *var_ptr; zend_type ref_type = 0; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); From 2e28eb6203c2b66187af4d40dd92425bae81a061 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 12:00:19 +0200 Subject: [PATCH 237/369] Improve default value handling * Don't allow null for callable, consistent with everything else. Previously null was allowed as default value, but not at runtime... * Allow arrays as default for iterable. * Print friendlier error message when using null default value, suggesting to use ?Type. --- .../typed_properties_013.phpt | 6 +-- .../typed_properties_014.phpt | 7 +-- .../typed_properties_015.phpt | 6 +-- .../typed_properties_016.phpt | 1 + .../typed_properties_049.phpt | 44 +------------------ .../typed_properties_053.phpt | 2 +- .../typed_properties_054.phpt | 2 +- Zend/zend_compile.c | 39 +++++++++------- 8 files changed, 31 insertions(+), 76 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_013.phpt b/Zend/tests/type_declarations/typed_properties_013.phpt index e6b4751f3a46a..01c2f4b6a0d82 100644 --- a/Zend/tests/type_declarations/typed_properties_013.phpt +++ b/Zend/tests/type_declarations/typed_properties_013.phpt @@ -7,8 +7,4 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with int type can only be int in %s on line 3 - - - - +Fatal error: Default value for property of type int can only be int in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_014.phpt b/Zend/tests/type_declarations/typed_properties_014.phpt index 48486078afb60..2a02f0381ed2e 100644 --- a/Zend/tests/type_declarations/typed_properties_014.phpt +++ b/Zend/tests/type_declarations/typed_properties_014.phpt @@ -3,11 +3,8 @@ Test typed properties disallow incorrect type initial value (array) --FILE-- --EXPECTF-- -Fatal error: Default value for properties with array type can only be an array in %s on line 3 - - - +Fatal error: Default value for property of type array can only be an array in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_015.phpt b/Zend/tests/type_declarations/typed_properties_015.phpt index db880ceed0c78..ac11c0fe3efa4 100644 --- a/Zend/tests/type_declarations/typed_properties_015.phpt +++ b/Zend/tests/type_declarations/typed_properties_015.phpt @@ -7,8 +7,4 @@ class Foo { } ?> --EXPECTF-- -Fatal error: Default value for properties with class type are disallowed in %s on line 3 - - - - +Fatal error: Default value for property of type stdClass may not be null. Use the nullable type ?stdClass to allow null default value in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_016.phpt b/Zend/tests/type_declarations/typed_properties_016.phpt index 28cd239d0434f..6468478930dd7 100644 --- a/Zend/tests/type_declarations/typed_properties_016.phpt +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -7,6 +7,7 @@ class Foo { public float $flt = 2.2; public array $arr = []; public bool $bool = false; + public iterable $iter = []; } echo "ok\n"; ?> diff --git a/Zend/tests/type_declarations/typed_properties_049.phpt b/Zend/tests/type_declarations/typed_properties_049.phpt index 70483f131633d..e761590548027 100644 --- a/Zend/tests/type_declarations/typed_properties_049.phpt +++ b/Zend/tests/type_declarations/typed_properties_049.phpt @@ -5,48 +5,6 @@ Nullable typed property class Foo { public int $foo = null; } -$x = new Foo(); -var_dump($x); -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = "ops"; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} ?> --EXPECTF-- -Fatal error: Default value for properties with int type can only be int in %styped_properties_049.php on line 3 +Fatal error: Default value for property of type int may not be null. Use the nullable type ?int to allow null default value in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 45255ef9e9627..86b5bfb013981 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -4,7 +4,7 @@ Default values of callable properties --EXPECTF-- -Fatal error: Default value for properties with callable type can only be null in %styped_properties_054.php on line 3 +Fatal error: Property of type callable may not have default value in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 64977a4e4b42c..d301c1113d47f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6059,16 +6059,17 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ ZSTR_VAL(name)); } + if (type_ast->attr & ZEND_TYPE_NULLABLE) { + allow_null = 1; + type_ast->attr &= ~ZEND_TYPE_NULLABLE; + } + if (type_ast->kind == ZEND_AST_TYPE) { optional_type = type_ast->attr; } else { zend_string *class_name = zend_ast_get_str(type_ast); zend_uchar type = zend_lookup_builtin_type_by_name(class_name); - if (type_ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; - type_ast->attr &= ~ZEND_TYPE_NULLABLE; - } if (type != 0) { if (type_ast->attr != ZEND_NAME_NOT_FQ) { zend_error_noreturn(E_COMPILE_ERROR, @@ -6121,24 +6122,30 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_const_expr_to_zval(&value_zv, value_ast); if (optional_type && !Z_CONSTANT(value_zv)) { - if (allow_null && Z_TYPE(value_zv) == IS_NULL) { - /* pass */ - } else if (optional_type == IS_ARRAY) { - if (Z_TYPE(value_zv) != IS_ARRAY) { + if (Z_TYPE(value_zv) == IS_NULL) { + if (!allow_null) { + const char *name = optional_type_name + ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with array type can only be an array"); + "Default value for property of type %s may not be null. " + "Use the nullable type ?%s to allow null default value", + name, name); } - } else if (optional_type == IS_CALLABLE) { - if (Z_TYPE(value_zv) != IS_NULL) { + } else if (optional_type_name || + optional_type == IS_CALLABLE || optional_type == IS_OBJECT) { + const char *name = optional_type_name + ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + zend_error_noreturn(E_COMPILE_ERROR, + "Property of type %s may not have default value", name); + } else if (optional_type == IS_ARRAY || optional_type == IS_ITERABLE) { + if (Z_TYPE(value_zv) != IS_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with callable type can only be null"); + "Default value for property of type %s can only be an array", + zend_get_type_by_const(optional_type)); } - } else if (optional_type == IS_OBJECT) { - zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with class type are disallowed"); } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { zend_error_noreturn(E_COMPILE_ERROR, - "Default value for properties with %s type can only be %s", + "Default value for property of type %s can only be %s", zend_get_type_by_const(optional_type), zend_get_type_by_const(optional_type)); } From 44735544871cb0b31b29dbcdd5f23c8bab981258 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 15:50:19 +0200 Subject: [PATCH 238/369] Allow int default value for float properties --- Zend/tests/type_declarations/typed_properties_016.phpt | 1 + Zend/zend_compile.c | 5 +++++ 2 files changed, 6 insertions(+) diff --git a/Zend/tests/type_declarations/typed_properties_016.phpt b/Zend/tests/type_declarations/typed_properties_016.phpt index 6468478930dd7..e7f81c2731c78 100644 --- a/Zend/tests/type_declarations/typed_properties_016.phpt +++ b/Zend/tests/type_declarations/typed_properties_016.phpt @@ -5,6 +5,7 @@ Test typed properties initial values class Foo { public int $int = 1; public float $flt = 2.2; + public float $flt2 = 2; public array $arr = []; public bool $bool = false; public iterable $iter = []; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d301c1113d47f..616a3a21fe417 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6143,6 +6143,11 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Default value for property of type %s can only be an array", zend_get_type_by_const(optional_type)); } + } else if (optional_type == IS_DOUBLE) { + if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) { + zend_error_noreturn(E_COMPILE_ERROR, + "Default value for property of type float can only be float or int"); + } } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type %s can only be %s", From 4ef062689336a805b4de9ef95b15db207f6643c0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 9 Jun 2018 17:43:12 +0200 Subject: [PATCH 239/369] Use not_in_object_context helper --- Zend/zend_vm_def.h | 10 +-- Zend/zend_vm_execute.h | 180 +++++++++++++++++------------------------ 2 files changed, 76 insertions(+), 114 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 462605240c5dc..b2293572d93cc 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2673,16 +2673,14 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); } - property = GET_OP2_ZVAL_PTR(BP_VAR_R); - container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - FREE_OP2(); - FREE_UNFETCHED_OP_DATA(); - HANDLE_EXCEPTION(); + ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper); } + property = GET_OP2_ZVAL_PTR(BP_VAR_R); + cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 40e8de7a7b270..d74c8d47f4cca 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23861,16 +23861,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -23987,16 +23985,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26601,16 +26597,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -26727,16 +26721,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -30955,16 +30947,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -31081,16 +31071,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); - if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33302,16 +33290,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -33427,16 +33413,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35519,16 +35503,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -35644,16 +35626,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38361,16 +38341,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -38486,16 +38464,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); - if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -43891,16 +43867,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -44016,16 +43990,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = RT_CONSTANT(opline, opline->op2); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = RT_CONSTANT(opline, opline->op2); + cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48082,16 +48054,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -48207,16 +48177,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); + cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54239,16 +54207,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); @@ -54364,16 +54330,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } - property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); - if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { - zend_throw_error(NULL, "Using $this when not in object context"); - - HANDLE_EXCEPTION(); + if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { + ZEND_VM_TAIL_CALL(zend_this_not_in_object_context_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); } + property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); + cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); From cb75a2554086f02b60e29cb1e05e8c2ca6a931fb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 10 Jun 2018 00:23:43 +0200 Subject: [PATCH 240/369] Fix ASSIGN_OBJ_REF implementation Line up logic with ASSIGN_REF, fixing various discrepancies. --- Zend/tests/bug69732.phpt | 21 +- Zend/zend_vm_def.h | 52 ++- Zend/zend_vm_execute.h | 928 +++++++++++++++++++++------------------ 3 files changed, 539 insertions(+), 462 deletions(-) diff --git a/Zend/tests/bug69732.phpt b/Zend/tests/bug69732.phpt index 4503235f53d3c..8d5fccd71211a 100644 --- a/Zend/tests/bug69732.phpt +++ b/Zend/tests/bug69732.phpt @@ -17,14 +17,15 @@ function ret_assoc() { $wpq = new wpq; $wpq->interesting =& ret_assoc(); -$x = &$wpq->interesting; -var_dump($x); -?> +$x = $wpq->interesting; +printf("%s\n", $x); --EXPECTF-- -Notice: Only variables should be assigned by reference in %s on line %d -array(2) { - ["foo"]=> - string(3) "bar" - [0]=> - string(3) "XXX" -} +Notice: Undefined property: wpq::$interesting in %sbug69732.php on line 6 + +Notice: Indirect modification of overloaded property wpq::$interesting has no effect in %sbug69732.php on line 16 + +Fatal error: Uncaught Error: Cannot assign by reference to overloaded object in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d + diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 308da145965c3..d7b7a1fd5a54f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2658,20 +2658,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C SAVE_OPLINE(); - if (OP_DATA_TYPE == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - FREE_UNFETCHED_OP1(); - FREE_UNFETCHED_OP2(); - FREE_UNFETCHED_OP_DATA(); - HANDLE_EXCEPTION(); - } - - ZEND_VM_DISPATCH_TO_HANDLER(ZEND_ASSIGN_OBJ); - } - container = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (OP1_TYPE == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -2683,24 +2669,42 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C cache_addr = (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, OP1_TYPE, property, OP2_TYPE, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); FREE_OP1_VAR_PTR(); FREE_OP2(); - FREE_UNFETCHED_OP_DATA(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if ((OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); + /* op_data freed by assign_to_variable */ + FREE_OP1_VAR_PTR(); + FREE_OP2(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - variable_ptr = Z_INDIRECT(variable); - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index bb9e79baa4931..6e3815a3f6036 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23847,20 +23847,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -23872,24 +23858,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -23971,20 +23975,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -23996,24 +23986,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -26583,20 +26591,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -26608,24 +26602,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - variable_ptr = Z_INDIRECT(variable); - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -26707,20 +26719,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -26732,24 +26730,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -30931,20 +30947,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -30956,24 +30958,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -31055,20 +31075,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - zval_ptr_dtor_nogc(EX_VAR(opline->op1.var)); - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (IS_VAR == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -31080,24 +31086,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_VAR, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -33274,20 +33298,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -33299,24 +33309,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -33397,20 +33425,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -33422,24 +33436,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { + + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -35487,20 +35519,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -35512,24 +35530,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -35610,20 +35646,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -35635,24 +35657,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -38318,26 +38358,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_free_op free_op_data; zval *property; zval *container; - zval variable, *variable_ptr = &variable; - zval *value_ptr; - void **cache_addr; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } + zval variable, *variable_ptr = &variable; + zval *value_ptr; + void **cache_addr; + zend_type ref_type = 0; - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } + SAVE_OPLINE(); container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); @@ -38350,24 +38376,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -38448,20 +38492,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_obj_zval_ptr_unused(EXECUTE_DATA_C); if (IS_UNUSED == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -38473,24 +38503,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_UNUSED, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -43851,20 +43899,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -43876,24 +43910,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -43974,20 +44026,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -43999,24 +44037,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O cache_addr = (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CONST, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -48038,20 +48094,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -48063,24 +48105,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -48161,20 +48221,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -48186,24 +48232,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ cache_addr = ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, (IS_TMP_VAR|IS_VAR) OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + zval_ptr_dtor_nogc(free_op2); + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -54191,20 +54255,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); - if (IS_VAR == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -54216,24 +54266,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; @@ -54314,20 +54382,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D SAVE_OPLINE(); - if (IS_CV == IS_VAR - && (opline->extended_value & ZEND_RETURNS_FUNCTION) - && UNEXPECTED(!Z_ISREF_P(EX_VAR((opline+1)->op1.var)))) { - zend_error(E_NOTICE, "Only variables should be assigned by reference"); - if (UNEXPECTED(EG(exception) != NULL)) { - - - - HANDLE_EXCEPTION(); - } - - ZEND_VM_TAIL_CALL(ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU)); - } - container = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (IS_CV == IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) == IS_UNDEF)) { @@ -54339,24 +54393,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D cache_addr = (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL; zend_fetch_property_address(variable_ptr, container, IS_CV, property, IS_CV, cache_addr, BP_VAR_W, 0 OPLINE_CC); + if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) { + variable_ptr = Z_INDIRECT_P(variable_ptr); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT) && - UNEXPECTED(!Z_ISERROR(variable))) { zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); + UNDEF_RESULT(); HANDLE_EXCEPTION(); - } + } else if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + variable_ptr = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && + opline->extended_value == ZEND_RETURNS_FUNCTION && + UNEXPECTED(!Z_ISREF_P(value_ptr))) { - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference( + Z_INDIRECT_P(variable_ptr), value_ptr, IS_CV OPLINE_CC EXECUTE_DATA_CC))) { - if ((IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) - || UNEXPECTED(Z_ISERROR(variable))) { - variable_ptr = &EG(uninitialized_zval); - } else { - variable_ptr = Z_INDIRECT(variable); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + + + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { zend_property_info *prop_info; From 3021bbcb62b0e71f051cb72e4e249071c387bf73 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 11 Jun 2018 22:27:28 +0200 Subject: [PATCH 241/369] Don't automatically initialize nullable prop to null Handle them consistently with other types and initialize to "uninitialized", unless a default value is explicitly given. --- Zend/tests/type_declarations/typed_properties_047.phpt | 2 +- Zend/tests/type_declarations/typed_properties_052.phpt | 8 ++++---- Zend/tests/type_declarations/typed_properties_059.phpt | 6 +++--- Zend/zend_compile.c | 2 +- 4 files changed, 9 insertions(+), 9 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 58fde94d36586..9267f53047ae5 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -3,7 +3,7 @@ Nullable typed property --FILE-- --EXPECT-- -object(A)#1 (3) { +object(A)#1 (0) { ["a1"]=> uninitialized(A) ["b1"]=> @@ -26,9 +26,9 @@ object(A)#1 (3) { ["c1"]=> uninitialized(Foo\C) ["a2"]=> - NULL + uninitialized(?A) ["b2"]=> - NULL + uninitialized(?B) ["c2"]=> - NULL + uninitialized(?Foo\C) } diff --git a/Zend/tests/type_declarations/typed_properties_059.phpt b/Zend/tests/type_declarations/typed_properties_059.phpt index f54b3df278e19..caee8501f72b5 100644 --- a/Zend/tests/type_declarations/typed_properties_059.phpt +++ b/Zend/tests/type_declarations/typed_properties_059.phpt @@ -17,13 +17,13 @@ $x = new A; var_dump($x); ?> --EXPECT-- -object(A)#1 (2) { +object(A)#1 (0) { ["a2"]=> uninitialized(int) ["b2"]=> - NULL + uninitialized(?int) ["a1"]=> uninitialized(int) ["b1"]=> - NULL + uninitialized(?int) } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 616a3a21fe417..ce8194cda3156 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6155,7 +6155,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_get_type_by_const(optional_type)); } } - } else if (!optional_type || allow_null) { + } else if (!optional_type) { ZVAL_NULL(&value_zv); } else { ZVAL_UNDEF(&value_zv); From 230142e1fe69195685b0c3e26c593ba15df0ebd1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 12 Jun 2018 20:57:55 +0200 Subject: [PATCH 242/369] Forbid callable type hint in typed properties --- .../typed_properties_017.phpt | 6 +----- .../typed_properties_053.phpt | 14 ++++---------- .../typed_properties_054.phpt | 6 +++--- Zend/zend_compile.c | 18 +++++++++--------- 4 files changed, 17 insertions(+), 27 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt index 23ddb4adf571a..16de52ea12e83 100644 --- a/Zend/tests/type_declarations/typed_properties_017.phpt +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -9,8 +9,4 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Typed property Foo::$int must not be void in %s on line 3 - - - - +Fatal error: Typed property Foo::$int cannot have type void in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index 86b5bfb013981..e9635cd448e62 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -1,18 +1,12 @@ --TEST-- -Default values of callable properties +Typed properties disallow callable --FILE-- ---EXPECT-- -object(A)#1 (1) { - ["a1"]=> - uninitialized(callable) - ["a2"]=> - NULL -} +--EXPECTF-- +Fatal error: Typed property A::$a cannot have type callable in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_054.phpt b/Zend/tests/type_declarations/typed_properties_054.phpt index 51ce8dfb3b58e..ffdde768de177 100644 --- a/Zend/tests/type_declarations/typed_properties_054.phpt +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -1,12 +1,12 @@ --TEST-- -Default values of callable properties +Typed properties disallow callable (nullable variant) --FILE-- --EXPECTF-- -Fatal error: Property of type callable may not have default value in %s on line %d +Fatal error: Typed property A::$a cannot have type callable in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index ce8194cda3156..48a6440f1109f 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6077,13 +6077,6 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ ZSTR_VAL(zend_string_tolower(class_name))); } - if (type == IS_VOID) { - zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s must not be void", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - } - optional_type = type; } else { uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); @@ -6100,6 +6093,14 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ optional_type_name = class_name; } } + + if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { + zend_error_noreturn(E_COMPILE_ERROR, + "Typed property %s::$%s cannot have type %s", + ZSTR_VAL(ce->name), + ZSTR_VAL(name), + zend_get_type_by_const(optional_type)); + } } /* Doc comment has been appended as last element in ZEND_AST_PROP_ELEM ast */ @@ -6131,8 +6132,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ "Use the nullable type ?%s to allow null default value", name, name); } - } else if (optional_type_name || - optional_type == IS_CALLABLE || optional_type == IS_OBJECT) { + } else if (optional_type_name || optional_type == IS_OBJECT) { const char *name = optional_type_name ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); zend_error_noreturn(E_COMPILE_ERROR, From 759d0786c4cc114db4c95a3dde778f0a5505a221 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 16:30:28 +0200 Subject: [PATCH 243/369] Add support for typed static properties (no opcache yet) --- .../typed_properties_023.phpt | 46 +- .../typed_properties_068.phpt | 102 + .../typed_properties_069.phpt | 28 + .../typed_properties_070.phpt | 50 + Zend/zend_API.c | 16 +- Zend/zend_compile.c | 27 +- Zend/zend_execute.c | 72 +- Zend/zend_object_handlers.c | 14 +- Zend/zend_object_handlers.h | 2 +- Zend/zend_vm_def.h | 175 +- Zend/zend_vm_execute.h | 3760 ++++++++++++++--- Zend/zend_vm_handlers.h | 1004 ++--- Zend/zend_vm_opcodes.c | 10 +- Zend/zend_vm_opcodes.h | 3 +- ext/reflection/php_reflection.c | 16 +- 15 files changed, 4051 insertions(+), 1274 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_068.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_069.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_070.phpt diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index ce6aa53c13876..e6ab663b2b367 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -1,17 +1,43 @@ --TEST-- -Test typed properties disallow static +Test typed static property --FILE-- ---EXPECTF-- -Fatal error: Typed property Foo::$thing must not be static in %s on line 3 - - - - +class Foo { + public static int $i; + public static string $s = "x"; +} +var_dump(Foo::$s); +Foo::$i = 1; +var_dump(Foo::$i); +Foo::$i = "1"; +var_dump(Foo::$i); +Foo::$s = Foo::$i++; +var_dump(Foo::$s, Foo::$i); +$a = 3; +$b = "3"; +Foo::$s = $a; +var_dump(Foo::$s); +Foo::$i = "4"; +var_dump(Foo::$i); +Foo::$i = ref(); +var_dump(Foo::$i); +Foo::$s = ref(); +var_dump(Foo::$s); +?> +--EXPECTF-- +string(1) "x" +int(1) +int(1) +string(1) "1" +int(2) +string(1) "3" +int(4) +int(5) +string(1) "5" diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt new file mode 100644 index 0000000000000..2cce66d63564c --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -0,0 +1,102 @@ +--TEST-- +Test typed static property by ref +--FILE-- +getMessage()."\n"; } +var_dump($i, Foo::$i); + +try { + Foo::$i = null; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($i, Foo::$i); + +Foo::$s = &intRef(); +var_dump(Foo::$s, intRef()); + +Foo::$i = &stringRef(); +var_dump(Foo::$i, stringRef()); + +try { + Foo::$i = &nonNumericStringRef(); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, nonNumericStringRef()); + +try { + Foo::$i = &Foo::$s; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, Foo::$s); + +try { + Foo::$s = &Foo::$i; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i, Foo::$s); + +?> +--EXPECT-- +int(5) +int(2) +int(2) +int(3) +int(3) +int(4) +int(4) +Cannot assign null to reference of type int +int(4) +int(4) +Typed property Foo::$i must be int, null used +int(4) +int(4) +string(1) "5" +int(5) +int(0) +string(1) "0" +Cannot assign string to reference of type int +int(0) +string(1) "x" +Static property and reference types int and string are not compatible +int(0) +string(1) "5" +Static property and reference types string and int are not compatible +int(0) +string(1) "5" diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt new file mode 100644 index 0000000000000..d0afa395bde25 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -0,0 +1,28 @@ +--TEST-- +Test assign of invalid string to typed static int property +--FILE-- +getMessage()."\n"; } +try { + var_dump(Foo::$i); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(nonNumericStringRef()); + +?> +--EXPECTF-- +Cannot assign string to reference of type int +Typed static property Foo::$i must not be accessed before initialization +string(1) "x" + diff --git a/Zend/tests/type_declarations/typed_properties_070.phpt b/Zend/tests/type_declarations/typed_properties_070.phpt new file mode 100644 index 0000000000000..0760db3914c8e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_070.phpt @@ -0,0 +1,50 @@ +--TEST-- +Test typed static property with assign op operators +--FILE-- +getMessage()."\n"; } +var_dump(Foo::$i); + +try { + Foo::$i .= PHP_INT_MAX; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump(Foo::$i); + +?> +--EXPECT-- +string(2) "11" +string(2) "13" +string(2) "12" +int(1) +Typed property Foo::$i must be int, float used +int(1) +Typed property Foo::$i must be int, string used +int(1) + diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 361ea2f5ad13b..111da1eff44fc 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3756,15 +3756,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name { zend_property_info *property_info, *property_info_ptr; - if (optional_type) { - if (access_type & ZEND_ACC_STATIC) { - zend_error(ce->type == ZEND_USER_CLASS ? E_COMPILE_ERROR : E_CORE_ERROR, - "Typed property %s::$%s must not be static", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - return FAILURE; - } - + if (optional_type && (access_type & ZEND_ACC_STATIC) == 0) { ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } @@ -4155,11 +4147,12 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value) /* {{{ */ { zval *property; + zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, 0); + property = zend_std_get_static_property(scope, key, 0, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); if (!property) { @@ -4281,11 +4274,12 @@ ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const c ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent) /* {{{ */ { zval *property; + zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, silent); + property = zend_std_get_static_property(scope, key, silent, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 6bf2b6db51b8d..b9dd71185a8ed 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2715,7 +2715,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i } /* }}} */ -zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ +zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, int by_ref, int delayed) /* {{{ */ { zend_ast *class_ast = ast->child[0]; zend_ast *prop_ast = ast->child[1]; @@ -2734,7 +2734,7 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i } if (opline->op1_type == IS_CONST) { convert_to_string(CT_CONSTANT(opline->op1)); - opline->extended_value = zend_alloc_polymorphic_cache_slot(); + opline->extended_value = zend_alloc_polymorphic_cache_slots(2); } if (class_node.op_type == IS_CONST) { opline->op2_type = IS_CONST; @@ -2747,6 +2747,10 @@ zend_op *zend_compile_static_prop(znode *result, zend_ast *ast, uint32_t type, i SET_NODE(opline->op2, &class_node); } + if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ + opline->extended_value |= ZEND_FETCH_REF; + } + zend_adjust_for_fetch_type(opline, type); return opline; } @@ -3096,8 +3100,12 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; + zend_make_var_result(result, opline); zend_emit_op_data(&source_node); + } else if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { + opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; zend_make_var_result(result, opline); + zend_emit_op_data(&source_node); } else { opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); opline->extended_value = 0; @@ -4366,7 +4374,7 @@ void zend_compile_unset(zend_ast *ast) /* {{{ */ opline->opcode = ZEND_UNSET_OBJ; return; case ZEND_AST_STATIC_PROP: - opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0); + opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_UNSET, 0, 0); opline->opcode = ZEND_UNSET_STATIC_PROP; return; EMPTY_SWITCH_DEFAULT_CASE() @@ -6073,13 +6081,6 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *optional_type_name = NULL; if (type_ast) { - if (flags & ZEND_ACC_STATIC) { - zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s must not be static", - ZSTR_VAL(ce->name), - ZSTR_VAL(name)); - } - if (type_ast->attr & ZEND_TYPE_NULLABLE) { allow_null = 1; type_ast->attr &= ~ZEND_TYPE_NULLABLE; @@ -7652,7 +7653,7 @@ void zend_compile_isset_or_empty(znode *result, zend_ast *ast) /* {{{ */ opline->opcode = ZEND_ISSET_ISEMPTY_PROP_OBJ; break; case ZEND_AST_STATIC_PROP: - opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0); + opline = zend_compile_static_prop(result, var_ast, BP_VAR_IS, 0, 0); opline->opcode = ZEND_ISSET_ISEMPTY_STATIC_PROP; break; EMPTY_SWITCH_DEFAULT_CASE() @@ -8486,7 +8487,7 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) / zend_compile_prop(result, ast, type, by_ref); return; case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 0); + zend_compile_static_prop(result, ast, type, by_ref, 0); return; case ZEND_AST_CALL: zend_compile_call(result, ast, type); @@ -8530,7 +8531,7 @@ void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_ return; } case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, 1); + zend_compile_static_prop(result, ast, type, by_ref, 1); return; default: zend_compile_var(result, ast, type, 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 086085a4b9f74..e4117c7ffdea3 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2467,10 +2467,11 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } } -static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { +static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { zend_free_op free_op1; zend_string *name, *tmp_name; zend_class_entry *ce; + zend_property_info *property_info; zend_uchar op1_type = opline->op1_type, op2_type = opline->op2_type; @@ -2500,7 +2501,8 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval ce = Z_CE_P(EX_VAR(opline->op2.var)); } if (EXPECTED(op1_type == IS_CONST) && EXPECTED(CACHED_PTR(cache_slot) == ce)) { - *retval = CACHED_PTR(cache_slot + sizeof(void*)); + *retval = CACHED_PTR(cache_slot + sizeof(void *)); + *prop_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); return SUCCESS; } } @@ -2520,7 +2522,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } } - *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS); + *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS, &property_info); if (UNEXPECTED(op1_type != IS_CONST)) { zend_tmp_string_release(tmp_name); @@ -2536,20 +2538,50 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval if (EXPECTED(op1_type == IS_CONST)) { CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval); + *prop_info = property_info; + CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info); } return SUCCESS; } -static zend_always_inline int zend_fetch_static_property_address(zval **retval, uint32_t cache_slot, int fetch_type OPLINE_DC EXECUTE_DATA_DC) { +static zend_always_inline int zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int by_ref OPLINE_DC EXECUTE_DATA_DC) { + int success; + zend_property_info *property_info; + if (opline->op1_type == IS_CONST && (opline->op2_type == IS_CONST || (opline->op2_type == IS_UNUSED && (opline->op2.num == ZEND_FETCH_CLASS_SELF || opline->op2.num == ZEND_FETCH_CLASS_PARENT))) && EXPECTED(CACHED_PTR(cache_slot) != NULL)) { *retval = CACHED_PTR(cache_slot + sizeof(void *)); - return SUCCESS; + property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); } else { - return zend_fetch_static_property_address_ex(retval, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC); + success = zend_fetch_static_property_address_ex(retval, &property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(success != SUCCESS)) { + return FAILURE; + } } + if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); + return FAILURE; + } + + if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + return FAILURE; + } + ZVAL_NEW_REF(*retval, *retval); + Z_REF_P(*retval)->type = zend_get_prop_info_ref_type(property_info); + } + + if (prop_info) { + *prop_info = property_info; + } + + return SUCCESS; } ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { @@ -2562,6 +2594,34 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } +static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + if (!ZEND_TYPE_ALLOW_NULL(old_type)) { + ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ + } + if (ZEND_TYPE_WITHOUT_NULL(old_type) == ref_type) { + return ref_type; + } + if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { + if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { + return ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); + } else if (instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { + return ref_type; + } + } + + zend_throw_exception_ex( + zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), + "%s and reference types %s%s and %s%s are not compatible", + source, + ZEND_TYPE_ALLOW_NULL(ref_type) ? "?" : "", + ZEND_TYPE_IS_CLASS(ref_type) ? ZSTR_VAL(ZEND_TYPE_CE(ref_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(ref_type)), + ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", + ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) + ); + return 0; +} + + static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 1c50d854e9905..c9f4af5246bca 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1399,23 +1399,23 @@ ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_st } /* }}} */ -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent) /* {{{ */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent, zend_property_info **property_info) /* {{{ */ { - zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); zval *ret; + *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); - if (UNEXPECTED(property_info == NULL)) { + if (UNEXPECTED(*property_info == NULL)) { goto undeclared_property; } - if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) { + if (UNEXPECTED(!zend_verify_property_access(*property_info, ce))) { if (!silent) { - zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); + zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string((*property_info)->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } - if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) { + if (UNEXPECTED(((*property_info)->flags & ZEND_ACC_STATIC) == 0)) { goto undeclared_property; } @@ -1424,7 +1424,7 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p return NULL; } } - ret = CE_STATIC_MEMBERS(ce) + property_info->offset; + ret = CE_STATIC_MEMBERS(ce) + (*property_info)->offset; /* check if static properties were destoyed */ if (UNEXPECTED(CE_STATIC_MEMBERS(ce) == NULL)) { diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 1dfed715f3535..0521b11c861ec 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -174,7 +174,7 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key); -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent); +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent, struct _zend_property_info **prop_info); ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name); ZEND_API zend_function *zend_std_get_constructor(zend_object *object); ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 2731d6c49f6cc..84de15cc203c2 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -792,7 +792,7 @@ ZEND_VM_COLD_HELPER(zend_undefined_function_helper, ANY, ANY, zval *function_nam ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, binary_op_type binary_op) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -810,7 +810,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, property = GET_OP2_ZVAL_PTR(BP_VAR_R); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -876,7 +876,7 @@ ZEND_VM_C_LABEL(assign_op_object): } } while (0); - FREE_OP(free_op_data1); + FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); /* assign_obj has two opcodes! */ @@ -890,12 +890,14 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP_DATA(); HANDLE_EXCEPTION(); } @@ -904,10 +906,35 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE SEPARATE_ZVAL_NOREF(prop); value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP_DATA(); @@ -1809,7 +1836,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -1832,7 +1859,7 @@ ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FET ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R); } -ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) { ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W); } @@ -1842,7 +1869,7 @@ ZEND_VM_HANDLER(175, ZEND_FETCH_STATIC_PROP_RW, CONST|TMPVAR|CV, UNUSED|CLASS_FE ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_RW); } -ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, CACHE_SLOT) +ZEND_VM_HANDLER(177, ZEND_FETCH_STATIC_PROP_FUNC_ARG, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) { int fetch_type = (UNEXPECTED(ZEND_CALL_INFO(EX(call)) & ZEND_CALL_SEND_ARG_BY_REF)) ? @@ -2459,17 +2486,44 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { FREE_UNFETCHED_OP_DATA(); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + FREE_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -2678,7 +2732,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); FREE_OP1_VAR_PTR(); FREE_OP2(); @@ -2718,32 +2771,13 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } } } @@ -2773,6 +2807,69 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_NEXT_OPCODE_EX(1, 2); } +ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + FREE_UNFETCHED_OP_DATA(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = GET_OP_DATA_ZVAL_PTR_PTR(BP_VAR_W); + + if (OP_DATA_TYPE == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (OP_DATA_TYPE == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, OP2_TYPE OPLINE_CC EXECUTE_DATA_CC))) { + FREE_OP_DATA_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + FREE_OP_DATA_VAR_PTR(); + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + ZEND_VM_HOT_HELPER(zend_leave_helper, ANY, ANY) { zend_execute_data *old_execute_data; @@ -6606,7 +6703,7 @@ ZEND_VM_HANDLER(180, ZEND_ISSET_ISEMPTY_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CLA SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index b4f04d01d3057..c066e0bd24f92 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4527,12 +4527,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -4541,10 +4543,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -4653,7 +4680,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -4993,17 +5020,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5018,17 +5072,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5043,17 +5124,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5068,17 +5176,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5089,6 +5224,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -5796,7 +6056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -6841,12 +7101,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -6855,10 +7117,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -8081,7 +8368,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8136,17 +8423,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8161,17 +8475,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8186,17 +8527,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8211,17 +8579,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8232,6 +8627,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -8294,7 +8814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -8452,12 +8972,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -8466,10 +8988,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -8697,7 +9244,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8767,17 +9314,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8792,17 +9366,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8817,17 +9418,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8842,17 +9470,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8863,6 +9518,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -9381,7 +10161,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -13706,7 +14486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14005,17 +14785,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14030,17 +14837,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14055,17 +14889,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14080,17 +14941,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -14101,6 +14989,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -14467,7 +15480,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -16058,7 +17071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -16113,17 +17126,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16138,17 +17178,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16163,17 +17230,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16188,17 +17282,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16209,6 +17330,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16271,7 +17517,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -16460,7 +17706,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -16515,17 +17761,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16540,17 +17813,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16565,17 +17865,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16590,17 +17917,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -16611,6 +17965,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -16754,7 +18233,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -18661,12 +20140,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -18675,10 +20156,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -19200,12 +20706,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -19214,10 +20722,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -19872,12 +21405,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -19886,10 +21421,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -22552,7 +24112,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_VAR_CONS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; @@ -22570,7 +24130,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -22636,7 +24196,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ @@ -22650,12 +24210,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -22664,10 +24226,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -24650,7 +26237,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24690,32 +26276,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -24778,7 +26345,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -24818,32 +26384,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); } } } @@ -25506,7 +27053,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IN_ARRAY_SPEC_VAR_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op2, free_op_data1; + zend_free_op free_op1, free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -25524,7 +27071,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -25590,7 +27137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ @@ -25604,12 +27151,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -25618,10 +27167,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -27553,7 +29127,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -27593,32 +29166,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -27681,7 +29235,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -27721,32 +29274,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -28675,12 +30209,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -28689,10 +30225,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -30059,7 +31620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_GET_TYPE_SPEC_VAR_UNUSED_HANDL static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_VAR_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op1, free_op_data1; + zend_free_op free_op1, free_op_data; zval *object; zval *property; zval *value; @@ -30077,7 +31638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -30143,7 +31704,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; /* assign_obj has two opcodes! */ @@ -32079,7 +33640,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32119,32 +33679,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -32207,7 +33748,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32247,32 +33787,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + + + HANDLE_EXCEPTION(); } } } @@ -33117,7 +34638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_CLASS_NAME_SPEC_UNUSED_H static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -33135,7 +34656,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -33201,7 +34722,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -34441,7 +35962,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -34481,32 +36001,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -34568,7 +36069,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -34608,32 +36108,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -35345,7 +36826,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -35363,7 +36844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -35429,7 +36910,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ @@ -36673,7 +38154,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -36713,32 +38193,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -36800,7 +38261,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -36840,32 +38300,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -38206,7 +39647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FUNC_GET_ARGS_SPEC_UNUSED_UNUS static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_UNUSED_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -38224,7 +39665,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -38290,7 +39731,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -39530,7 +40971,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -39570,32 +41010,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -39657,7 +41078,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -39697,32 +41117,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -42756,7 +44157,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CONST_HANDLER static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CONST(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -42774,7 +44175,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = RT_CONSTANT(opline, opline->op2); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -42840,7 +44241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -42854,12 +44255,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -42868,10 +44271,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -43688,7 +45116,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -44721,17 +46149,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44746,17 +46201,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44771,17 +46253,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -44796,17 +46305,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -45256,7 +46792,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -45296,32 +46831,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -45383,7 +46899,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -45423,32 +46938,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -45477,6 +46973,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -46028,7 +47649,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -47263,7 +48884,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_TMPVAR_HANDLE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_TMPVAR(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op2, free_op_data1; + zend_free_op free_op2, free_op_data; zval *object; zval *property; zval *value; @@ -47281,7 +48902,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -47347,7 +48968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); zval_ptr_dtor_nogc(free_op2); /* assign_obj has two opcodes! */ @@ -47361,12 +48982,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -47375,10 +48998,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -49556,7 +51204,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -49596,32 +51243,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -49683,7 +51311,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); zval_ptr_dtor_nogc(free_op2); @@ -49723,32 +51350,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + zval_ptr_dtor_nogc(free_op2); + + HANDLE_EXCEPTION(); } } } @@ -50655,7 +52263,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -50710,17 +52318,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50735,17 +52370,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50760,17 +52422,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50785,17 +52474,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50911,6 +52627,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_VM_COLD ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -50973,7 +52814,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -51180,12 +53021,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h USE_OPLINE zend_free_op free_op_data; zval *prop, *value; + zend_property_info *prop_info; + zend_type ref_type = 0; SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, (opline+1)->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, &prop_info, (opline+1)->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { ZEND_ASSERT(EG(exception)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); HANDLE_EXCEPTION(); } @@ -51194,10 +53037,35 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); - binary_op(prop, prop, value); + + if (UNEXPECTED(Z_ISREF_P(prop))) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + SEPARATE_ZVAL_NOREF(prop); + + if (UNEXPECTED(prop_info->type || ref_type)) { + /* special case for typed properties */ + zval z_copy; + + binary_op(&z_copy, prop, value); + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + binary_op(prop, prop, value); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), prop); } FREE_OP(free_op_data); @@ -51630,7 +53498,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, opline->extended_value, type OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -51734,17 +53602,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = RT_CONSTANT((opline+1), (opline+1)->op1); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51759,17 +53654,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51784,17 +53706,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + zval_ptr_dtor_nogc(free_op_data); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -51809,17 +53758,44 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *value; + zval *prop, *val, *value, tmp; + zend_reference *ref = NULL; + zend_property_info *prop_info; SAVE_OPLINE(); - if (zend_fetch_static_property_address(&prop, opline->extended_value, BP_VAR_W OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); + + if (UNEXPECTED(prop_info->type)) { + if (Z_ISREF_P(value)) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + + val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, value); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + value = val; + + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { + Z_TRY_ADDREF_P(val); + } + + if (ref && GC_DELREF(ref) == 0) { + efree(ref); + } + } + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -52180,6 +54156,131 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + zend_free_op free_op_data; + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + + if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + USE_OPLINE + + zval *prop, *value_ptr; + zend_property_info *prop_info; + zend_type ref_type = 0; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + + if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + prop = &EG(uninitialized_zval); + } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + /* op_data freed by assign_to_variable */ + ZEND_VM_NEXT_OPCODE_EX(1, 2); + } else { + if (UNEXPECTED(prop_info)) { + ref_type = zend_get_prop_info_ref_type(prop_info); + if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { + zend_type old_type = Z_REFTYPE_P(value_ptr); + + if (old_type) { + if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + + HANDLE_EXCEPTION(); + } + } + } + if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { + ZVAL_DEREF(value_ptr); + zend_throw_ref_type_error(ref_type, value_ptr); + + HANDLE_EXCEPTION(); + } + } + } + zend_assign_to_variable_reference(prop, value_ptr); + if (ref_type) { + Z_REFTYPE_P(prop) = ref_type; + } + + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } + + ZEND_VM_NEXT_OPCODE_EX(1, 2); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE @@ -52557,7 +54658,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_STATIC_PROP_SPEC SAVE_OPLINE(); - result = zend_fetch_static_property_address(&value, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS OPLINE_CC EXECUTE_DATA_CC); + result = zend_fetch_static_property_address(&value, NULL, opline->extended_value & ~ZEND_ISEMPTY, BP_VAR_IS, 0 OPLINE_CC EXECUTE_DATA_CC); if (!(opline->extended_value & ZEND_ISEMPTY)) { result = result == SUCCESS && Z_TYPE_P(value) > IS_NULL && @@ -53581,7 +55682,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_CV_CV_HANDLER(ZE static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SPEC_CV_CV(binary_op_type binary_op ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE - zend_free_op free_op_data1; + zend_free_op free_op_data; zval *object; zval *property; zval *value; @@ -53599,7 +55700,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); do { - value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); + value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { if (Z_ISREF_P(object)) { @@ -53665,7 +55766,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } } while (0); - FREE_OP(free_op_data1); + FREE_OP(free_op_data); /* assign_obj has two opcodes! */ @@ -55845,7 +57946,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -55885,32 +57985,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } } @@ -55972,7 +58053,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(Z_ISERROR_P(variable_ptr))) { variable_ptr = &EG(uninitialized_zval); } else if (UNEXPECTED(Z_TYPE(variable) != IS_INDIRECT)) { - zend_throw_error(NULL, "Cannot assign by reference to overloaded object"); @@ -56012,32 +58092,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - zend_bool error = 0; if (old_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ - } - if (ZEND_TYPE_WITHOUT_NULL(old_type) != ref_type) { - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - ref_type = ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (!instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - error = 1; - } - } else { - error = 1; - } - } - if (UNEXPECTED(error) && !EG(exception)) { - zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Property and reference types %s%s and %s%s are not compatible", - ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop_info->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop_info->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop_info->type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) - ); + if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + + + + HANDLE_EXCEPTION(); } } } @@ -60439,6 +62500,131 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -62045,6 +64231,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CONST) ZEND_FAST_CONCAT_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -62369,6 +64563,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -62497,6 +64699,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -63225,6 +65435,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -63413,6 +65631,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -63489,6 +65715,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -66447,6 +68681,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CONST) ZEND_FAST_CONCAT_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -66999,6 +69241,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR) ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -67203,6 +69453,14 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED): VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -71306,6 +73564,131 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, + ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, ZEND_JMP_FORWARD_SPEC_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -72401,7 +74784,8 @@ void zend_vm_init(void) 3322 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 4488 + 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, + 4613 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -72604,7 +74988,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3598 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72612,7 +74996,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3623 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72620,7 +75004,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3648 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -72631,17 +75015,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3673 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3698 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -72652,17 +75036,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -72673,12 +75057,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -72689,12 +75073,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3973 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4098 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -72702,12 +75086,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4248 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -72715,70 +75099,70 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4398 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4441 | SPEC_RULE_OP1; + spec = 4566 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4446 | SPEC_RULE_OP1; + spec = 4571 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4423 | SPEC_RULE_RETVAL; + spec = 4548 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4425 | SPEC_RULE_RETVAL; + spec = 4550 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4427 | SPEC_RULE_RETVAL; + spec = 4552 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4429 | SPEC_RULE_RETVAL; + spec = 4554 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4431 | SPEC_RULE_RETVAL; + spec = 4556 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4433 | SPEC_RULE_RETVAL; + spec = 4558 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4435; + spec = 4560; } else if (op1_info == MAY_BE_LONG) { - spec = 4436; + spec = 4561; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4437; + spec = 4562; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4438; + spec = 4563; } else if (op1_info == MAY_BE_LONG) { - spec = 4439; + spec = 4564; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4440; + spec = 4565; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3597; + spec = 3722; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4481 | SPEC_RULE_OP1; + spec = 4606 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 4486 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -72786,12 +75170,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4451 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4476 | SPEC_RULE_OP1; + spec = 4601 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 816bdfff9e2d5..b00a106ffe4ae 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1833,493 +1833,517 @@ _(3588, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) \ _(3589, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3591, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3597, ZEND_JMP_FORWARD_SPEC) \ - _(3603, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3604, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3605, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3607, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3608, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3609, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3610, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3612, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3618, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3619, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3620, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3622, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3628, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3629, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3630, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3632, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3633, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3634, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3635, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3637, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3643, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3644, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3645, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3647, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3653, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3654, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3655, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3657, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3658, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3659, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3660, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3662, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3668, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3669, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3670, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3672, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3674, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3675, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3677, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3678, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3679, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3680, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3682, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3683, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3684, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3685, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3687, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3693, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3694, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3695, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3697, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3699, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3700, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3702, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3703, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3704, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3705, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3707, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3708, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3709, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3710, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3712, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3718, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3719, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3720, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3722, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3724, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3725, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3727, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3728, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3729, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3730, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3732, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3733, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3734, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3735, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3737, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3743, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3744, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3745, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3747, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3753, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3754, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3755, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3757, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3758, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3759, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3760, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3762, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3768, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3769, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3770, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3772, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3778, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3779, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3780, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3782, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3783, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3784, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3785, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3787, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3793, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3794, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3795, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3797, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3803, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3804, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3805, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3807, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3808, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3809, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3810, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3812, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3818, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3819, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3820, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3822, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3838, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3839, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3840, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3841, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3842, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3843, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3844, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3846, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3850, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3851, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3852, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3853, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3855, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3856, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3858, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3859, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3861, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3865, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3866, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3867, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3883, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3885, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3886, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3888, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3889, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3890, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3891, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3895, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3896, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3897, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3913, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3914, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3915, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3916, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3917, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3918, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3919, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3921, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3925, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3926, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3927, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3928, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3930, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3931, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3933, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3934, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3936, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3940, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3941, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3942, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3958, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3959, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3960, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3961, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3962, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3963, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3964, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3965, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3966, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3970, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3971, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3972, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3988, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3989, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3990, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3991, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3992, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3993, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3994, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3995, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3996, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4000, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4001, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4002, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4003, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4004, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4005, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4006, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4007, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4008, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4009, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4010, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4011, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4015, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4016, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4017, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4033, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4034, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4035, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4036, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4037, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4038, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4039, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4040, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4041, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4045, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4046, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4047, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4063, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4064, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4065, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4066, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4067, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4068, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4069, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4070, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4071, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4075, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4076, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4077, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4078, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4079, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4080, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4081, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4082, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4083, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4084, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4085, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4086, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4090, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4091, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4092, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4108, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4109, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4110, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4111, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4112, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4113, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4114, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4115, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4116, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4120, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4121, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4122, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4126, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4127, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4128, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4129, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4130, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4131, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4135, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4136, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4137, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4138, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4139, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4140, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4141, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4142, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4143, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4144, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4145, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4146, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4150, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4151, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4152, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4153, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4154, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4155, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4156, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4157, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4158, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4159, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4160, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4161, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4165, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4166, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4167, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4183, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4184, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4185, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4186, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4187, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4188, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4189, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4190, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4191, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4195, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4196, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4197, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4201, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4202, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4203, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4204, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4205, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4206, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4210, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4211, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4212, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4213, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4214, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4215, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4216, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4217, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4218, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4219, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4220, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4221, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4225, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4226, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4227, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4228, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4229, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4230, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4231, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4232, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4233, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4234, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4235, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4236, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4240, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4241, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4242, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4258, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4259, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4260, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4261, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4262, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4263, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4264, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4265, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4266, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4270, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4271, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4272, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4276, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4277, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4278, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4279, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4280, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4281, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4285, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4286, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4287, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4288, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4289, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4290, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4291, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4292, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4293, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4294, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4295, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4296, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4300, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4301, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4302, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4303, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4304, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4305, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4306, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4307, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4308, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4309, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4310, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4311, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4315, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4316, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4317, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4333, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4334, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4335, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4336, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4337, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4338, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4339, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4340, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4341, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4345, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4346, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4347, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4351, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4352, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4353, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4354, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4355, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4356, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4360, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4361, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4362, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4363, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4364, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4365, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4366, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4367, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4368, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4369, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4370, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4371, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4375, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4376, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4377, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4378, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4379, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4380, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4381, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4382, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4383, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4384, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4385, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4386, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4390, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4391, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4392, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4408, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4409, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4410, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4411, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4412, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4413, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4414, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4415, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4416, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4420, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4421, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4422, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4423, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4424, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4425, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4426, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4427, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4428, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4429, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4430, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4431, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4432, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4433, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4434, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4435, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4436, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4437, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4438, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4439, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4440, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4441, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4442, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4443, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4445, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4446, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4447, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4448, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4450, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4452, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4453, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4455, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4456, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4457, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4458, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4460, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4461, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4462, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4463, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4465, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4471, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4472, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4473, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4475, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4478, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4480, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4483, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4485, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4486, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4487, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4487+1, ZEND_NULL) + _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) \ + _(3601, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) \ + _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) \ + _(3611, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) \ + _(3614, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) \ + _(3616, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) \ + _(3624, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3626, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3634, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3636, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3639, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3641, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3649, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ + _(3651, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ + _(3659, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ + _(3661, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ + _(3664, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ + _(3666, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ + _(3699, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) \ + _(3701, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) \ + _(3709, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) \ + _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ + _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ + _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ + _(3722, ZEND_JMP_FORWARD_SPEC) \ + _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4612+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 09cfc9cc7fb33..fa478c5343db9 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[201] = { +static const char *zend_vm_opcodes_names[202] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -224,9 +224,10 @@ static const char *zend_vm_opcodes_names[201] = { "ZEND_FETCH_LIST_W", "ZEND_ASSIGN_OBJ_REF", "ZEND_ASSIGN_STATIC_PROP", + "ZEND_ASSIGN_STATIC_PROP_REF", }; -static uint32_t zend_vm_opcodes_flags[201] = { +static uint32_t zend_vm_opcodes_flags[202] = { 0x00000000, 0x00000707, 0x00000707, @@ -401,10 +402,10 @@ static uint32_t zend_vm_opcodes_flags[201] = { 0x03000000, 0x03000100, 0x00047307, + 0x00247307, 0x00047307, 0x00047307, - 0x00047307, - 0x00047307, + 0x00247307, 0x00047307, 0x00047307, 0x00067307, @@ -428,6 +429,7 @@ static uint32_t zend_vm_opcodes_flags[201] = { 0x00000701, 0x0b040751, 0x00040307, + 0x0b040307, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index bd6d2cad49ada..6429d32f3ed99 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -276,7 +276,8 @@ END_EXTERN_C() #define ZEND_FETCH_LIST_W 198 #define ZEND_ASSIGN_OBJ_REF 199 #define ZEND_ASSIGN_STATIC_PROP 200 +#define ZEND_ASSIGN_STATIC_PROP_REF 201 -#define ZEND_VM_LAST_OPCODE 200 +#define ZEND_VM_LAST_OPCODE 201 #endif diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index f61fecbef1cf1..753654938fe83 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3924,6 +3924,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; + zend_property_info *prop_info; zend_string *name; zval *prop, *def_value = NULL; @@ -3936,7 +3937,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, 1); + prop = zend_std_get_static_property(ce, name, 1, &prop_info); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3958,6 +3959,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; + zend_property_info *prop_info; zend_string *name; zval *variable_ptr, *value; @@ -3970,15 +3972,21 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, 1); + variable_ptr = zend_std_get_static_property(ce, name, 1, &prop_info); if (!variable_ptr) { zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; } ZVAL_DEREF(variable_ptr); - zval_ptr_dtor(variable_ptr); - ZVAL_COPY(variable_ptr, value); + + if (zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + zval_ptr_dtor(variable_ptr); + ZVAL_COPY(variable_ptr, value); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, value); + } + } /* }}} */ From ea586001d4d2c919c6799209b37274076f97b646 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 17:35:09 +0200 Subject: [PATCH 244/369] Fix assign to typed ref with weak type conversion Thanks to @nikic for the test --- .../typed_properties_071.phpt | 36 +++++++++++++++++++ Zend/zend_execute.h | 20 +++++++---- 2 files changed, 49 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_071.phpt diff --git a/Zend/tests/type_declarations/typed_properties_071.phpt b/Zend/tests/type_declarations/typed_properties_071.phpt new file mode 100644 index 0000000000000..4d0451cf73f71 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_071.phpt @@ -0,0 +1,36 @@ +--TEST-- +Test assignment to typed reference with weak type conversion +--FILE-- +x = &$y; +var_dump($y, $test); + +$z = 42; +$y = $z; +var_dump($y, $z, $test); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["x"]=> + string(1) "x" +} +string(1) "y" +object(Test)#1 (1) { + ["x"]=> + &string(1) "y" +} +string(2) "42" +int(42) +object(Test)#1 (1) { + ["x"]=> + &string(2) "42" +} diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index a8bbd47735843..42a7605c8d478 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -98,13 +98,19 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { - if (ZEND_CONST_COND(value_type == IS_CONST, 1)) { - ZVAL_COPY_VALUE(&tmp, value); - value = &tmp; - } - if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { - zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); - return Z_REFVAL_P(variable_ptr); + if (UNEXPECTED(Z_REFTYPE_P(variable_ptr))) { + zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); + if (need_copy) { + ZVAL_COPY(&tmp, value); + value = &tmp; + } + if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { + zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + return Z_REFVAL_P(variable_ptr); + } + if (need_copy) { + Z_TRY_DELREF_P(value); + } } variable_ptr = Z_REFVAL_P(variable_ptr); From 149fd4bee5eda4b59d1eedd199fee1d644a0b028 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 14 Jun 2018 23:58:49 +0200 Subject: [PATCH 245/369] Fix opcache for typed static properties --- ext/opcache/Optimizer/compact_literals.c | 91 ++++++++++++------------ ext/opcache/Optimizer/zend_optimizer.c | 9 +-- 2 files changed, 52 insertions(+), 48 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 60e7d5f6b4a7e..5717fa22cc5d2 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -107,7 +107,7 @@ static uint32_t add_static_slot(HashTable *hash, ret = Z_LVAL_P(pos); } else { ret = *cache_size; - *cache_size += 2 * sizeof(void *); + *cache_size += (kind == LITERAL_STATIC_PROPERTY ? 3 : 2) * sizeof(void *); ZVAL_LONG(&tmp, ret); zend_hash_add(hash, key, &tmp); } @@ -183,6 +183,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx LITERAL_INFO(opline->op2.constant, LITERAL_CLASS_CONST, 1); break; case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -191,7 +192,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: -handle_static_prop: +literals_handle_static_prop: if (opline->op2_type == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2); } @@ -243,7 +244,7 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { - goto handle_static_prop; + goto literals_handle_static_prop; } if (opline->op2_type == IS_CONST) { if (opline->extended_value == ZEND_ASSIGN_OBJ) { @@ -494,19 +495,42 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - if (opline->extended_value != ZEND_ASSIGN_OBJ) { - break; + if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + if (opline->op1_type == IS_CONST) { + // op1 static property + if (opline->op2_type == IS_CONST) { + (opline+1)->extended_value = add_static_slot(&hash, op_array, + opline->op2.constant, + opline->op1.constant, + LITERAL_STATIC_PROPERTY, + &cache_size) | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + } else { + (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + cache_size += 3 * sizeof(void *); + } + } else if (opline->op2_type == IS_CONST) { + // op2 class + if (class_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = class_slot[opline->op2.constant] | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + } else { + (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + class_slot[opline->op2.constant] = cache_size; + cache_size += sizeof(void *); + } + } } - if (opline->op2_type == IS_CONST) { - // op2 property - if (opline->op1_type == IS_UNUSED && - property_slot[opline->op2.constant] >= 0) { - (opline+1)->extended_value = property_slot[opline->op2.constant]; - } else { - (opline+1)->extended_value = cache_size; - cache_size += 3 * sizeof(void *); - if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = (opline+1)->extended_value; + if (opline->extended_value == ZEND_ASSIGN_OBJ) { + if (opline->op2_type == IS_CONST) { + // op2 property + if (opline->op1_type == IS_UNUSED && + property_slot[opline->op2.constant] >= 0) { + (opline+1)->extended_value = property_slot[opline->op2.constant]; + } else { + (opline+1)->extended_value = cache_size; + cache_size += 3 * sizeof(void *); + if (opline->op1_type == IS_UNUSED) { + property_slot[opline->op2.constant] = (opline+1)->extended_value; + } } } } @@ -637,6 +661,8 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx cache_size += 2 * sizeof(void *); } break; + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -644,29 +670,6 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - if (opline->op1_type == IS_CONST) { - // op1 static property - if (opline->op2_type == IS_CONST) { - opline->extended_value = add_static_slot(&hash, op_array, - opline->op2.constant, - opline->op1.constant, - LITERAL_STATIC_PROPERTY, - &cache_size); - } else { - opline->extended_value = cache_size; - cache_size += 2 * sizeof(void *); - } - } else if (opline->op2_type == IS_CONST) { - // op2 class - if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant]; - } else { - opline->extended_value = cache_size; - cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value; - } - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: if (opline->op1_type == IS_CONST) { // op1 static property @@ -675,19 +678,19 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & ZEND_ISEMPTY); + &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); - cache_size += 2 * sizeof(void *); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); - class_slot[opline->op2.constant] = opline->extended_value & ~ZEND_ISEMPTY; } } break; diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 877e50ff510f2..d840f4c530c6a 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -336,10 +336,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_UNSET_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && opline->extended_value + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_REF) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 2); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_REF); } break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: @@ -348,7 +348,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 2) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_ISEMPTY); } break; case ZEND_SEND_VAR: @@ -423,6 +423,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->result.num = alloc_cache_slots(op_array, 1); break; case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: @@ -435,7 +436,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF)); } break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: From bb0e169c085d4bbac3483fc38d00e510a11e0d17 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 00:24:09 +0200 Subject: [PATCH 246/369] Fix remaining tests --- Zend/zend_execute.c | 3 ++- ext/reflection/php_reflection.c | 2 +- ext/reflection/tests/ReflectionType_001.phpt | 4 ++-- 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index e4117c7ffdea3..7b28eddef5168 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2536,9 +2536,10 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval return FAILURE; } + *prop_info = property_info; + if (EXPECTED(op1_type == IS_CONST)) { CACHE_POLYMORPHIC_PTR(cache_slot, ce, *retval); - *prop_info = property_info; CACHE_PTR(cache_slot + sizeof(void *) * 2, property_info); } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 753654938fe83..92ce1054e0b81 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3980,7 +3980,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } ZVAL_DEREF(variable_ptr); - if (zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + if (!prop_info->type || zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { zval_ptr_dtor(variable_ptr); ZVAL_COPY(variable_ptr, value); } else { diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index 342306b48b24e..bdffb19a92941 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -80,7 +80,7 @@ class PropTypeTest { public int $int; public string $string; public array $arr; - public callable $callable; + public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; @@ -212,7 +212,7 @@ string(4) "Test" public int $int; public string $string; public array $arr; -public callable $callable; +public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; From ddfa19d1e5d9dcf80853166b3f328e578420c687 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 12:25:00 +0200 Subject: [PATCH 247/369] Fixing conversion with __get() on uninit typed properties Thanks @nikic for the first test --- .../typed_properties_072.phpt | 25 +++++++ .../typed_properties_073.phpt | 41 +++++++++++ .../typed_properties_074.phpt | 42 +++++++++++ Zend/zend_execute.c | 5 +- Zend/zend_execute.h | 2 + Zend/zend_object_handlers.c | 21 ++++-- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 72 +++++++++---------- 8 files changed, 169 insertions(+), 43 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_072.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_073.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_074.phpt diff --git a/Zend/tests/type_declarations/typed_properties_072.phpt b/Zend/tests/type_declarations/typed_properties_072.phpt new file mode 100644 index 0000000000000..9123bb984440b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_072.phpt @@ -0,0 +1,25 @@ +--TEST-- +Typed property must cast when used with __get() +--FILE-- +val); + +?> +--EXPECT-- +object(Test)#1 (0) { + ["val"]=> + uninitialized(int) +} +int(42) + diff --git a/Zend/tests/type_declarations/typed_properties_073.phpt b/Zend/tests/type_declarations/typed_properties_073.phpt new file mode 100644 index 0000000000000..54576ae2cabb0 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_073.phpt @@ -0,0 +1,41 @@ +--TEST-- +Typed property must cast when used with &__get() +--FILE-- +prop; + } +} + +$test = new Test; +var_dump($test); +var_dump($intval = &$test->val); +var_dump($test); + +try { + $test->prop = "x"; +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($intval); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + string(2) "42" + ["val"]=> + uninitialized(int) +} +int(42) +object(Test)#1 (1) { + ["prop"]=> + &int(42) + ["val"]=> + uninitialized(int) +} +Cannot assign string to reference of type int +int(42) diff --git a/Zend/tests/type_declarations/typed_properties_074.phpt b/Zend/tests/type_declarations/typed_properties_074.phpt new file mode 100644 index 0000000000000..baa6d9f026787 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_074.phpt @@ -0,0 +1,42 @@ +--TEST-- +Typed property must be compatible when returned via &__get() +--FILE-- +prop; + } +} + +$test = new Test; +$dummyRef = &$test->prop; +var_dump($test); +try { + var_dump($test->val); +} catch (TypeError $e) { print $e->getMessage()."\n"; } +var_dump($test); + +$test->prop = "y"; +var_dump($test->prop); + +?> +--EXPECT-- +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +Typed property Test::$val must be int, string used +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "y" + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 7b28eddef5168..8bce7de564307 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2595,7 +2595,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } -static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { +static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { if (!ZEND_TYPE_ALLOW_NULL(old_type)) { ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ } @@ -2622,6 +2622,9 @@ static zend_always_inline zend_type zend_check_typed_assign_typed_ref(const char return 0; } +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); +} static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 42a7605c8d478..02aef9e1ad44f 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -58,6 +58,8 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type); + ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info); static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_info *prop_info) { diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c9f4af5246bca..c7ce553ace35f 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -662,11 +662,24 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { - zval tmp, *val; + zval *val = retval; + zend_type old_type; - val = zend_verify_property_type(prop_info, retval, &tmp, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), retval); + if (Z_ISREF_P(val)) { + zend_type new_type = zend_get_prop_info_ref_type(prop_info); + old_type = Z_REFTYPE_P(val); + if (old_type != 0 && (new_type = zend_check_typed_assign_typed_ref("Property", old_type, new_type)) == 0) { + goto exit; + } + Z_REFTYPE_P(val) = new_type; + val = Z_REFVAL_P(val); + } + + if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { + zend_verify_property_type_error(prop_info, Z_STR_P(member), val); + if (Z_ISREF_P(retval)) { + Z_REFTYPE_P(retval) = old_type; + } } } goto exit; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 84de15cc203c2..a4fa2b936bc91 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2773,7 +2773,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2843,7 +2843,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c066e0bd24f92..04e8bf02a0aa5 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5260,7 +5260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -5323,7 +5323,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -8663,7 +8663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -8726,7 +8726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -9554,7 +9554,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -9617,7 +9617,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -15025,7 +15025,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -15088,7 +15088,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -17366,7 +17366,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -17429,7 +17429,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -18001,7 +18001,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -18064,7 +18064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -26278,7 +26278,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26386,7 +26386,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29168,7 +29168,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -29276,7 +29276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -33681,7 +33681,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33789,7 +33789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -36003,7 +36003,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -36110,7 +36110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -38195,7 +38195,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -38302,7 +38302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); @@ -41012,7 +41012,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -41119,7 +41119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -46833,7 +46833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46940,7 +46940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { @@ -47009,7 +47009,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -47072,7 +47072,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -51245,7 +51245,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -51352,7 +51352,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { zval_ptr_dtor_nogc(free_op2); @@ -52663,7 +52663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -52726,7 +52726,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -54192,7 +54192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -54255,7 +54255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { HANDLE_EXCEPTION(); } @@ -57987,7 +57987,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -58094,7 +58094,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zend_type old_type = Z_REFTYPE_P(value_ptr); if (old_type) { - if ((ref_type = zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { From 8e23778aa857b92abd4a22953f0e4c71d6b61645 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 12:34:23 +0200 Subject: [PATCH 248/369] Prevent constant propagation into ASSIGN_*_REF OP_DATA --- ext/opcache/Optimizer/zend_optimizer.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index d840f4c530c6a..5139bc5627c9b 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -255,6 +255,14 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, zval *val) { switch (opline->opcode) { + case ZEND_OP_DATA: + switch ((opline-1)->opcode) { + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP_REF: + return 0; + } + opline->op1.constant = zend_optimizer_add_literal(op_array, val); + break; case ZEND_FREE: case ZEND_CHECK_VAR: MAKE_NOP(opline); From fffb439ffc4399332956f561dd68797b2cda1212 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 15 Jun 2018 14:29:21 +0200 Subject: [PATCH 249/369] Add ZEND_PRE/POST_INC/DEC_STATIC_PROP --- .../typed_properties_075.phpt | 52 + Zend/zend_compile.c | 7 + Zend/zend_execute.c | 129 + Zend/zend_vm_def.h | 204 +- Zend/zend_vm_execute.h | 2258 +++++++---------- Zend/zend_vm_handlers.h | 1028 ++++---- Zend/zend_vm_opcodes.c | 12 +- Zend/zend_vm_opcodes.h | 6 +- ext/opcache/Optimizer/compact_literals.c | 8 + ext/opcache/Optimizer/zend_optimizer.c | 31 +- 10 files changed, 1795 insertions(+), 1940 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_075.phpt diff --git a/Zend/tests/type_declarations/typed_properties_075.phpt b/Zend/tests/type_declarations/typed_properties_075.phpt new file mode 100644 index 0000000000000..7ade931f33073 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_075.phpt @@ -0,0 +1,52 @@ +--TEST-- +Test typed properties overflowing +--FILE-- +getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar += 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + ++Foo::$bar; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +try { + Foo::$bar = Foo::$bar + 1; +} catch(TypeError $t) { + var_dump($t->getMessage()); +} + +var_dump(Foo::$bar); + +?> +--EXPECTF-- +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) +string(48) "Typed property Foo::$bar must be int, float used" +int(9223372036854775807) + diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index b9dd71185a8ed..27359fc64dac2 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -7349,6 +7349,10 @@ void zend_compile_post_incdec(znode *result, zend_ast *ast) /* {{{ */ zend_op *opline = zend_compile_prop(NULL, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_OBJ : ZEND_POST_DEC_OBJ; zend_make_tmp_result(result, opline); + } else if (var_ast->kind == ZEND_AST_STATIC_PROP) { + zend_op *opline = zend_compile_static_prop(NULL, var_ast, BP_VAR_RW, 0, 0); + opline->opcode = ast->kind == ZEND_AST_POST_INC ? ZEND_POST_INC_STATIC_PROP : ZEND_POST_DEC_STATIC_PROP; + zend_make_tmp_result(result, opline); } else { znode var_node; zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); @@ -7368,6 +7372,9 @@ void zend_compile_pre_incdec(znode *result, zend_ast *ast) /* {{{ */ if (var_ast->kind == ZEND_AST_PROP) { zend_op *opline = zend_compile_prop(result, var_ast, BP_VAR_RW, 0); opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_OBJ : ZEND_PRE_DEC_OBJ; + } else if (var_ast->kind == ZEND_AST_STATIC_PROP) { + zend_op *opline = zend_compile_static_prop(result, var_ast, BP_VAR_RW, 0, 0); + opline->opcode = ast->kind == ZEND_AST_PRE_INC ? ZEND_PRE_INC_STATIC_PROP : ZEND_PRE_DEC_STATIC_PROP; } else { znode var_node; zend_compile_var(&var_node, var_ast, BP_VAR_RW, 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 8bce7de564307..4fc382ffeb6ed 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1607,6 +1607,135 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } } +static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } + } else { + zend_type ref_type = 0; + if (Z_ISREF_P(prop)) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_COPY(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + } + } else { + SEPARATE_ZVAL_NOREF(prop); + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_COPY(EX_VAR(opline->result.var), prop); + } +} + +static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) +{ + if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { + ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(prop)); + if (inc) { + fast_long_increment_function(prop); + } else { + fast_long_decrement_function(prop); + } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG)) { + if (UNEXPECTED(prop_info)) { + zval tmp, *val; + + val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, prop_info->name, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); + } + } + } + } + } else { + zend_type ref_type = 0; + if (Z_ISREF_P(prop)) { + ref_type = Z_REFTYPE_P(prop); + prop = Z_REFVAL_P(prop); + } + + ZVAL_COPY_VALUE(EX_VAR(opline->result.var), prop); + + if (UNEXPECTED(ref_type || prop_info)) { + /* special case for typed properties */ + zval z_copy; + + ZVAL_DUP(&z_copy, prop); + if (inc) { + increment_function(&z_copy); + } else { + decrement_function(&z_copy); + } + if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + zval_ptr_dtor(prop); + ZVAL_COPY_VALUE(prop, &z_copy); + } else { + if (ref_type) { + zend_throw_ref_type_error(ref_type, &z_copy); + } else { + zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + } + zval_ptr_dtor(&z_copy); + Z_TRY_ADDREF_P(prop); /* we copied by value into result.var */ + } + } else { + zval_opt_copy_ctor(prop); + if (inc) { + increment_function(prop); + } else { + decrement_function(prop); + } + } + } +} + static zend_never_inline void zend_post_incdec_overloaded_property(zval *object, zval *property, void **cache_slot, int inc OPLINE_DC EXECUTE_DATA_DC) { if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index a4fa2b936bc91..9c11bf1818d22 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1241,77 +1241,12 @@ ZEND_VM_C_LABEL(pre_incdec_object): ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -1373,78 +1308,13 @@ ZEND_VM_C_LABEL(post_incdec_object): if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -1466,6 +1336,62 @@ ZEND_VM_HANDLER(135, ZEND_POST_DEC_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CAC ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_property_helper, inc, 0); } +ZEND_VM_HELPER(zend_pre_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(202, ZEND_PRE_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(203, ZEND_PRE_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_pre_incdec_static_property_helper, inc, 0); +} + +ZEND_VM_HELPER(zend_post_incdec_static_property_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, int inc) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +ZEND_VM_HANDLER(204, ZEND_POST_INC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 1); +} + +ZEND_VM_HANDLER(205, ZEND_POST_DEC_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT) +{ + ZEND_VM_DISPATCH_TO_HELPER(zend_post_incdec_static_property_helper, inc, 0); +} + ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) { USE_OPLINE diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 04e8bf02a0aa5..758e22fab821c 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4673,6 +4673,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_CONST_ST ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_CONST_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -8361,6 +8417,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(Z ZEND_VM_RETURN(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CONST_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -9118,6 +9230,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_S ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CONST_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CONST_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -14479,6 +14647,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -17064,6 +17288,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TM ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_TMPVAR_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -17580,6 +17860,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HAN ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_TMPVAR_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMPVAR_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -24841,77 +25177,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -24972,78 +25243,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -27784,77 +27990,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -27916,78 +28057,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -32196,77 +32272,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -32327,78 +32338,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34865,77 +34811,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34996,78 +34877,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -37053,77 +36869,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -37185,78 +36936,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -39874,77 +39560,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -40005,78 +39626,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -44886,77 +44442,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -45017,78 +44508,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -45109,6 +44535,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HAN ZEND_VM_TAIL_CALL(zend_post_incdec_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_CONST(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_CONST(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_CONST(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -49615,77 +49097,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -49747,78 +49164,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -52256,6 +51608,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_H ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_VAR(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_VAR(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_CV_VAR(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -53372,6 +52780,62 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STAT ZEND_VM_TAIL_CALL(zend_binary_assign_op_helper_SPEC_CV_UNUSED_STATIC_PROP(pow_function ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); } +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_pre_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_pre_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(int inc ZEND_OPCODE_HANDLER_ARGS_DC) +{ + USE_OPLINE + zval *prop; + zend_property_info *prop_info; + + SAVE_OPLINE(); + + if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value, BP_VAR_RW, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } + + zend_post_incdec_property_zval(prop, prop_info->type ? prop_info : NULL, inc OPLINE_CC EXECUTE_DATA_CC); + + ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(1 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +{ + ZEND_VM_TAIL_CALL(zend_post_incdec_static_property_helper_SPEC_CV_UNUSED(0 ZEND_OPCODE_HANDLER_ARGS_PASSTHRU_CC)); +} + static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type ZEND_OPCODE_HANDLER_ARGS_DC) { USE_OPLINE @@ -56258,77 +55722,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_COPY(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - } - } else { - SEPARATE_ZVAL_NOREF(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } - } - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), zptr); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_pre_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -56389,78 +55788,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (UNEXPECTED(Z_ISERROR_P(zptr))) { ZVAL_NULL(EX_VAR(opline->result.var)); } else { - if (EXPECTED(Z_TYPE_P(zptr) == IS_LONG)) { - ZVAL_LONG(EX_VAR(opline->result.var), Z_LVAL_P(zptr)); - if (inc) { - fast_long_increment_function(zptr); - } else { - fast_long_decrement_function(zptr); - } - if (UNEXPECTED(Z_TYPE_P(zptr) != IS_LONG)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, zptr, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), zptr); - if (inc) { - ZVAL_LONG(zptr, ZEND_LONG_MAX); - } else { - ZVAL_LONG(zptr, ZEND_LONG_MIN); - } - } - } - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - zend_type ref_type = 0; - if (Z_ISREF_P(zptr)) { - ref_type = Z_REFTYPE_P(zptr); - zptr = Z_REFVAL_P(zptr); - } - - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), zptr); - - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); - } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); - } - if (UNEXPECTED(ref_type || prop_info)) { - /* special case for typed properties */ - zval z_copy; - - ZVAL_DUP(&z_copy, zptr); - if (inc) { - increment_function(&z_copy); - } else { - decrement_function(&z_copy); - } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { - zval_ptr_dtor(zptr); - ZVAL_COPY_VALUE(zptr, &z_copy); - } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); - } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); - } - zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(zptr); /* we copied by value into result.var */ - } - } else { - zval_opt_copy_ctor(zptr); - if (inc) { - increment_function(zptr); - } else { - decrement_function(zptr); - } - } + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } + + zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } } else { zend_post_incdec_overloaded_property(object, property, cache_slot, inc OPLINE_CC EXECUTE_DATA_CC); @@ -62625,6 +61959,106 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_LABEL, + (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_LABEL, + (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_JMP_FORWARD_SPEC_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -64163,6 +63597,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CONST_CONST_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -64523,6 +63973,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_YIELD_SPEC_CONST_TMP) ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -64631,6 +64097,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CONST_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CONST_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CONST_UNUSED) ZEND_FETCH_R_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65379,6 +64861,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_BOOL_XOR_SPEC_TMPVAR_CONST) ZEND_BOOL_XOR_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65591,6 +65089,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR) ZEND_ISSET_ISEMPTY_PROP_OBJ_SPEC_TMPVAR_TMPVAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -65651,6 +65165,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_INSTANCEOF_SPEC_TMPVAR_VAR) ZEND_INSTANCEOF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_TMPVAR_UNUSED) ZEND_FETCH_R_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -68541,6 +68071,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_POST_DEC_OBJ_SPEC_CV_CONST) ZEND_POST_DEC_OBJ_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -69189,6 +68735,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR) ZEND_IS_NOT_IDENTICAL_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR): VM_TRACE(ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR) ZEND_FETCH_STATIC_PROP_R_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -69361,6 +68923,22 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP) ZEND_ASSIGN_POW_SPEC_CV_UNUSED_STATIC_PROP_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); + HYBRID_CASE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED): + VM_TRACE(ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_BREAK(); HYBRID_CASE(ZEND_FETCH_R_SPEC_CV_UNUSED): VM_TRACE(ZEND_FETCH_R_SPEC_CV_UNUSED) ZEND_FETCH_R_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); @@ -73689,6 +73267,106 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST_HANDLER, + ZEND_NULL_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR_HANDLER, + ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED_HANDLER, + ZEND_NULL_HANDLER, ZEND_JMP_FORWARD_SPEC_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, @@ -74785,7 +74463,11 @@ void zend_vm_init(void) 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 4613 + 3722 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3747 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3772 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3797 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4713 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -74988,7 +74670,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74996,7 +74678,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -75004,7 +74686,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -75015,17 +74697,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -75036,17 +74718,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3973 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3998 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -75057,12 +74739,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -75073,12 +74755,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4098 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -75086,12 +74768,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4248 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4423 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -75099,70 +74781,70 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4398 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4498 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4573 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4566 | SPEC_RULE_OP1; + spec = 4666 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4571 | SPEC_RULE_OP1; + spec = 4671 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4548 | SPEC_RULE_RETVAL; + spec = 4648 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4550 | SPEC_RULE_RETVAL; + spec = 4650 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4552 | SPEC_RULE_RETVAL; + spec = 4652 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4554 | SPEC_RULE_RETVAL; + spec = 4654 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4556 | SPEC_RULE_RETVAL; + spec = 4656 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4558 | SPEC_RULE_RETVAL; + spec = 4658 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4560; + spec = 4660; } else if (op1_info == MAY_BE_LONG) { - spec = 4561; + spec = 4661; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4562; + spec = 4662; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4563; + spec = 4663; } else if (op1_info == MAY_BE_LONG) { - spec = 4564; + spec = 4664; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4565; + spec = 4665; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3722; + spec = 3822; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4606 | SPEC_RULE_OP1; + spec = 4706 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 4611 | SPEC_RULE_RETVAL; + spec = 4711 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -75170,12 +74852,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4676 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4601 | SPEC_RULE_OP1; + spec = 4701 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index b00a106ffe4ae..7221718470066 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1857,493 +1857,541 @@ _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3722, ZEND_JMP_FORWARD_SPEC) \ - _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4612+1, ZEND_NULL) + _(3722, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3724, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3725, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3727, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3729, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3730, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3732, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3734, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3735, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3742, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3744, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3745, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3747, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3749, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3750, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3752, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3754, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3755, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3757, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3759, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3760, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3767, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3769, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3770, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3772, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3774, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3775, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3777, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3779, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3780, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3782, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3784, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3785, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3792, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3794, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3795, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3797, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3799, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3800, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3802, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3804, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3805, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3807, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3809, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3810, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3817, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3819, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3820, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3822, ZEND_JMP_FORWARD_SPEC) \ + _(3828, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3853, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3899, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3900, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3902, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3903, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3924, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3925, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3927, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3928, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3949, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3950, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3952, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3953, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3954, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3955, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3957, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3958, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3959, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3960, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3962, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3968, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3969, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3972, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3978, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3980, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3983, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3984, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3987, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3993, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3994, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3995, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3997, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(4003, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4004, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4005, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4007, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4008, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4010, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4018, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(4019, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4020, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4022, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4028, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4029, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4030, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4032, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4033, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4034, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4035, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4037, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4043, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4044, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4047, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4063, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4064, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4065, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4066, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4067, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4068, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4069, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4070, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4071, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4075, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4076, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4077, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4078, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4079, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4080, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4081, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4082, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4083, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4084, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4085, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4086, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4090, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4091, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4092, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4108, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4109, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4110, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4111, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4112, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4113, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4114, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4115, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4116, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4120, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4121, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4122, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4138, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4139, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4140, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4141, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4142, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4143, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4144, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4145, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4146, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4150, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4151, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4152, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4153, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4154, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4155, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4156, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4157, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4158, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4159, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4160, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4161, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4165, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4166, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4167, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4183, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4184, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4185, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4186, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4187, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4188, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4189, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4190, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4191, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4195, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4196, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4197, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4213, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4214, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4215, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4216, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4217, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4218, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4219, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4220, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4221, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4225, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4226, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4227, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4228, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4229, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4230, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4231, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4232, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4233, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4234, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4235, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4236, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4240, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4241, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4242, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4258, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4259, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4260, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4261, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4262, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4263, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4264, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4265, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4266, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4270, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4271, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4272, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4288, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4289, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4290, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4291, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4292, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4293, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4294, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4295, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4296, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4300, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4301, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4302, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4303, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4304, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4305, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4306, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4307, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4308, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4309, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4310, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4311, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4315, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4316, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4317, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4333, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4334, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4335, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4336, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4337, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4338, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4339, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4340, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4341, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4345, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4346, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4347, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4351, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4352, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4353, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4354, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4355, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4356, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4360, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4361, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4362, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4363, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4364, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4365, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4366, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4367, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4368, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4369, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4370, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4371, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4375, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4376, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4377, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4378, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4379, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4380, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4381, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4382, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4383, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4384, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4385, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4386, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4390, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4391, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4392, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4408, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4409, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4410, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4411, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4412, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4413, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4414, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4415, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4416, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4420, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4421, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4422, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4426, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4427, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4428, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4429, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4430, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4431, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4435, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4436, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4437, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4438, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4439, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4440, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4441, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4442, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4443, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4444, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4445, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4446, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4450, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4451, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4452, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4453, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4454, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4455, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4456, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4457, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4458, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4459, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4460, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4461, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4465, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4466, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4467, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4483, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4484, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4485, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4486, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4487, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4488, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4489, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4490, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4491, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4495, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4496, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4497, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4512, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4513, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4514, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4518, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4519, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4520, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4521, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4525, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4526, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4527, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4528, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4529, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4530, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4531, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4532, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4542, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4558, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4559, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4560, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4561, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4562, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4563, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4564, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4565, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4566, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4570, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4571, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4572, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4576, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4577, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4578, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4579, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4581, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4585, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4586, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4587, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4588, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4589, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4590, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4591, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4592, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4593, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4594, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4595, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4596, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4600, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4601, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4602, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4603, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4604, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4605, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4606, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4607, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4608, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4609, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4610, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4611, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4615, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4616, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4617, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4633, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4634, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4635, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4636, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4637, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4638, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4639, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4640, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4641, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4645, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4646, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4647, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4648, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4649, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4650, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4651, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4652, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4653, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4654, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4655, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4656, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4657, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4658, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4659, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4660, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4661, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4662, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4663, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4664, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4665, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4666, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4667, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4668, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4670, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4671, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4672, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4673, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4675, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4677, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4678, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4680, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4681, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4682, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4683, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4685, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4686, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4687, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4688, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4690, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4696, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4697, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4698, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4700, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4703, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4705, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4708, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4710, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4711, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4712, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4712+1, ZEND_NULL) diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index fa478c5343db9..19c8b2e9d70b4 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -22,7 +22,7 @@ #include #include -static const char *zend_vm_opcodes_names[202] = { +static const char *zend_vm_opcodes_names[206] = { "ZEND_NOP", "ZEND_ADD", "ZEND_SUB", @@ -225,9 +225,13 @@ static const char *zend_vm_opcodes_names[202] = { "ZEND_ASSIGN_OBJ_REF", "ZEND_ASSIGN_STATIC_PROP", "ZEND_ASSIGN_STATIC_PROP_REF", + "ZEND_PRE_INC_STATIC_PROP", + "ZEND_PRE_DEC_STATIC_PROP", + "ZEND_POST_INC_STATIC_PROP", + "ZEND_POST_DEC_STATIC_PROP", }; -static uint32_t zend_vm_opcodes_flags[202] = { +static uint32_t zend_vm_opcodes_flags[206] = { 0x00000000, 0x00000707, 0x00000707, @@ -430,6 +434,10 @@ static uint32_t zend_vm_opcodes_flags[202] = { 0x0b040751, 0x00040307, 0x0b040307, + 0x00040307, + 0x00040307, + 0x00040307, + 0x00040307, }; ZEND_API const char* ZEND_FASTCALL zend_get_opcode_name(zend_uchar opcode) { diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index 6429d32f3ed99..de2607e4cc2cd 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -277,7 +277,11 @@ END_EXTERN_C() #define ZEND_ASSIGN_OBJ_REF 199 #define ZEND_ASSIGN_STATIC_PROP 200 #define ZEND_ASSIGN_STATIC_PROP_REF 201 +#define ZEND_PRE_INC_STATIC_PROP 202 +#define ZEND_PRE_DEC_STATIC_PROP 203 +#define ZEND_POST_INC_STATIC_PROP 204 +#define ZEND_POST_DEC_STATIC_PROP 205 -#define ZEND_VM_LAST_OPCODE 201 +#define ZEND_VM_LAST_OPCODE 205 #endif diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 5717fa22cc5d2..a16cd873925a0 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -192,6 +192,10 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: literals_handle_static_prop: if (opline->op2_type == IS_CONST) { LITERAL_INFO(opline->op2.constant, LITERAL_CLASS, 2); @@ -671,6 +675,10 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: if (opline->op1_type == IS_CONST) { // op1 static property if (opline->op2_type == IS_CONST) { diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 5139bc5627c9b..880bbc0ae0b74 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -342,21 +342,17 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - TO_STRING_NOWARN(val); - opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_REF) + sizeof(void*) == op_array->cache_size) { - op_array->cache_size += sizeof(void *); - } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_REF); - } - break; case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_ISEMPTY) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); } break; case ZEND_SEND_VAR: @@ -439,22 +435,17 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, case ZEND_FETCH_STATIC_PROP_UNSET: case ZEND_FETCH_STATIC_PROP_FUNC_ARG: case ZEND_UNSET_STATIC_PROP: - REQUIRES_STRING(val); - drop_leading_backslash(val); - opline->op2.constant = zend_optimizer_add_literal(op_array, val); - zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); - if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF)); - } - break; - case ZEND_ISSET_ISEMPTY_STATIC_PROP: + case ZEND_PRE_INC_STATIC_PROP: + case ZEND_PRE_DEC_STATIC_PROP: + case ZEND_POST_INC_STATIC_PROP: + case ZEND_POST_DEC_STATIC_PROP: handle_static_prop: REQUIRES_STRING(val); drop_leading_backslash(val); opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & ZEND_ISEMPTY); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF | ZEND_ISEMPTY)); } break; case ZEND_INIT_FCALL: From 17bdcef09649c35d78d6135ce77897a070403999 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 16:31:13 +0200 Subject: [PATCH 250/369] Property compute intersection types for $obj->prop =& $ref Test currently fails due to unrelated leaks. --- Zend/zend_execute.c | 92 ++++++++++++++++++++++++++++++++++++++++----- 1 file changed, 82 insertions(+), 10 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4fc382ffeb6ed..002880ab4789a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2724,21 +2724,93 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { ); } -static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - if (!ZEND_TYPE_ALLOW_NULL(old_type)) { - ref_type = ZEND_TYPE_WITHOUT_NULL(ref_type); /* remove allow_null if not allowed on assigned reference */ +static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { + zend_type tmp = *type1; + *type1 = *type2; + *type2 = tmp; +} + +/* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection + * currently not representable. */ +static zend_type compute_intersection_type(zend_type type1, zend_type type2) { + ZEND_ASSERT(ZEND_TYPE_IS_SET(type1) && ZEND_TYPE_IS_SET(type2)); + if (type1 == type2) { + return type1; } - if (ZEND_TYPE_WITHOUT_NULL(old_type) == ref_type) { - return ref_type; + + /* Intersection is nullable only if both are nullable. */ + if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { + type1 = ZEND_TYPE_WITHOUT_NULL(type1); + type2 = ZEND_TYPE_WITHOUT_NULL(type2); } - if (ZEND_TYPE_IS_CLASS(ref_type) && ZEND_TYPE_IS_CLASS(old_type)) { - if (instanceof_function(ZEND_TYPE_CE(ref_type), ZEND_TYPE_CE(old_type))) { - return ZEND_TYPE_ALLOW_NULL(ref_type) ? old_type : ZEND_TYPE_WITHOUT_NULL(old_type); - } else if (instanceof_function(ZEND_TYPE_CE(old_type), ZEND_TYPE_CE(ref_type))) { - return ref_type; + + /* For class types, we can only handle cases where one type is a child of the other. + * Anything else would require full intersection types. */ + if (ZEND_TYPE_IS_CLASS(type1) && ZEND_TYPE_IS_CLASS(type2)) { + if (instanceof_function(ZEND_TYPE_CE(type1), ZEND_TYPE_CE(type2))) { + return type1; + } else if (instanceof_function(ZEND_TYPE_CE(type2), ZEND_TYPE_CE(type1))) { + return type2; } + return 0; + } + + if (ZEND_TYPE_IS_CODE(type1) && ZEND_TYPE_IS_CODE(type2)) { + if (ZEND_TYPE_CODE(type1) == ZEND_TYPE_CODE(type2)) { + return type1; + } + + /* Make sure the smaller code is on the left. */ + if (ZEND_TYPE_CODE(type1) > ZEND_TYPE_CODE(type2)) { + swap_types(&type1, &type2); + } + } + + /* Make sure class type (if any) is on the right. */ + if (ZEND_TYPE_IS_CLASS(type1)) { + swap_types(&type1, &type2); + } + + ZEND_ASSERT(ZEND_TYPE_IS_CODE(type1)); + switch (ZEND_TYPE_CODE(type1)) { + case _IS_BOOL: + case IS_LONG: + case IS_DOUBLE: + case IS_STRING: + break; + case IS_OBJECT: + if (ZEND_TYPE_IS_CLASS(type2)) { + return type2; + } + break; + case IS_ARRAY: + if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { + return type1; + } + break; + case IS_ITERABLE: + if (ZEND_TYPE_IS_CLASS(type2) && + instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { + return type2; + } + break; + default: + ZEND_ASSERT(0); + break; + } + + /* Intersection is empty */ + return ZEND_TYPE_ENCODE(IS_VOID, 0); +} + +static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { + zend_type intersect_type = compute_intersection_type(old_type, ref_type); + if (EXPECTED(intersect_type != 0 && intersect_type != ZEND_TYPE_ENCODE(IS_VOID, 0))) { + return intersect_type; } + /* TODO(typed_refs) Throw different errors for "intersection illegal" and "can't represent + * intersection" cases? */ zend_throw_exception_ex( zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), "%s and reference types %s%s and %s%s are not compatible", From 40079bf7d045c7be2d67df754141f72e827d45f9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 16:49:52 +0200 Subject: [PATCH 251/369] Add missing test file... --- .../typed_properties_076.phpt | 70 +++++++++++++++++++ Zend/zend_execute.c | 13 ++-- 2 files changed, 78 insertions(+), 5 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_076.phpt diff --git a/Zend/tests/type_declarations/typed_properties_076.phpt b/Zend/tests/type_declarations/typed_properties_076.phpt new file mode 100644 index 0000000000000..93a8585cdd8be --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_076.phpt @@ -0,0 +1,70 @@ +--TEST-- +Computation of intersection types for typed reference to typed property assignments +--FILE-- +$prop2 = $value; + $test->$prop1 =& $test->$prop2; + echo "Invalid assignment $prop1 =& $prop2 did not error\n"; + } catch (TypeError $e) {} + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + echo "Invalid assignment $prop2 =& $prop1 did not error\n"; + } catch (TypeError $e) {} +} + +function valid(Test $test, string $prop1, string $prop2, $value) { + try { + $test->$prop2 = $value; + $test->$prop1 =& $test->$prop2; + } catch (TypeError $e) { + echo "Valid assignment $prop1 =& $prop2 threw {$e->getMessage()}\n"; + } + try { + $test->$prop1 = $value; + $test->$prop2 =& $test->$prop1; + } catch (TypeError $e) { + echo "Valid assignment $prop2 =& $prop1 threw {$e->getMessage()}\n"; + } +} + +$test = new Test; +invalid($test, 'int', 'float', 42.0); +valid($test, 'int', 'nint', 42); +invalid($test, 'int', 'nint', null); +invalid($test, 'nint', 'nstring', null); +valid($test, 'A', 'A', new A); +valid($test, 'A', 'B', new B); +invalid($test, 'A', 'B', new A); +valid($test, 'iterable', 'array', [1, 2, 3]); +valid($test, 'A', 'object', new A); +invalid($test, 'A', 'object', new Test); +valid($test, 'iterable', 'Iterator', new ArrayIterator); +invalid($test, 'Iterator', 'iterable', [1, 2, 3]); +valid($test, 'object', 'iterable', new ArrayIterator); +invalid($test, 'iterable', 'object', new stdClass); + +echo "Done\n"; + +?> +--EXPECT-- +Done diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 002880ab4789a..54ceca4808ad1 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2778,21 +2778,24 @@ static zend_type compute_intersection_type(zend_type type1, zend_type type2) { case IS_DOUBLE: case IS_STRING: break; - case IS_OBJECT: - if (ZEND_TYPE_IS_CLASS(type2)) { - return type2; - } - break; case IS_ARRAY: if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { return type1; } break; + case IS_OBJECT: + if (ZEND_TYPE_IS_CLASS(type2)) { + return type2; + } + break; case IS_ITERABLE: if (ZEND_TYPE_IS_CLASS(type2) && instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { return type2; } + if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_OBJECT) { + return ZEND_TYPE_ENCODE_CLASS(zend_ce_traversable, ZEND_TYPE_ALLOW_NULL(type1)); + } break; default: ZEND_ASSERT(0); From bc900ead6646ca8f1237c877575063c386f51806 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 15 Jun 2018 18:43:45 +0200 Subject: [PATCH 252/369] Fix leak --- Zend/zend_execute.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 02aef9e1ad44f..48876a0a8cb97 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -108,6 +108,9 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + if (need_copy) { + Z_TRY_DELREF_P(value); + } return Z_REFVAL_P(variable_ptr); } if (need_copy) { From a450c28534fc465bcc833ad3ecfc5fa6a735cf97 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 16 Jun 2018 18:40:50 +0200 Subject: [PATCH 253/369] $a->b = $c must return (string) $c if $a->b is of type string --- .../typed_properties_077.phpt | 18 +++ Zend/zend_object_handlers.c | 9 +- Zend/zend_object_handlers.h | 5 +- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 144 +++++++++--------- ext/date/php_date.c | 21 ++- ext/dom/php_dom.c | 6 +- .../transliterator/transliterator_class.c | 7 +- ext/mysqli/mysqli.c | 6 +- ext/reflection/php_reflection.c | 5 +- ext/simplexml/simplexml.c | 27 ++-- ext/snmp/snmp.c | 6 +- ext/spl/spl_array.c | 6 +- ext/standard/incomplete_class.c | 3 +- ext/xmlreader/php_xmlreader.c | 6 +- 15 files changed, 158 insertions(+), 115 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_077.phpt diff --git a/Zend/tests/type_declarations/typed_properties_077.phpt b/Zend/tests/type_declarations/typed_properties_077.phpt new file mode 100644 index 0000000000000..4e2640338f46b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_077.phpt @@ -0,0 +1,18 @@ +--TEST-- +Converted values shall be returned and not the original value upon property assignment +--FILE-- +i = "42"); +var_dump($test->s = 42); + +?> +--EXPECT-- +int(42) +string(2) "42" diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index c7ce553ace35f..da3fabb7b8a44 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -716,7 +716,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } /* }}} */ -ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { zend_object *zobj; zval tmp_member; @@ -744,6 +744,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + value = &EG(error_zval); goto exit; } value = val; @@ -765,6 +766,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } } } else if (UNEXPECTED(EG(exception))) { + value = &EG(error_zval); goto exit; } @@ -772,7 +774,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (zobj->ce->__set) { uint32_t *guard = zend_get_property_guard(zobj, Z_STR_P(member)); - if (!((*guard) & IN_SET)) { + if (!((*guard) & IN_SET)) { zval tmp_object; ZVAL_COPY(&tmp_object, object); @@ -785,6 +787,7 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v } else { if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) { zend_throw_error(NULL, "Cannot access property started with '\\0'"); + value = &EG(error_zval); goto exit; } } @@ -827,6 +830,8 @@ ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, v if (UNEXPECTED(Z_REFCOUNTED(tmp_member))) { zval_ptr_dtor(&tmp_member); } + + return value; } /* }}} */ diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 0521b11c861ec..14a2fc524ce11 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -53,9 +53,10 @@ typedef zval *(*zend_object_read_dimension_t)(zval *object, zval *offset, int ty If you receive a value zval in write_property/write_dimension, you may only modify it if its reference count is 1. Otherwise, you must create a copy of that zval before making any changes. You should NOT modify the reference count of the value passed to you. + You must return the final value of the assigned property. */ /* Used to set property of the object */ -typedef void (*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot); +typedef zval *(*zend_object_write_property_t)(zval *object, zval *member, zval *value, void **cache_slot); /* Used to set dimension of the object */ typedef void (*zend_object_write_dimension_t)(zval *object, zval *offset, zval *value); @@ -184,7 +185,7 @@ ZEND_API HashTable *zend_std_get_debug_info(zval *object, int *is_temp); ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int type); ZEND_API zval *zend_std_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -ZEND_API void zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); +ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, void **cache_slot); ZEND_API int zend_std_has_property(zval *object, zval *member, int has_set_exists, void **cache_slot); ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_slot); ZEND_API zval *zend_std_read_dimension(zval *object, zval *offset, int type, zval *rv); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 9c11bf1818d22..6f1a007d00d38 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2395,10 +2395,10 @@ ZEND_VM_C_LABEL(fast_assign_obj): ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } FREE_OP_DATA(); ZEND_VM_C_LABEL(exit_assign_obj): diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 758e22fab821c..3165502f2ffeb 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -25568,10 +25568,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -25709,10 +25709,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25850,10 +25850,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -25991,10 +25991,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -28384,10 +28384,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -28525,10 +28525,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -28666,10 +28666,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -28807,10 +28807,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -32663,10 +32663,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -32804,10 +32804,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -32945,10 +32945,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -33086,10 +33086,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35309,10 +35309,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -35450,10 +35450,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35591,10 +35591,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -35732,10 +35732,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -37371,10 +37371,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -37512,10 +37512,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -37653,10 +37653,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -37794,10 +37794,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -40058,10 +40058,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -40199,10 +40199,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -40340,10 +40340,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -40481,10 +40481,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -45191,10 +45191,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -45332,10 +45332,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -45473,10 +45473,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -45614,10 +45614,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49737,10 +49737,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -49878,10 +49878,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -50019,10 +50019,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -50160,10 +50160,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, ((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -56357,10 +56357,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: @@ -56498,10 +56498,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -56639,10 +56639,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } zval_ptr_dtor_nogc(free_op_data); exit_assign_obj: @@ -56780,10 +56780,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ ZVAL_DEREF(value); } - Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); + property = Z_OBJ_HT_P(object)->write_property(object, property, value, (IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value) : NULL); if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), value); + ZVAL_COPY(EX_VAR(opline->result.var), property); } exit_assign_obj: diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 0b8130ac7efd6..84579b5a09e1c 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -680,10 +680,10 @@ static HashTable *date_object_get_debug_info_timezone(zval *object, int *is_temp static void php_timezone_to_string(php_timezone_obj *tzobj, zval *zv); zval *date_interval_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot); static zval *date_interval_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot); static zval *date_period_read_property(zval *object, zval *member, int type, void **cache_slot, zval *rv); -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot); /* {{{ Module struct */ zend_module_entry date_module_entry = { @@ -4211,7 +4211,7 @@ zval *date_interval_read_property(zval *object, zval *member, int type, void **c /* }}} */ /* {{{ date_interval_write_property */ -void date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *date_interval_write_property(zval *object, zval *member, zval *value, void **cache_slot) { php_interval_obj *obj; zval tmp_member; @@ -4225,17 +4225,18 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void obj = Z_PHPINTERVAL_P(object); if (!obj->initialized) { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); if (member == &tmp_member) { zval_dtor(member); } - return; + return value; } #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ obj->diff->n = zval_get_long(value); \ - break; \ + ZVAL_LONG(value, obj->diff->n); \ + break; \ } do { @@ -4247,16 +4248,19 @@ void date_interval_write_property(zval *object, zval *member, zval *value, void SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { obj->diff->us = zval_get_double(value) * 1000000; + ZVAL_LONG(value, obj->diff->us); break; } SET_VALUE_FROM_STRUCT(invert, "invert"); /* didn't find any */ - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } while(0); if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ @@ -5296,9 +5300,10 @@ static zval *date_period_read_property(zval *object, zval *member, int type, voi /* }}} */ /* {{{ date_period_write_property */ -static void date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *date_period_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zend_throw_error(NULL, "Writing to DatePeriod properties is unsupported"); + return value; } /* }}} */ diff --git a/ext/dom/php_dom.c b/ext/dom/php_dom.c index a9220863d2fb1..10b35f04a8016 100644 --- a/ext/dom/php_dom.c +++ b/ext/dom/php_dom.c @@ -358,7 +358,7 @@ zval *dom_read_property(zval *object, zval *member, int type, void **cache_slot, /* }}} */ /* {{{ dom_write_property */ -void dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *dom_write_property(zval *object, zval *member, zval *value, void **cache_slot) { dom_object *obj = Z_DOMOBJ_P(object); zend_string *member_str = zval_get_string(member); @@ -370,10 +370,12 @@ void dom_write_property(zval *object, zval *member, zval *value, void **cache_sl if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } zend_string_release_ex(member_str, 0); + + return value; } /* }}} */ diff --git a/ext/intl/transliterator/transliterator_class.c b/ext/intl/transliterator/transliterator_class.c index 24de8f6544f93..af9ab96d880fb 100644 --- a/ext/intl/transliterator/transliterator_class.c +++ b/ext/intl/transliterator/transliterator_class.c @@ -255,8 +255,7 @@ static zval *Transliterator_read_property( zval *object, zval *member, int type, /* }}} */ /* {{{ write_property handler */ -static void Transliterator_write_property( zval *object, zval *member, zval *value, - void **cache_slot ) +static zval *Transliterator_write_property( zval *object, zval *member, zval *value, void **cache_slot ) { zend_class_entry *scope; TRANSLITERATOR_PROPERTY_HANDLER_PROLOG; @@ -274,10 +273,12 @@ static void Transliterator_write_property( zval *object, zval *member, zval *val } else { - zend_std_write_property( object, member, value, cache_slot ); + value = zend_std_write_property( object, member, value, cache_slot ); } TRANSLITERATOR_PROPERTY_HANDLER_EPILOG; + + return value; } /* }}} */ diff --git a/ext/mysqli/mysqli.c b/ext/mysqli/mysqli.c index c885be61c0898..e5d6964bbf9df 100644 --- a/ext/mysqli/mysqli.c +++ b/ext/mysqli/mysqli.c @@ -333,7 +333,7 @@ zval *mysqli_read_property(zval *object, zval *member, int type, void **cache_sl /* }}} */ /* {{{ mysqli_write_property */ -void mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *mysqli_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; mysqli_object *obj; @@ -353,12 +353,14 @@ void mysqli_write_property(zval *object, zval *member, zval *value, void **cache if (hnd) { hnd->write_func(obj, value); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 92ce1054e0b81..87fe98ddfb31d 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -6800,7 +6800,7 @@ static const zend_function_entry reflection_ext_functions[] = { /* {{{ */ }; /* }}} */ /* {{{ _reflection_write_property */ -static void _reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) +static zval *_reflection_write_property(zval *object, zval *member, zval *value, void **cache_slot) { if ((Z_TYPE_P(member) == IS_STRING) && zend_hash_exists(&Z_OBJCE_P(object)->properties_info, Z_STR_P(member)) @@ -6809,10 +6809,11 @@ static void _reflection_write_property(zval *object, zval *member, zval *value, { zend_throw_exception_ex(reflection_exception_ptr, 0, "Cannot set read-only property %s::$%s", ZSTR_VAL(Z_OBJCE_P(object)->name), Z_STRVAL_P(member)); + return &EG(uninitialized_zval); } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } /* }}} */ diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index 01eadf98d069b..f4c4a188c9219 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -421,7 +421,7 @@ static void change_node_zval(xmlNodePtr node, zval *value) /* {{{ sxe_property_write() */ -static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) +static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool elements, zend_bool attribs, xmlNodePtr *pnewnode) { php_sxe_object *sxe; xmlNodePtr node; @@ -448,7 +448,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } goto long_dim; } else { @@ -472,7 +472,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool if (member == &tmp_zv) { zval_dtor(&tmp_zv); } - return FAILURE; + return &EG(error_zval); } } } @@ -497,7 +497,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool * and this is during runtime. */ zend_throw_error(NULL, "Cannot create unnamed attribute"); - return FAILURE; + return &EG(error_zval); } if (attribs && !node && sxe->iter.type == SXE_ITER_ELEMENT) { node = xmlNewChild(mynode, mynode->ns, sxe->iter.name, NULL); @@ -534,7 +534,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool zval_dtor(&tmp_zv); } zend_error(E_WARNING, "It is not yet possible to assign complex types to %s", attribs ? "attributes" : "properties"); - return FAILURE; + return &EG(error_zval); } } @@ -572,7 +572,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool if (new_value) { zval_ptr_dtor(value); } - return FAILURE; + return &EG(error_zval); } if (sxe->iter.type == SXE_ITER_NONE) { @@ -580,7 +580,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool ++counter; if (member && Z_LVAL_P(member) > 0) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only 0 such elements exist", mynode->name, Z_LVAL_P(member)); - retval = FAILURE; + value = &EG(error_zval); } } else if (member) { newnode = sxe_get_element_by_offset(sxe, Z_LVAL_P(member), node, &cnt); @@ -617,7 +617,7 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool } } else if (counter > 1) { php_error_docref(NULL, E_WARNING, "Cannot assign to an array of nodes (duplicate subnodes or attr detected)"); - retval = FAILURE; + value = &EG(error_zval); } else if (elements) { if (!node) { if (!member || Z_TYPE_P(member) == IS_LONG) { @@ -650,16 +650,19 @@ static int sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bool } if (new_value) { zval_ptr_dtor(value); + return new_value; } - return retval; + return value; } /* }}} */ /* {{{ sxe_property_write() */ -static void sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *sxe_property_write(zval *object, zval *member, zval *value, void **cache_slot) { - sxe_prop_dim_write(object, member, value, 1, 0, NULL); + zval *retval = sxe_prop_dim_write(object, member, value, 1, 0, NULL); + + return retval == &EG(error_zval) ? &EG(uninitialized_zval) : retval; } /* }}} */ @@ -688,7 +691,7 @@ static zval *sxe_property_get_adr(zval *object, zval *member, int fetch_type, vo if (node) { return NULL; } - if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) != SUCCESS) { + if (sxe_prop_dim_write(object, member, NULL, 1, 0, &node) == &EG(error_zval)) { return NULL; } type = SXE_ITER_NONE; diff --git a/ext/snmp/snmp.c b/ext/snmp/snmp.c index a424912a246d6..ad5583ff17936 100644 --- a/ext/snmp/snmp.c +++ b/ext/snmp/snmp.c @@ -1951,7 +1951,7 @@ zval *php_snmp_read_property(zval *object, zval *member, int type, void **cache_ /* {{{ php_snmp_write_property(zval *object, zval *member, zval *value[, const zend_literal *key]) Generic object property writer */ -void php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *php_snmp_write_property(zval *object, zval *member, zval *value, void **cache_slot) { zval tmp_member; php_snmp_object *obj; @@ -1975,12 +1975,14 @@ void php_snmp_write_property(zval *object, zval *member, zval *value, void **cac } */ } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_ptr_dtor(member); } + + return value; } /* }}} */ diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index 3b9ee1a80ae9b..a9148b9b004b1 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -879,16 +879,16 @@ static zval *spl_array_read_property(zval *object, zval *member, int type, void return zend_std_read_property(object, member, type, cache_slot, rv); } /* }}} */ -static void spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *spl_array_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { spl_array_object *intern = Z_SPLARRAY_P(object); if ((intern->ar_flags & SPL_ARRAY_ARRAY_AS_PROPS) != 0 && !zend_std_has_property(object, member, 2, NULL)) { spl_array_write_dimension(object, member, value); - return; + return value; } - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } /* }}} */ static zval *spl_array_get_property_ptr_ptr(zval *object, zval *member, int type, void **cache_slot) /* {{{ */ diff --git a/ext/standard/incomplete_class.c b/ext/standard/incomplete_class.c index 0e34b0aa26a39..65740ed8db82f 100644 --- a/ext/standard/incomplete_class.c +++ b/ext/standard/incomplete_class.c @@ -62,9 +62,10 @@ static zval *incomplete_class_get_property(zval *object, zval *member, int type, } /* }}} */ -static void incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ +static zval *incomplete_class_write_property(zval *object, zval *member, zval *value, void **cache_slot) /* {{{ */ { incomplete_class_message(object, E_NOTICE); + return value; } /* }}} */ diff --git a/ext/xmlreader/php_xmlreader.c b/ext/xmlreader/php_xmlreader.c index 0b84a702b8c39..863a82ef54246 100644 --- a/ext/xmlreader/php_xmlreader.c +++ b/ext/xmlreader/php_xmlreader.c @@ -183,7 +183,7 @@ zval *xmlreader_read_property(zval *object, zval *member, int type, void **cache /* }}} */ /* {{{ xmlreader_write_property */ -void xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) +zval *xmlreader_write_property(zval *object, zval *member, zval *value, void **cache_slot) { xmlreader_object *obj; zval tmp_member; @@ -202,12 +202,14 @@ void xmlreader_write_property(zval *object, zval *member, zval *value, void **ca if (hnd != NULL) { php_error_docref(NULL, E_WARNING, "Cannot write to read-only property"); } else { - zend_std_write_property(object, member, value, cache_slot); + value = zend_std_write_property(object, member, value, cache_slot); } if (member == &tmp_member) { zval_dtor(member); } + + return value; } /* }}} */ From ebb64aef90740d424947271ac59170427e522e33 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 16 Jun 2018 19:01:24 +0200 Subject: [PATCH 254/369] Drop overeager assert Function may be used in cases where types are not set. --- Zend/zend_execute.c | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 54ceca4808ad1..32792d2c8382f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2733,11 +2733,17 @@ static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { /* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection * currently not representable. */ static zend_type compute_intersection_type(zend_type type1, zend_type type2) { - ZEND_ASSERT(ZEND_TYPE_IS_SET(type1) && ZEND_TYPE_IS_SET(type2)); if (type1 == type2) { return type1; } + /* If one of the type is "mixed", the intersection is the other type. */ + if (!ZEND_TYPE_IS_SET(type1)) { + return type2; + } else if (!ZEND_TYPE_IS_SET(type2)) { + return type1; + } + /* Intersection is nullable only if both are nullable. */ if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { type1 = ZEND_TYPE_WITHOUT_NULL(type1); From 7c96afad5b8127e3aa8c0a9022c92627f3690466 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 00:34:03 +0200 Subject: [PATCH 255/369] Enforce reference checks on ReflectionClass::setStaticPropertyValue() + test --- ext/reflection/php_reflection.c | 20 +++++++--- ...ctionClass_setStaticPropertyValue_002.phpt | 4 +- ...ctionClass_setStaticPropertyValue_003.phpt | 39 +++++++++++++++++++ 3 files changed, 56 insertions(+), 7 deletions(-) create mode 100644 ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 87fe98ddfb31d..1c5ab3eb65499 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3978,15 +3978,25 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; } - ZVAL_DEREF(variable_ptr); - if (!prop_info->type || zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor(variable_ptr); - ZVAL_COPY(variable_ptr, value); - } else { + if (Z_ISREF_P(variable_ptr)) { + zend_type ref_type = Z_REFTYPE_P(variable_ptr); + variable_ptr = Z_REFVAL_P(variable_ptr); + + if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, EX_USES_STRICT_TYPES())) { + zend_throw_ref_type_error(ref_type, value); + return; + } + } + + if (prop_info->type && !zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { zend_verify_property_type_error(prop_info, prop_info->name, value); + return; } + zval_ptr_dtor(variable_ptr); + ZVAL_COPY(variable_ptr, value); + } /* }}} */ diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt index 3244ec30b90cb..31c22017297c9 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_002.phpt @@ -1,5 +1,5 @@ --TEST-- -ReflectionClass::getStaticPropertyValue() - bad params +ReflectionClass::setStaticPropertyValue() - bad params --CREDITS-- Robin Fernandes Steve Seear @@ -57,4 +57,4 @@ Class C does not have a property named Class C does not have a property named 1.5 Warning: ReflectionClass::setStaticPropertyValue() expects parameter 1 to be string, array given in %s on line 33 -NULL \ No newline at end of file +NULL diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt new file mode 100644 index 0000000000000..524985ec1e88c --- /dev/null +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt @@ -0,0 +1,39 @@ +--TEST-- +ReflectionClass::setStaticPropertyValue() - type constraints must be enforced +--FILE-- +setStaticPropertyValue("y", "foo"); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("y", "21"); +var_dump(Test::$y); + + +Test::$x =& Test::$y; + +try { + $rc->setStaticPropertyValue("x", "foo"); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump(Test::$y); + +$rc->setStaticPropertyValue("x", "42"); +var_dump(Test::$y); + +?> +--EXPECT-- +string(48) "Typed property Test::$y must be int, string used" +int(2) +int(21) +string(45) "Cannot assign string to reference of type int" +int(21) +int(42) From 10ac5260dcc5136dc7096e796e5f7f5334ab3bd8 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 00:50:28 +0200 Subject: [PATCH 256/369] Use coercive mode for setStaticPropertyValue() This is consistent with behavior of ReflectionProperty::setValue() and all other internal function calling --- ext/reflection/php_reflection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 1c5ab3eb65499..074de47b6d079 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3983,13 +3983,13 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) zend_type ref_type = Z_REFTYPE_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, EX_USES_STRICT_TYPES())) { + if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, 0)) { zend_throw_ref_type_error(ref_type, value); return; } } - if (prop_info->type && !zend_verify_property_type(prop_info, value, value, EX_USES_STRICT_TYPES())) { + if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { zend_verify_property_type_error(prop_info, prop_info->name, value); return; } From 452d0a715327d142e32d48cf91cb23bbf54995e5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 18 Jun 2018 18:15:48 +0200 Subject: [PATCH 257/369] Keep track of reference types --- .../typed_properties_073.phpt | 17 +++-- .../typed_properties_078.phpt | 59 +++++++++++++++ Zend/zend_execute.c | 75 ++++++++++++++++++- Zend/zend_execute.h | 42 +++++++++++ Zend/zend_object_handlers.c | 17 +++-- Zend/zend_objects.c | 12 ++- Zend/zend_types.h | 28 ++++++- Zend/zend_vm_def.h | 32 +++++--- 8 files changed, 250 insertions(+), 32 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_078.phpt diff --git a/Zend/tests/type_declarations/typed_properties_073.phpt b/Zend/tests/type_declarations/typed_properties_073.phpt index 54576ae2cabb0..7f9b4ff2de0f3 100644 --- a/Zend/tests/type_declarations/typed_properties_073.phpt +++ b/Zend/tests/type_declarations/typed_properties_073.phpt @@ -14,13 +14,11 @@ class Test { $test = new Test; var_dump($test); -var_dump($intval = &$test->val); +var_dump($val = &$test->val); var_dump($test); -try { - $test->prop = "x"; -} catch (TypeError $e) { print $e->getMessage()."\n"; } -var_dump($intval); +$test->prop = "x"; +var_dump($test, $val); ?> --EXPECT-- @@ -37,5 +35,10 @@ object(Test)#1 (1) { ["val"]=> uninitialized(int) } -Cannot assign string to reference of type int -int(42) +object(Test)#1 (1) { + ["prop"]=> + &string(1) "x" + ["val"]=> + uninitialized(int) +} +string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt new file mode 100644 index 0000000000000..062c6b32c993a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -0,0 +1,59 @@ +--TEST-- +Typed references must be kept track of and always be only the intersection of the types currently holding that reference +--FILE-- +it; +$a->a = &$ref; + +var_dump($ref); + +try { + $a->t = &$ref; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +$a->it = [1]; // type is still assignable +var_dump($ref); + +try { + $ref = new ArrayIterator(); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +unset($a->a); + +$ref = null; + +$a->t = &$ref; + +try { + $ref = []; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref instanceof ArrayIterator); + +$ref = new ArrayIterator(); +var_dump($ref instanceof ArrayIterator); + +?> +--EXPECT-- +array(0) { +} +string(71) "Property and reference types ?Traversable and ?array are not compatible" +array(0) { +} +array(1) { + [0]=> + int(1) +} +string(55) "Cannot assign ArrayIterator to reference of type ?array" +bool(false) +string(53) "Cannot assign array to reference of type ?Traversable" +bool(false) +bool(true) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 32792d2c8382f..0b9135eb48fa9 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2551,7 +2551,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } ZVAL_NEW_REF(ptr, ptr); - Z_REF_P(ptr)->type = zend_get_prop_info_ref_type(prop_info); + Z_REFTYPE_P(ptr) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); } } return; @@ -2699,12 +2700,14 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { + zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property by reference"); return FAILURE; } - ZVAL_NEW_REF(*retval, *retval); - Z_REF_P(*retval)->type = zend_get_prop_info_ref_type(property_info); + ZVAL_NEW_REF(ref, ref); + Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); } if (prop_info) { @@ -2836,6 +2839,72 @@ ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_ty return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); } +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +{ + zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); + + if (source_list->ptr == NULL) { + source_list->ptr = prop; + return; + } + + if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + list = emalloc(sizeof(zend_property_info_list) + (4 - 1) * sizeof(zend_property_info *)); + list->ptr[0] = source_list->ptr; + list->num_allocated = 4; + list->num = 0; + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); + } else if (list->num_allocated == list->num) { + list->num_allocated = list->num * 2; + list = erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *)); + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); + } + + list->ptr[list->num++] = prop; +} + +ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +{ + zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); + zend_type type; + zend_property_info **end, **start, **ptr; + + if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + source_list->ptr = NULL; + return 0; + } + + if (list->num == 1) { + efree(list); + source_list->ptr = NULL; + return 0; + } + + ptr = start = list->ptr; + if (*ptr == prop) { + *ptr = list->ptr[--list->num]; + type = (*(ptr++))->type; + } else { + type = (*(ptr++))->type; + do { + type = compute_intersection_type(type, (*ptr)->type); + } while (prop != *++ptr); + *ptr = list->ptr[--list->num]; + } + end = start + list->num; + while (ptr != end) { + type = compute_intersection_type(type, (*ptr)->type); + ptr++; + } + + if (list->num >= 4 && list->num * 4 == list->num_allocated) { + list->num_allocated = list->num * 2; + source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *))); + } + + return type; +} + static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) { zval *result = EX_VAR(opline->result.var); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 48876a0a8cb97..5303f1121836e 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -111,6 +111,7 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval if (need_copy) { Z_TRY_DELREF_P(value); } + zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } if (need_copy) { @@ -469,6 +470,47 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); +#define ZEND_REF_TYPE_SOURCES(ref) \ + (ref)->sources + +#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ + (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); + +#define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \ + zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) + +#define ZEND_REF_DEL_TYPE_SOURCE(ref, source) \ + zend_ref_del_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) + +#define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) do { \ + zend_property_info_source_list *_source_list = &ZEND_REF_TYPE_SOURCES(ref); \ + size_t _num; \ + zend_property_info *_prop; \ + zend_property_info_list *_list; \ + if (_source_list->ptr) { \ + if (ZEND_PROPERTY_INFO_SOURCE_IS_LIST(_source_list->list)) { \ + _list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(_source_list->list); \ + _num = _list->num; \ + _prop = _list->ptr[--_num]; \ + } else { \ + _prop = _source_list->ptr; \ + _num = 0; \ + } \ + while (1) { \ + prop = _prop; \ + +#define ZEND_REF_FOREACH_TYPE_SOURCES_END() \ + if (_num == 0) { \ + break; \ + } \ + _prop = _list->ptr[--_num]; \ + } \ + } \ + } while (0) + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index da3fabb7b8a44..cc5623e920188 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -663,23 +663,18 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { zval *val = retval; - zend_type old_type; if (Z_ISREF_P(val)) { - zend_type new_type = zend_get_prop_info_ref_type(prop_info); - old_type = Z_REFTYPE_P(val); - if (old_type != 0 && (new_type = zend_check_typed_assign_typed_ref("Property", old_type, new_type)) == 0) { + /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ + if (zend_check_typed_assign_typed_ref("Property", Z_REFTYPE_P(val), zend_get_prop_info_ref_type(prop_info)) == 0) { goto exit; } - Z_REFTYPE_P(val) = new_type; + /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ val = Z_REFVAL_P(val); } if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), val); - if (Z_ISREF_P(retval)) { - Z_REFTYPE_P(retval) = old_type; - } } } goto exit; @@ -1026,6 +1021,12 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s zval *slot = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(slot) != IS_UNDEF) { + if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { + zend_property_info *prop_info = zend_hash_find(&zobj->ce->properties_info, Z_STR_P(member)); + if (UNEXPECTED(prop_info->type)) { + Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); + } + } zval_ptr_dtor(slot); ZVAL_UNDEF(slot); if (zobj->properties) { diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 00d124ff24789..c966df139e031 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -54,7 +54,17 @@ ZEND_API void zend_object_std_dtor(zend_object *object) if (EXPECTED(object->ce->default_properties_count)) { end = p + object->ce->default_properties_count; do { - i_zval_ptr_dtor(p ZEND_FILE_LINE_CC); + if (Z_REFCOUNTED_P(p)) { + if (UNEXPECTED(Z_ISREF_P(p)) && Z_REFCOUNT_P(p) > 1) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { + Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } + i_zval_ptr_dtor(p ZEND_FILE_LINE_CC); + } p++; } while (p != end); } diff --git a/Zend/zend_types.h b/Zend/zend_types.h index 5d1abceb45f02..6f3c62b245b49 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -384,10 +384,28 @@ struct _zend_resource { void *ptr; }; +typedef struct _zend_property_info zend_property_info; + +typedef struct { + size_t num; + size_t num_allocated; + zend_property_info *ptr[1]; +} zend_property_info_list; + +typedef union { + zend_property_info *ptr; + uintptr_t list; +} zend_property_info_source_list; + +#define ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list) (0x1 | (uintptr_t) (list)) +#define ZEND_PROPERTY_INFO_SOURCE_TO_LIST(list) ((zend_property_info_list *) ((list) & ~0x1)) +#define ZEND_PROPERTY_INFO_SOURCE_IS_LIST(list) ((list) & 0x1) + struct _zend_reference { - zend_refcounted_h gc; - zval val; - zend_type type; + zend_refcounted_h gc; + zval val; + zend_type type; + zend_property_info_source_list sources; }; struct _zend_ast_ref { @@ -873,6 +891,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, 1); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -884,6 +903,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) @@ -896,6 +916,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, _z); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ } while (0) @@ -908,6 +929,7 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { (GC_PERSISTENT << GC_FLAGS_SHIFT); \ ZVAL_COPY_VALUE(&_ref->val, r); \ _ref->type = 0; \ + _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ } while (0) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 6f1a007d00d38..93382361c7ac6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2634,7 +2634,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -2684,9 +2683,11 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + zend_bool add_ref_source = 0; + if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -2694,18 +2695,20 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { + add_ref_source = Z_ISREF_P(variable_ptr) == 0; + ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } + + add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2720,6 +2723,9 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + if (add_ref_source) { /* avoid double assign */ + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } @@ -2740,6 +2746,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zval *prop, *value_ptr; zend_property_info *prop_info; zend_type ref_type = 0; + zend_bool add_ref_source = 0; SAVE_OPLINE(); @@ -2765,6 +2772,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } else { if (UNEXPECTED(prop_info)) { ref_type = zend_get_prop_info_ref_type(prop_info); + add_ref_source = Z_ISREF_P(prop) == 0; if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2774,6 +2782,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| HANDLE_EXCEPTION(); } } + add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2786,6 +2795,9 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + if (add_ref_source) { /* avoid double assign */ + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { From 0023518170312a031f4a735c5472bdbb16b3d473 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 19 Jun 2018 02:07:35 +0200 Subject: [PATCH 258/369] Fix memory leaks & stupid bugs introduced in last commit --- .../typed_properties_079.phpt | 34 ++ Zend/zend_execute.c | 32 +- Zend/zend_execute.h | 3 - Zend/zend_object_handlers.c | 2 +- Zend/zend_objects.c | 3 +- Zend/zend_opcode.c | 9 + Zend/zend_vm_def.h | 23 +- Zend/zend_vm_execute.h | 420 ++++++++++++------ 8 files changed, 343 insertions(+), 183 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_079.phpt diff --git a/Zend/tests/type_declarations/typed_properties_079.phpt b/Zend/tests/type_declarations/typed_properties_079.phpt new file mode 100644 index 0000000000000..18ebf68762b43 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_079.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test static typed properties with references +--FILE-- +getMessage()); } +var_dump(A::$it); + +A::$a = &$a; + +A::$it = new ArrayIterator(); + +try { + $a = 1; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($a); + +?> +--EXPECT-- +string(54) "Cannot assign ArrayIterator to reference of type array" +array(0) { +} +string(45) "Cannot assign int to reference of type ?array" +NULL + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 0b9135eb48fa9..330d1d55c6fba 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2852,7 +2852,7 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li list = emalloc(sizeof(zend_property_info_list) + (4 - 1) * sizeof(zend_property_info *)); list->ptr[0] = source_list->ptr; list->num_allocated = 4; - list->num = 0; + list->num = 1; source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(list); } else if (list->num_allocated == list->num) { list->num_allocated = list->num * 2; @@ -2866,36 +2866,34 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) { zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); - zend_type type; - zend_property_info **end, **start, **ptr; + zend_type type = 0; + zend_property_info **end, **ptr; if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { + ZEND_ASSERT(source_list->ptr == prop); source_list->ptr = NULL; return 0; } if (list->num == 1) { + ZEND_ASSERT(*list->ptr == prop); efree(list); source_list->ptr = NULL; return 0; } - ptr = start = list->ptr; - if (*ptr == prop) { - *ptr = list->ptr[--list->num]; - type = (*(ptr++))->type; - } else { - type = (*(ptr++))->type; - do { - type = compute_intersection_type(type, (*ptr)->type); - } while (prop != *++ptr); - *ptr = list->ptr[--list->num]; - } - end = start + list->num; - while (ptr != end) { - type = compute_intersection_type(type, (*ptr)->type); + --list->num; + + ptr = list->ptr; + while (*ptr != prop) { ptr++; } + *ptr = list->ptr[list->num]; + + ptr = list->ptr, end = ptr + list->num; + do { + type = compute_intersection_type(type, (*ptr)->type); + } while (++ptr != end); if (list->num >= 4 && list->num * 4 == list->num_allocated) { list->num_allocated = list->num * 2; diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 5303f1121836e..7b4a64f3eecaa 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -108,9 +108,6 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval } if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); - if (need_copy) { - Z_TRY_DELREF_P(value); - } zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index cc5623e920188..ee593f1103ad1 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1022,7 +1022,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_hash_find(&zobj->ce->properties_info, Z_STR_P(member)); + zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member)); if (UNEXPECTED(prop_info->type)) { Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index c966df139e031..cd4986cce7fff 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -55,11 +55,12 @@ ZEND_API void zend_object_std_dtor(zend_object *object) end = p + object->ce->default_properties_count; do { if (Z_REFCOUNTED_P(p)) { - if (UNEXPECTED(Z_ISREF_P(p)) && Z_REFCOUNT_P(p) > 1) { + if (UNEXPECTED(Z_ISREF_P(p))) { zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); } diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 2f170828d6a8d..391656efebbe2 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -261,6 +261,15 @@ ZEND_API void destroy_zend_class(zval *zv) zval *end = p + ce->default_static_members_count; while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - ce->default_static_members_table == prop_info->offset) { + Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } i_zval_ptr_dtor(p ZEND_FILE_LINE_CC); p++; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 93382361c7ac6..da8ebf68f38ad 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2685,7 +2685,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } else { zend_type ref_type = 0; zend_property_info *prop_info; - zend_bool add_ref_source = 0; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { @@ -2695,8 +2694,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - add_ref_source = Z_ISREF_P(variable_ptr) == 0; - ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2707,8 +2704,6 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } - - add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2718,14 +2713,16 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; - if (add_ref_source) { /* avoid double assign */ - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2746,7 +2743,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zval *prop, *value_ptr; zend_property_info *prop_info; zend_type ref_type = 0; - zend_bool add_ref_source = 0; SAVE_OPLINE(); @@ -2772,7 +2768,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } else { if (UNEXPECTED(prop_info)) { ref_type = zend_get_prop_info_ref_type(prop_info); - add_ref_source = Z_ISREF_P(prop) == 0; if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -2782,7 +2777,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| HANDLE_EXCEPTION(); } } - add_ref_source = 1; } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); @@ -2790,14 +2784,15 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; - if (add_ref_source) { /* avoid double assign */ - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 3165502f2ffeb..02b850d2092f2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5328,11 +5328,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -5391,11 +5395,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8787,11 +8795,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -8850,11 +8862,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -9734,11 +9750,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -9797,11 +9817,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -15261,11 +15285,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -15324,11 +15352,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -17658,11 +17690,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -17721,11 +17757,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18349,11 +18389,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -18412,11 +18456,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -26419,7 +26467,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -26469,9 +26516,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -26483,13 +26531,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -26500,11 +26546,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26527,7 +26578,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -26577,9 +26627,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -26591,13 +26642,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -26608,11 +26657,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29179,7 +29233,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -29229,9 +29282,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -29243,13 +29297,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -29260,11 +29312,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29287,7 +29344,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -29337,9 +29393,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -29351,13 +29408,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -29368,11 +29423,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33562,7 +33622,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -33612,9 +33671,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -33626,13 +33686,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -33643,11 +33701,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33670,7 +33733,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -33720,9 +33782,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -33734,13 +33797,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -33751,11 +33812,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35754,7 +35820,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -35804,9 +35869,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -35818,13 +35884,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35835,11 +35899,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35861,7 +35930,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -35911,9 +35979,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -35925,13 +35994,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35942,11 +36009,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37816,7 +37888,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -37866,9 +37937,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -37880,13 +37952,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -37897,11 +37967,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37923,7 +37998,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -37973,9 +38047,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -37987,13 +38062,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -38004,11 +38077,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40503,7 +40581,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -40553,9 +40630,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -40567,13 +40645,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40584,11 +40660,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40610,7 +40691,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -40660,9 +40740,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -40674,13 +40755,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40691,11 +40770,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46250,7 +46334,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -46300,9 +46383,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -46314,13 +46398,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46331,11 +46413,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46357,7 +46444,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -46407,9 +46493,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -46421,13 +46508,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46438,11 +46523,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46503,11 +46593,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -46566,11 +46660,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -50532,7 +50630,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -50582,9 +50679,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -50596,13 +50694,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -50613,11 +50709,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50639,7 +50740,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -50689,9 +50789,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -50703,13 +50804,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -50720,11 +50819,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -52083,11 +52187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -52146,11 +52254,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -53668,11 +53780,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -53731,11 +53847,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } + if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { + Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + } } } zend_assign_to_variable_reference(prop, value_ptr); if (ref_type) { Z_REFTYPE_P(prop) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { @@ -57256,7 +57376,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -57306,9 +57425,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -57320,13 +57440,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57337,11 +57455,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57363,7 +57486,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D zval variable, *variable_ptr = &variable; zval *value_ptr; void **cache_addr; - zend_type ref_type = 0; SAVE_OPLINE(); @@ -57413,9 +57535,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - zend_property_info *prop_info; + zend_type ref_type = 0; + zend_property_info *prop_info; + if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { @@ -57427,13 +57550,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); } } if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57444,11 +57565,16 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D HANDLE_EXCEPTION(); } + + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); if (ref_type) { Z_REFTYPE_P(variable_ptr) = ref_type; + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } From c69f8d038ce3bd768948d65370dbf55f5696678f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 19 Jun 2018 02:59:32 +0200 Subject: [PATCH 259/369] Fix static property ref assignment without types --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 36 ++++++++++++++++++------------------ 2 files changed, 19 insertions(+), 19 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index da8ebf68f38ad..be45d588e8047 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2766,7 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 02b850d2092f2..6154cc0b8606b 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5310,7 +5310,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -5377,7 +5377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -8777,7 +8777,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -8844,7 +8844,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -9732,7 +9732,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -9799,7 +9799,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -15267,7 +15267,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -15334,7 +15334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -17672,7 +17672,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -17739,7 +17739,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -18371,7 +18371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -18438,7 +18438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -46575,7 +46575,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -46642,7 +46642,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -52169,7 +52169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -52236,7 +52236,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -53762,7 +53762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); @@ -53829,7 +53829,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV /* op_data freed by assign_to_variable */ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - if (UNEXPECTED(prop_info)) { + if (UNEXPECTED(prop_info->type)) { ref_type = zend_get_prop_info_ref_type(prop_info); if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { zend_type old_type = Z_REFTYPE_P(value_ptr); From f00a4df058ac91b103b477d8d0c3b1a5e35d9254 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 20 Jun 2018 04:28:52 +0200 Subject: [PATCH 260/369] extract() must check typed refs when overwriting Thanks @nikic for testing this --- Zend/zend_API.h | 12 ++++-- ext/standard/array.c | 42 +++++++++++-------- .../tests/array/extract_typed_ref.phpt | 23 ++++++++++ 3 files changed, 56 insertions(+), 21 deletions(-) create mode 100644 ext/standard/tests/array/extract_typed_ref.phpt diff --git a/Zend/zend_API.h b/Zend/zend_API.h index cdc6327980224..5d7a39da931e0 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -685,17 +685,19 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D -static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { +static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { zend_type ref_type; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { zval tmp; ZVAL_COPY(&tmp, arg); - if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, ZEND_ARG_USES_STRICT_TYPES())) { + if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - zend_throw_ref_type_error(ref_type, &tmp); + if (!silent) { + zend_throw_ref_type_error(ref_type, &tmp); + } zval_ptr_dtor(&tmp); return FAILURE; } @@ -708,6 +710,10 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return SUCCESS; } +static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { + return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); +} + #define ZEND_TRY_ASSIGN(func, zv, ...) \ do { \ zval _zv; \ diff --git a/ext/standard/array.c b/ext/standard/array.c index eb89c7061b613..d440af8a3a2eb 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1808,9 +1808,10 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } count++; } } ZEND_HASH_FOREACH_END(); @@ -1900,9 +1901,10 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); @@ -2009,9 +2011,10 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2145,9 +2148,10 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2259,9 +2263,10 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); @@ -2372,9 +2377,10 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } - ZVAL_DEREF(orig_var); - zval_ptr_dtor(orig_var); - ZVAL_COPY(orig_var, entry); + if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { + exception_thrown = 1; + continue; + } } else { Z_TRY_ADDREF_P(entry); zend_hash_add_new(symbol_table, Z_STR(final_name), entry); diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt new file mode 100644 index 0000000000000..d329f2b7b1055 --- /dev/null +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -0,0 +1,23 @@ +--TEST-- +extract() into typed references must respect their type +--FILE-- +i; +$s =& $test->s; +try { + extract(['i' => 'foo', 's' => 42]); +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($test->i, $test->s); + +?> +--EXPECT-- +string(45) "Cannot assign string to reference of type int" +int(0) +string(2) "42" From 1228d70c7fa62cee930ef12b250119126f5aed7b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Jun 2018 15:52:53 +0200 Subject: [PATCH 261/369] Mark subpats as ARRAY_ASSIGNABLE --- ext/pcre/php_pcre.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index ffecc394221fd..d2810921b77c4 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -938,7 +938,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * Z_PARAM_STR(regex) Z_PARAM_STR(subject) Z_PARAM_OPTIONAL - Z_PARAM_ZVAL_DEREF(subpats) + Z_PARAM_ARRAY_ASSIGNABLE(subpats) Z_PARAM_LONG(flags) Z_PARAM_LONG(start_offset) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); From 440a78a7d4246bd90d400936f5c601a5e6d48592 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 20 Jun 2018 15:54:17 +0200 Subject: [PATCH 262/369] Use TRY_ASSIGN_LONG for zcount parameters --- ext/pcre/php_pcre.c | 15 ++++++--------- 1 file changed, 6 insertions(+), 9 deletions(-) diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index d2810921b77c4..c672d2a7fff56 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -2179,7 +2179,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (Z_TYPE_P(replace) != IS_ARRAY) { @@ -2245,8 +2245,7 @@ static void preg_replace_common(INTERNAL_FUNCTION_PARAMETERS, int is_filter) } if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2276,7 +2275,7 @@ static PHP_FUNCTION(preg_replace_callback) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); if (!zend_is_callable_ex(replace, NULL, 0, NULL, &fcc, NULL)) { @@ -2293,8 +2292,7 @@ static PHP_FUNCTION(preg_replace_callback) replace_count = preg_replace_func_impl(return_value, regex, &fci, &fcc, subject, limit); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ @@ -2316,7 +2314,7 @@ static PHP_FUNCTION(preg_replace_callback_array) Z_PARAM_ZVAL(subject) Z_PARAM_OPTIONAL Z_PARAM_LONG(limit) - Z_PARAM_ZVAL_DEREF(zcount) + Z_PARAM_ZVAL(zcount) ZEND_PARSE_PARAMETERS_END(); fci.size = sizeof(fci); @@ -2361,8 +2359,7 @@ static PHP_FUNCTION(preg_replace_callback_array) } ZEND_HASH_FOREACH_END(); if (zcount) { - zval_ptr_dtor(zcount); - ZVAL_LONG(zcount, replace_count); + ZEND_TRY_ASSIGN_LONG(zcount, replace_count); } } /* }}} */ From c6f5f13657f191a556c52cb4d4cd729081be2e70 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 20 Jun 2018 16:36:31 +0200 Subject: [PATCH 263/369] Fix refcounting of zend_try_assign() --- Zend/zend_API.h | 2 +- ext/standard/array.c | 6 ++++++ 2 files changed, 7 insertions(+), 1 deletion(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 5d7a39da931e0..6e3942f541087 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -689,7 +689,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool zend_type ref_type; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { zval tmp; - ZVAL_COPY(&tmp, arg); + ZVAL_COPY_VALUE(&tmp, arg); if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); diff --git a/ext/standard/array.c b/ext/standard/array.c index d440af8a3a2eb..a3cbed9b07903 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1808,6 +1808,7 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -1901,6 +1902,7 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table continue; } ZVAL_DEREF(entry); + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2011,6 +2013,7 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2148,6 +2151,7 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2263,6 +2267,7 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; @@ -2377,6 +2382,7 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ if (Z_TYPE_P(orig_var) == IS_INDIRECT) { orig_var = Z_INDIRECT_P(orig_var); } + Z_TRY_ADDREF_P(entry); if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { exception_thrown = 1; continue; From 693a603eaafd298a869a5b97244807f0e11c33ba Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 11:30:37 +0200 Subject: [PATCH 264/369] Enforce reference type in settype() --- Zend/zend_execute.c | 2 +- ext/standard/type.c | 30 ++++++++++++++++++------------ 2 files changed, 19 insertions(+), 13 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 330d1d55c6fba..4bdb0d2ec9b09 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2689,7 +2689,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (UNEXPECTED(success != SUCCESS)) { return FAILURE; } - } + } if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), diff --git a/ext/standard/type.c b/ext/standard/type.c index 24b6ac7f61c09..a2a92df29f526 100644 --- a/ext/standard/type.c +++ b/ext/standard/type.c @@ -47,40 +47,46 @@ PHP_FUNCTION(settype) { zval *var; char *type; - size_t type_len = 0; + size_t type_len; + zval tmp; ZEND_PARSE_PARAMETERS_START(2, 2) - Z_PARAM_ZVAL_DEREF(var) + Z_PARAM_ZVAL(var) Z_PARAM_STRING(type, type_len) ZEND_PARSE_PARAMETERS_END(); + ZVAL_COPY(&tmp, var); if (!strcasecmp(type, "integer")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "int")) { - convert_to_long(var); + convert_to_long(&tmp); } else if (!strcasecmp(type, "float")) { - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "double")) { /* deprecated */ - convert_to_double(var); + convert_to_double(&tmp); } else if (!strcasecmp(type, "string")) { - convert_to_string(var); + convert_to_string(&tmp); } else if (!strcasecmp(type, "array")) { - convert_to_array(var); + convert_to_array(&tmp); } else if (!strcasecmp(type, "object")) { - convert_to_object(var); + convert_to_object(&tmp); } else if (!strcasecmp(type, "bool")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "boolean")) { - convert_to_boolean(var); + convert_to_boolean(&tmp); } else if (!strcasecmp(type, "null")) { - convert_to_null(var); + convert_to_null(&tmp); } else if (!strcasecmp(type, "resource")) { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Cannot convert to resource type"); RETURN_FALSE; } else { + zval_ptr_dtor(&tmp); php_error_docref(NULL, E_WARNING, "Invalid type"); RETURN_FALSE; } + + zend_try_assign(var, &tmp); RETVAL_TRUE; } /* }}} */ From 2d47e84d4b10b838a26a7d38bb4112ae17fe60c5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 13:01:14 +0200 Subject: [PATCH 265/369] Make ZEND_TRY_ASSIGN_* implementation less magic Should also fix the windows build. --- Zend/zend_API.h | 55 ++++++++++++++++++++++++++++++++++++------------- 1 file changed, 41 insertions(+), 14 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 6e3942f541087..85b11ad1ff3f2 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -714,20 +714,47 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); } -#define ZEND_TRY_ASSIGN(func, zv, ...) \ - do { \ - zval _zv; \ - func(&_zv, ##__VA_ARGS__); \ - zend_try_assign(zv, &_zv); \ - } while (0) - -#define ZEND_TRY_ASSIGN_NULL(zv) ZEND_TRY_ASSIGN(ZVAL_NULL, zv) -#define ZEND_TRY_ASSIGN_LONG(zv, long) ZEND_TRY_ASSIGN(ZVAL_LONG, zv, long) -#define ZEND_TRY_ASSIGN_DOUBLE(zv, double) ZEND_TRY_ASSIGN(ZVAL_DOUBLE, zv, double) -#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) ZEND_TRY_ASSIGN(ZVAL_EMPTY_STRING, zv) -#define ZEND_TRY_ASSIGN_STR(zv, str) ZEND_TRY_ASSIGN(ZVAL_STR, zv, str) -#define ZEND_TRY_ASSIGN_STRING(zv, string) ZEND_TRY_ASSIGN(ZVAL_STRING, zv, string) -#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) ZEND_TRY_ASSIGN(ZVAL_STRINGL, zv, string, len) +#define ZEND_TRY_ASSIGN_NULL(zv) do { \ + zval _zv; \ + ZVAL_NULL(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ + zval _zv; \ + ZVAL_LONG(&_zv, lval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_DOUBLE(zv, dval) do { \ + zval _zv; \ + ZVAL_DOUBLE(&_zv, dval); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_EMPTY_STRING(zv) do { \ + zval _zv; \ + ZVAL_EMPTY_STRING(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STR(zv, str) do { \ + zval _zv; \ + ZVAL_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ + zval _zv; \ + ZVAL_STRING(&_zv, string); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_STRINGL(zv, string, len) do { \ + zval _zv; \ + ZVAL_STRINGL(&_zv, string, len); \ + zend_try_assign(zv, &_zv); \ +} while (0) /* Fast parameter parsing API */ From f6ad85fb13594b0f1b12733bb30eb2cc9ed26fe4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 21 Jun 2018 20:35:03 +0200 Subject: [PATCH 266/369] Unmangle property name before printing We could also use the name from op1 (what we do for non-static properties), but as it is conditionally fetched, just unmangling the name is simpler. --- .../typed_properties_080.phpt | 37 +++++++++++++++++++ Zend/zend_execute.c | 4 +- 2 files changed, 40 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_080.phpt diff --git a/Zend/tests/type_declarations/typed_properties_080.phpt b/Zend/tests/type_declarations/typed_properties_080.phpt new file mode 100644 index 0000000000000..18f7a7cf3bd8b --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_080.phpt @@ -0,0 +1,37 @@ +--TEST-- +Access to typed static properties before initialization +--FILE-- +getMessage(), "\n"; + } + try { + self::$b; + } catch (TypeError $e) { + echo $e->getMessage(), "\n"; + } + try { + self::$c; + } catch (TypeError $e) { + echo $e->getMessage(), "\n"; + } + } +} + +Test::run(); + +?> +--EXPECT-- +Typed static property Test::$a must not be accessed before initialization +Typed static property Test::$b must not be accessed before initialization +Typed static property Test::$c must not be accessed before initialization + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4bdb0d2ec9b09..ae13f7e16bc7a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2692,10 +2692,12 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + const char *class_name, *prop_name; + zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + prop_name); return FAILURE; } From 898cd3d56be9a3883ee78632eaa1f14cee2390b0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 22 Jun 2018 23:48:02 +0200 Subject: [PATCH 267/369] Fix reference type tracking on clone --- .../typed_properties_081.phpt | 23 +++++++++++++++++++ Zend/zend_objects.c | 9 ++++++++ 2 files changed, 32 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_081.phpt diff --git a/Zend/tests/type_declarations/typed_properties_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt new file mode 100644 index 0000000000000..e432b73e31f7d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -0,0 +1,23 @@ +--TEST-- +Clone must inherit typed references +--FILE-- +x; +$test2 = clone $test; +unset($test); +try { + $x = "foo"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($test2->x); + +?> +--EXPECT-- +string(45) "Cannot assign string to reference of type int" +int(42) + diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index cd4986cce7fff..22aa69d0252b5 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -185,6 +185,15 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); + if (UNEXPECTED(Z_ISREF_P(dst)) && UNEXPECTED(Z_REFTYPE_P(dst) != NULL)) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(dst), prop_info) { + if (prop_info->ce == new_object->ce && dst == OBJ_PROP(new_object, prop_info->offset)) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(dst), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } src++; dst++; } while (src != end); From 767b2e5c4385096ddd610aeb9d76f2e87054e6ed Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 25 Jun 2018 19:02:20 +0200 Subject: [PATCH 268/369] Update extensions for ZEND_TRY_ASSIGN_* --- Zend/zend_API.h | 24 ++++++++++++ ext/intl/idn/idn.c | 2 +- ext/ldap/ldap.c | 57 ++++++++++++---------------- ext/oci8/oci8_interface.c | 2 +- ext/odbc/php_odbc.c | 4 +- ext/openssl/openssl.c | 76 ++++++++++++++++--------------------- ext/soap/soap.c | 4 +- ext/sockets/sockets.c | 42 +++++++------------- ext/standard/dns_win32.c | 4 +- ext/sysvmsg/sysvmsg.c | 38 +++++++++---------- ext/xmlrpc/xmlrpc-epi-php.c | 8 ++-- 11 files changed, 122 insertions(+), 139 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 85b11ad1ff3f2..43e207de694a1 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -720,6 +720,18 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_FALSE(zv) do { \ + zval _zv; \ + ZVAL_FALSE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + +#define ZEND_TRY_ASSIGN_TRUE(zv) do { \ + zval _zv; \ + ZVAL_TRUE(&_zv); \ + zend_try_assign(zv, &_zv); \ +} while (0) + #define ZEND_TRY_ASSIGN_LONG(zv, lval) do { \ zval _zv; \ ZVAL_LONG(&_zv, lval); \ @@ -744,6 +756,12 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_NEW_STR(zv, str) do { \ + zval _zv; \ + ZVAL_NEW_STR(&_zv, str); \ + zend_try_assign(zv, &_zv); \ +} while (0) + #define ZEND_TRY_ASSIGN_STRING(zv, string) do { \ zval _zv; \ ZVAL_STRING(&_zv, string); \ @@ -756,6 +774,12 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +#define ZEND_TRY_ASSIGN_RES(zv, res) do { \ + zval _zv; \ + ZVAL_RES(&_zv, res); \ + zend_try_assign(zv, &_zv); \ +} while (0) + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 02e341fa3879c..5d8943c4b3a0e 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -279,7 +279,7 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_reset(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llt", &domain, &option, &variant, &idna_info) == FAILURE) { php_intl_bad_args("bad arguments"); RETURN_NULL(); /* don't set FALSE because that's not the way it was before... */ diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 5e8920b7d9aac..2a654e43761a7 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -3330,7 +3330,7 @@ PHP_FUNCTION(ldap_parse_result) char *lmatcheddn, *lerrmsg; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz/|z/z/z/z/", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zztt", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { return; } @@ -3353,8 +3353,7 @@ PHP_FUNCTION(ldap_parse_result) RETURN_FALSE; } - zval_ptr_dtor(errcode); - ZVAL_LONG(errcode, lerrcode); + ZEND_TRY_ASSIGN_LONG(errcode, lerrcode); /* Reverse -> fall through */ switch (myargcount) { @@ -3372,19 +3371,17 @@ PHP_FUNCTION(ldap_parse_result) ldap_memvfree((void**)lreferrals); } case 5: - zval_ptr_dtor(errmsg); if (lerrmsg == NULL) { - ZVAL_EMPTY_STRING(errmsg); + ZEND_TRY_ASSIGN_EMPTY_STRING(errmsg); } else { - ZVAL_STRING(errmsg, lerrmsg); + ZEND_TRY_ASSIGN_STRING(errmsg, lerrmsg); ldap_memfree(lerrmsg); } case 4: - zval_ptr_dtor(matcheddn); if (lmatcheddn == NULL) { - ZVAL_EMPTY_STRING(matcheddn); + ZEND_TRY_ASSIGN_EMPTY_STRING(matcheddn); } else { - ZVAL_STRING(matcheddn, lmatcheddn); + ZEND_TRY_ASSIGN_STRING(matcheddn, lmatcheddn); ldap_memfree(lmatcheddn); } } @@ -3395,7 +3392,7 @@ PHP_FUNCTION(ldap_parse_result) /* {{{ Extended operation response parsing, Pierangelo Masarati */ #ifdef HAVE_LDAP_PARSE_EXTENDED_RESULT -/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string retdata [, string retoid]]) +/* {{{ proto bool ldap_parse_exop(resource link, resource result [, string &retdata [, string &retoid]]) Extract information from extended operation result */ PHP_FUNCTION(ldap_parse_exop) { @@ -3406,7 +3403,7 @@ PHP_FUNCTION(ldap_parse_exop) struct berval *lretdata; int rc, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|z/z/", &link, &result, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|zz", &link, &result, &retdata, &retoid) != SUCCESS) { WRONG_PARAM_COUNT; } @@ -3430,20 +3427,18 @@ PHP_FUNCTION(ldap_parse_exop) /* Reverse -> fall through */ switch (myargcount) { case 4: - zval_dtor(retoid); if (lretoid == NULL) { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } else { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } case 3: /* use arg #3 as the data returned by the server */ - zval_dtor(retdata); if (lretdata == NULL) { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } else { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } @@ -3521,7 +3516,7 @@ PHP_FUNCTION(ldap_next_reference) /* }}} */ #ifdef HAVE_LDAP_PARSE_REFERENCE -/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array referrals) +/* {{{ proto bool ldap_parse_reference(resource link, resource reference_entry, array &referrals) Extract information from reference entry */ PHP_FUNCTION(ldap_parse_reference) { @@ -3530,7 +3525,7 @@ PHP_FUNCTION(ldap_parse_reference) ldap_resultentry *resultentry; char **lreferrals, **refp; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz/", &link, &result_entry, &referrals) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrt", &link, &result_entry, &referrals) != SUCCESS) { return; } @@ -4012,7 +4007,7 @@ PHP_FUNCTION(ldap_control_paged_result_response) ber_tag_t tag; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|z/z/", &link, &result, &cookie, &estimated) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rr|zz", &link, &result, &cookie, &estimated) != SUCCESS) { return; } @@ -4079,15 +4074,13 @@ PHP_FUNCTION(ldap_control_paged_result_response) ldap_controls_free(lserverctrls); if (myargcount == 4) { - zval_dtor(estimated); - ZVAL_LONG(estimated, lestimated); + ZEND_TRY_ASSIGN_LONG(estimated, lestimated); } - zval_ptr_dtor(cookie); if (lcookie.bv_len == 0) { - ZVAL_EMPTY_STRING(cookie); + ZEND_TRY_ASSIGN_EMPTY_STRING(cookie); } else { - ZVAL_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); + ZEND_TRY_ASSIGN_STRINGL(cookie, lcookie.bv_val, lcookie.bv_len); } ldap_memfree(lcookie.bv_val); @@ -4112,7 +4105,7 @@ PHP_FUNCTION(ldap_exop) LDAPControl **lserverctrls = NULL; int rc, msgid; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!z/z/", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rS|S!a!zz", &link, &reqoid, &reqdata, &serverctrls, &retdata, &retoid) != SUCCESS) { return; } @@ -4150,22 +4143,20 @@ PHP_FUNCTION(ldap_exop) } if (retoid) { - zval_dtor(retoid); if (lretoid) { - ZVAL_STRING(retoid, lretoid); + ZEND_TRY_ASSIGN_STRING(retoid, lretoid); ldap_memfree(lretoid); } else { - ZVAL_EMPTY_STRING(retoid); + ZEND_TRY_ASSIGN_EMPTY_STRING(retoid); } } - zval_dtor(retdata); if (lretdata) { - ZVAL_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); + ZEND_TRY_ASSIGN_STRINGL(retdata, lretdata->bv_val, lretdata->bv_len); ldap_memfree(lretdata->bv_val); ldap_memfree(lretdata); } else { - ZVAL_EMPTY_STRING(retdata); + ZEND_TRY_ASSIGN_EMPTY_STRING(retdata); } RETVAL_TRUE; @@ -4216,7 +4207,7 @@ PHP_FUNCTION(ldap_exop_passwd) int rc, myargcount = ZEND_NUM_ARGS(), msgid, err; char* errmsg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzz/", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzt", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { WRONG_PARAM_COUNT; } diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index ceeaefeb778ef..140613ec58745 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1434,7 +1434,7 @@ PHP_FUNCTION(oci_fetch_all) int i; zend_long rows = 0, flags = 0, skip = 0, maxrows = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { return; } diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 0ecdee98e57cc..198f5fce0702d 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -1880,13 +1880,13 @@ PHP_FUNCTION(odbc_fetch_into) #endif /* HAVE_SQL_EXTENDED_FETCH */ #ifdef HAVE_SQL_EXTENDED_FETCH - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { return; } rownum = pv_row; #else - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/", &pv_res, &pv_res_arr) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt", &pv_res, &pv_res_arr) == FAILURE) { return; } #endif /* HAVE_SQL_EXTENDED_FETCH */ diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 136248b3410f6..1106f2afbe7cc 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -3525,7 +3525,7 @@ PHP_FUNCTION(openssl_csr_new) int we_made_the_key = 1; zend_resource *key_resource; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "az/|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "az|a!a!", &dn, &out_pkey, &args, &attribs) == FAILURE) { return; } RETVAL_FALSE; @@ -3533,9 +3533,12 @@ PHP_FUNCTION(openssl_csr_new) PHP_SSL_REQ_INIT(&req); if (PHP_SSL_REQ_PARSE(&req, args) == SUCCESS) { + zval *out_pkey_val = out_pkey; + ZVAL_DEREF(out_pkey_val); + /* Generate or use a private key */ - if (Z_TYPE_P(out_pkey) != IS_NULL) { - req.priv_key = php_openssl_evp_from_zval(out_pkey, 0, NULL, 0, 0, &key_resource); + if (Z_TYPE_P(out_pkey_val) != IS_NULL) { + req.priv_key = php_openssl_evp_from_zval(out_pkey_val, 0, NULL, 0, 0, &key_resource); if (req.priv_key != NULL) { we_made_the_key = 0; } @@ -3573,8 +3576,7 @@ PHP_FUNCTION(openssl_csr_new) if (we_made_the_key) { /* and a resource for the private key */ - zval_dtor(out_pkey); - ZVAL_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); + ZEND_TRY_ASSIGN_RES(out_pkey, zend_register_resource(req.priv_key, le_key)); req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ } else if (key_resource != NULL) { req.priv_key = NULL; /* make sure the cleanup code doesn't zap it! */ @@ -4585,7 +4587,7 @@ PHP_FUNCTION(openssl_pkey_export) BIO * bio_out = NULL; const EVP_CIPHER * cipher; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz/|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zz|s!a!", &zpkey, &out, &passphrase, &passphrase_len, &args) == FAILURE) { return; } RETVAL_FALSE; @@ -4637,8 +4639,7 @@ PHP_FUNCTION(openssl_pkey_export) RETVAL_TRUE; bio_mem_len = BIO_get_mem_data(bio_out, &bio_mem_ptr); - zval_dtor(out); - ZVAL_STRINGL(out, bio_mem_ptr, bio_mem_len); + ZEND_TRY_ASSIGN_STRINGL(out, bio_mem_ptr, bio_mem_len); } else { php_openssl_store_errors(); } @@ -5341,7 +5342,7 @@ PHP_FUNCTION(openssl_pkcs7_read) PKCS7 * p7 = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/", &p7b, &p7b_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st", &p7b, &p7b_len, &zout) == FAILURE) { return; } @@ -5638,7 +5639,7 @@ PHP_FUNCTION(openssl_private_encrypt) size_t data_len; zend_long padding = RSA_PKCS1_PADDING; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5669,9 +5670,8 @@ PHP_FUNCTION(openssl_private_encrypt) } if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5701,7 +5701,7 @@ PHP_FUNCTION(openssl_private_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5738,9 +5738,8 @@ PHP_FUNCTION(openssl_private_decrypt) efree(crypttemp); if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5770,7 +5769,7 @@ PHP_FUNCTION(openssl_public_encrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) return; RETVAL_FALSE; @@ -5800,9 +5799,8 @@ PHP_FUNCTION(openssl_public_encrypt) } if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5832,7 +5830,7 @@ PHP_FUNCTION(openssl_public_decrypt) char * data; size_t data_len; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|l", &data, &data_len, &crypted, &key, &padding) == FAILURE) { return; } RETVAL_FALSE; @@ -5871,9 +5869,8 @@ PHP_FUNCTION(openssl_public_decrypt) efree(crypttemp); if (successful) { - zval_dtor(crypted); ZSTR_VAL(cryptedbuf)[cryptedlen] = '\0'; - ZVAL_NEW_STR(crypted, cryptedbuf); + ZEND_TRY_ASSIGN_NEW_STR(crypted, cryptedbuf); cryptedbuf = NULL; RETVAL_TRUE; } else { @@ -5934,7 +5931,7 @@ PHP_FUNCTION(openssl_sign) zend_long signature_algo = OPENSSL_ALGO_SHA1; const EVP_MD *mdtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z|z", &data, &data_len, &signature, &key, &method) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szz|z", &data, &data_len, &signature, &key, &method) == FAILURE) { return; } pkey = php_openssl_evp_from_zval(key, 0, "", 0, 0, &keyresource); @@ -5967,10 +5964,9 @@ PHP_FUNCTION(openssl_sign) EVP_SignInit(md_ctx, mdtype) && EVP_SignUpdate(md_ctx, data, data_len) && EVP_SignFinal(md_ctx, (unsigned char*)ZSTR_VAL(sigbuf), &siglen, pkey)) { - zval_dtor(signature); ZSTR_VAL(sigbuf)[siglen] = '\0'; ZSTR_LEN(sigbuf) = siglen; - ZVAL_NEW_STR(signature, sigbuf); + ZEND_TRY_ASSIGN_NEW_STR(signature, sigbuf); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6062,7 +6058,7 @@ PHP_FUNCTION(openssl_seal) const EVP_CIPHER *cipher; EVP_CIPHER_CTX *ctx; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/z/a|sz/", &data, &data_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szta|sz", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len, &iv) == FAILURE) { return; } @@ -6136,8 +6132,7 @@ PHP_FUNCTION(openssl_seal) } if (len1 + len2 > 0) { - zval_dtor(sealdata); - ZVAL_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); zval_dtor(ekeys); @@ -6150,9 +6145,8 @@ PHP_FUNCTION(openssl_seal) } if (iv) { - zval_dtor(iv); iv_buf[iv_len] = '\0'; - ZVAL_NEW_STR(iv, zend_string_init((char*)iv_buf, iv_len, 0)); + ZEND_TRY_ASSIGN_NEW_STR(iv, zend_string_init((char*)iv_buf, iv_len, 0)); } } else { efree(buf); @@ -6194,7 +6188,7 @@ PHP_FUNCTION(openssl_open) size_t method_len = 0, iv_len = 0; const EVP_CIPHER *cipher; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/sz|ss", &data, &data_len, &opendata, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szsz|ss", &data, &data_len, &opendata, &ekey, &ekey_len, &privkey, &method, &method_len, &iv, &iv_len) == FAILURE) { return; } @@ -6240,9 +6234,8 @@ PHP_FUNCTION(openssl_open) if (ctx != NULL && EVP_OpenInit(ctx, cipher, (unsigned char *)ekey, (int)ekey_len, iv_buf, pkey) && EVP_OpenUpdate(ctx, buf, &len1, (unsigned char *)data, (int)data_len) && EVP_OpenFinal(ctx, buf + len1, &len2) && (len1 + len2 > 0)) { - zval_dtor(opendata); buf[len1 + len2] = '\0'; - ZVAL_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); + ZEND_TRY_ASSIGN_NEW_STR(opendata, zend_string_init((char*)buf, len1 + len2, 0)); RETVAL_TRUE; } else { php_openssl_store_errors(); @@ -6594,7 +6587,7 @@ PHP_FUNCTION(openssl_encrypt) zend_string *outbuf; zend_bool free_iv = 0, free_password = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lsz/sl", &data, &data_len, &method, &method_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sss|lszsl", &data, &data_len, &method, &method_len, &password, &password_len, &options, &iv, &iv_len, &tag, &aad, &aad_len, &tag_len) == FAILURE) { return; } @@ -6641,10 +6634,9 @@ PHP_FUNCTION(openssl_encrypt) zend_string *tag_str = zend_string_alloc(tag_len, 0); if (EVP_CIPHER_CTX_ctrl(cipher_ctx, mode.aead_get_tag_flag, tag_len, ZSTR_VAL(tag_str)) == 1) { - zval_dtor(tag); ZSTR_VAL(tag_str)[tag_len] = '\0'; ZSTR_LEN(tag_str) = tag_len; - ZVAL_NEW_STR(tag, tag_str); + ZEND_TRY_ASSIGN_NEW_STR(tag, tag_str); } else { php_error_docref(NULL, E_WARNING, "Retrieving verification tag failed"); zend_string_release_ex(tag_str, 0); @@ -6652,8 +6644,7 @@ PHP_FUNCTION(openssl_encrypt) RETVAL_FALSE; } } else if (tag) { - zval_dtor(tag); - ZVAL_NULL(tag); + ZEND_TRY_ASSIGN_NULL(tag); php_error_docref(NULL, E_WARNING, "The authenticated tag cannot be provided for cipher that doesn not support AEAD"); } else if (mode.is_aead) { @@ -6800,13 +6791,12 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) zend_string *buffer = NULL; zval *zstrong_result_returned = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z/", &buffer_length, &zstrong_result_returned) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "l|z", &buffer_length, &zstrong_result_returned) == FAILURE) { return; } if (zstrong_result_returned) { - zval_dtor(zstrong_result_returned); - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } if (buffer_length <= 0 @@ -6823,7 +6813,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (php_win32_get_random_bytes((unsigned char*)buffer->val, (size_t) buffer_length) == FAILURE){ zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } RETURN_FALSE; } @@ -6835,7 +6825,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) if (RAND_bytes((unsigned char*)ZSTR_VAL(buffer), (int)buffer_length) <= 0) { zend_string_release_ex(buffer, 0); if (zstrong_result_returned) { - ZVAL_FALSE(zstrong_result_returned); + ZEND_TRY_ASSIGN_FALSE(zstrong_result_returned); } RETURN_FALSE; } else { @@ -6847,7 +6837,7 @@ PHP_FUNCTION(openssl_random_pseudo_bytes) RETVAL_NEW_STR(buffer); if (zstrong_result_returned) { - ZVAL_BOOL(zstrong_result_returned, 1); + ZEND_TRY_ASSIGN_TRUE(zstrong_result_returned); } } /* }}} */ diff --git a/ext/soap/soap.c b/ext/soap/soap.c index 097a5dfcc2550..360cef6bec0e1 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2806,7 +2806,7 @@ static void verify_soap_headers_array(HashTable *ht) } -/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array output_headers]]]) +/* {{{ proto mixed SoapClient::__call(string function_name, array arguments [, array options [, array input_headers [, array &output_headers]]]) Calls a SOAP function */ PHP_METHOD(SoapClient, __call) { @@ -2825,7 +2825,7 @@ PHP_METHOD(SoapClient, __call) zend_bool free_soap_headers = 0; zval *this_ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zt", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { return; } diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index fd1cca3c95d2d..c3e1e64dab550 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -1692,7 +1692,7 @@ PHP_FUNCTION(socket_recv) int retval; zend_long len, flags; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/ll", &php_sock_res, &buf, &len, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzll", &php_sock_res, &buf, &len, &flags) == FAILURE) { return; } @@ -1709,16 +1709,11 @@ PHP_FUNCTION(socket_recv) if ((retval = recv(php_sock->bsd_socket, ZSTR_VAL(recv_buf), len, flags)) < 1) { zend_string_efree(recv_buf); - - zval_ptr_dtor(buf); - ZVAL_NULL(buf); + ZEND_TRY_ASSIGN_NULL(buf); } else { ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - - /* Rebuild buffer zval */ - zval_ptr_dtor(buf); - ZVAL_NEW_STR(buf, recv_buf); + ZEND_TRY_ASSIGN_NEW_STR(buf, recv_buf); } if (retval == -1) { @@ -1777,7 +1772,7 @@ PHP_FUNCTION(socket_recvfrom) char *address; zend_string *recv_buf; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz/llz/|z/", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rzllz|z", &arg1, &arg2, &arg3, &arg4, &arg5, &arg6) == FAILURE) { return; } @@ -1806,11 +1801,8 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, s_un.sun_path); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, s_un.sun_path); break; case AF_INET: @@ -1833,15 +1825,11 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - address = inet_ntoa(sin.sin_addr); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, address ? address : "0.0.0.0"); - ZVAL_LONG(arg6, ntohs(sin.sin_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, address ? address : "0.0.0.0"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin.sin_port)); break; #if HAVE_IPV6 case AF_INET6: @@ -1864,16 +1852,12 @@ PHP_FUNCTION(socket_recvfrom) ZSTR_LEN(recv_buf) = retval; ZSTR_VAL(recv_buf)[ZSTR_LEN(recv_buf)] = '\0'; - zval_ptr_dtor(arg2); - zval_ptr_dtor(arg5); - zval_ptr_dtor(arg6); - memset(addr6, 0, INET6_ADDRSTRLEN); inet_ntop(AF_INET6, &sin6.sin6_addr, addr6, INET6_ADDRSTRLEN); - ZVAL_NEW_STR(arg2, recv_buf); - ZVAL_STRING(arg5, addr6[0] ? addr6 : "::"); - ZVAL_LONG(arg6, ntohs(sin6.sin6_port)); + ZEND_TRY_ASSIGN_NEW_STR(arg2, recv_buf); + ZEND_TRY_ASSIGN_STRING(arg5, addr6[0] ? addr6 : "::"); + ZEND_TRY_ASSIGN_LONG(arg6, ntohs(sin6.sin6_port)); break; #endif default: @@ -2230,7 +2214,7 @@ PHP_FUNCTION(socket_create_pair) PHP_SOCKET fds_array[2]; zend_long domain, type, protocol; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz/", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllt", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { return; } diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index 4bca7128a1bf4..3e3930af57d83 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -50,7 +50,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ DNS_STATUS status; /* Return value of DnsQuery_A() function */ PDNS_RECORD pResult, pRec; /* Pointer to DNS_RECORD structure */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|z/", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } @@ -352,7 +352,7 @@ PHP_FUNCTION(dns_get_record) int type, type_to_fetch, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz/!z/!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } diff --git a/ext/sysvmsg/sysvmsg.c b/ext/sysvmsg/sysvmsg.c index 1382eaa119736..d8f2722b43bd0 100644 --- a/ext/sysvmsg/sysvmsg.c +++ b/ext/sysvmsg/sysvmsg.c @@ -293,7 +293,7 @@ PHP_FUNCTION(msg_remove_queue) } /* }}} */ -/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed message [, bool unserialize=true [, int flags=0 [, int errorcode]]]) +/* {{{ proto mixed msg_receive(resource queue, int desiredmsgtype, int &msgtype, int maxsize, mixed &message [, bool unserialize=true [, int flags=0 [, int &errorcode]]]) Send a message of type msgtype (must be > 0) to a message queue */ PHP_FUNCTION(msg_receive) { @@ -307,7 +307,7 @@ PHP_FUNCTION(msg_receive) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz/lz/|blz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlzlz|blz", &queue, &desiredmsgtype, &out_msgtype, &maxsize, &out_message, &do_unserialize, &flags, &zerrcode) == FAILURE) { return; @@ -343,20 +343,12 @@ PHP_FUNCTION(msg_receive) result = msgrcv(mq->id, messagebuffer, maxsize, desiredmsgtype, realflags); - zval_dtor(out_msgtype); - zval_dtor(out_message); - ZVAL_LONG(out_msgtype, 0); - ZVAL_FALSE(out_message); - - if (zerrcode) { - ZVAL_DEREF(zerrcode); - zval_dtor(zerrcode); - ZVAL_LONG(zerrcode, 0); - } - if (result >= 0) { /* got it! */ - ZVAL_LONG(out_msgtype, messagebuffer->mtype); + ZEND_TRY_ASSIGN_LONG(out_msgtype, messagebuffer->mtype); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, 0); + } RETVAL_TRUE; if (do_unserialize) { @@ -367,16 +359,21 @@ PHP_FUNCTION(msg_receive) PHP_VAR_UNSERIALIZE_INIT(var_hash); if (!php_var_unserialize(&tmp, &p, p + result, &var_hash)) { php_error_docref(NULL, E_WARNING, "message corrupted"); + ZEND_TRY_ASSIGN_FALSE(out_message); RETVAL_FALSE; } else { - ZVAL_COPY_VALUE(out_message, &tmp); + zend_try_assign(out_message, &tmp); } PHP_VAR_UNSERIALIZE_DESTROY(var_hash); } else { - ZVAL_STRINGL(out_message, messagebuffer->mtext, result); + ZEND_TRY_ASSIGN_STRINGL(out_message, messagebuffer->mtext, result); + } + } else { + ZEND_TRY_ASSIGN_LONG(out_msgtype, 0); + ZEND_TRY_ASSIGN_FALSE(out_message); + if (zerrcode) { + ZEND_TRY_ASSIGN_LONG(zerrcode, errno); } - } else if (zerrcode) { - ZVAL_LONG(zerrcode, errno); } efree(messagebuffer); } @@ -396,7 +393,7 @@ PHP_FUNCTION(msg_send) RETVAL_FALSE; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz/", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rlz|bbz", &queue, &msgtype, &message, &do_serialize, &blocking, &zerror) == FAILURE) { return; } @@ -462,8 +459,7 @@ PHP_FUNCTION(msg_send) if (result == -1) { php_error_docref(NULL, E_WARNING, "msgsnd failed: %s", strerror(errno)); if (zerror) { - zval_ptr_dtor(zerror); - ZVAL_LONG(zerror, errno); + ZEND_TRY_ASSIGN_LONG(zerror, errno); } } else { RETVAL_TRUE; diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 6fbb66ddc5c55..eb1b5bf86f9fd 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -759,11 +759,9 @@ void decode_request_worker(char *xml_in, int xml_in_len, char *encoding_in, zval if (method_name_out) { method_name = XMLRPC_RequestGetMethodName(response); if (method_name) { - zval_ptr_dtor(method_name_out); - ZVAL_STRING(method_name_out, method_name); + ZEND_TRY_ASSIGN_STRING(method_name_out, method_name); } else { - zval_ptr_dtor(retval); - ZVAL_NULL(retval); + ZEND_TRY_ASSIGN_NULL(retval); } } } @@ -782,7 +780,7 @@ PHP_FUNCTION(xmlrpc_decode_request) zval *method; size_t xml_len, encoding_len = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz/|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|s", &xml, &xml_len, &method, &encoding, &encoding_len) == FAILURE) { return; } From a3f60c09b143347b3b2f25a3a82555de82caae96 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 26 Jun 2018 22:22:34 +0200 Subject: [PATCH 269/369] Opcache handling fixes and improvements --- ext/opcache/Optimizer/sccp.c | 3 + ext/opcache/Optimizer/zend_dfg.c | 8 ++- ext/opcache/Optimizer/zend_inference.c | 77 ++++++++------------------ ext/opcache/Optimizer/zend_ssa.c | 17 +++++- 4 files changed, 49 insertions(+), 56 deletions(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 7d92fc51f7665..d480e1f16f13c 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -256,6 +256,9 @@ static zend_bool can_replace_op1( case ZEND_VERIFY_RETURN_TYPE: // TODO: This would require a non-local change ??? return 0; + case ZEND_OP_DATA: + return (opline - 1)->opcode != ZEND_ASSIGN_OBJ_REF && + (opline - 1)->opcode != ZEND_ASSIGN_STATIC_PROP_REF; default: if (ssa_op->op1_def != -1) { ZEND_ASSERT(0); diff --git a/ext/opcache/Optimizer/zend_dfg.c b/ext/opcache/Optimizer/zend_dfg.c index aca528b404384..d8e9c82b6b883 100644 --- a/ext/opcache/Optimizer/zend_dfg.c +++ b/ext/opcache/Optimizer/zend_dfg.c @@ -52,8 +52,14 @@ int zend_build_dfg(const zend_op_array *op_array, const zend_cfg *cfg, zend_dfg if (next < end && next->opcode == ZEND_OP_DATA) { if (next->op1_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { var_num = EX_VAR_TO_NUM(next->op1.var); - if (!DFG_ISSET(def, set_size, j, var_num)) { + if (opline->opcode == ZEND_ASSIGN_OBJ_REF + || opline->opcode == ZEND_ASSIGN_STATIC_PROP_REF) { DFG_SET(use, set_size, j, var_num); + DFG_SET(def, set_size, j, var_num); + } else { + if (!DFG_ISSET(def, set_size, j, var_num)) { + DFG_SET(use, set_size, j, var_num); + } } } if (next->op2_type & (IS_CV|IS_VAR|IS_TMP_VAR)) { diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 99ff5ede6e464..bfb26301dfc76 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -1852,11 +1852,11 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } } -#define UPDATE_SSA_TYPE_EX(_type, _var, _typed_ref) \ +#define UPDATE_SSA_TYPE(_type, _var) \ do { \ uint32_t __type = (_type); \ int __var = (_var); \ - if (!(_typed_ref) && (__type & MAY_BE_REF)) { \ + if (__type & MAY_BE_REF) { \ __type |= MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; \ } \ if (__var >= 0) { \ @@ -1886,10 +1886,6 @@ static uint32_t get_ssa_alias_types(zend_ssa_alias_kind alias) { } \ } while (0) -#define UPDATE_SSA_TYPE(_type, _var) \ - UPDATE_SSA_TYPE_EX(_type, _var, 0) - - #define UPDATE_SSA_OBJ_TYPE(_ce, _is_instanceof, var) \ do { \ if (var >= 0) { \ @@ -2289,7 +2285,7 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } -static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) { zend_property_info *prop_info = NULL; @@ -2302,12 +2298,15 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss ce = ssa->var_info[ssa->ops[i].op1_use].ce; } if (ce) { - prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); + prop_info = zend_hash_find_ptr(&ce->properties_info, + Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); } } if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { - uint32_t type = MAY_BE_UNDEF | MAY_BE_REF | (ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type))); + uint32_t type = ZEND_TYPE_IS_CLASS(prop_info->type) + ? MAY_BE_OBJECT + : zend_convert_type_code_to_may_be(ZEND_TYPE_CODE(prop_info->type)); if (ZEND_TYPE_ALLOW_NULL(prop_info->type)) { type |= MAY_BE_NULL; @@ -2324,7 +2323,7 @@ static uint32_t zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ss if (pce) { *pce = NULL; } - return 0; + return MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF | MAY_BE_RC1 | MAY_BE_RCN; } static int zend_update_type_info(const zend_op_array *op_array, @@ -2522,11 +2521,7 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { orig = t1; - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, NULL); - if (!t1) { - tmp |= MAY_BE_REF; - t1 = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - } + t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, NULL); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2596,7 +2591,9 @@ static int zend_update_type_info(const zend_op_array *op_array, * anything else results in a null return value. */ tmp |= MAY_BE_NULL; } - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); + + /* The return value must also satisfy the property type */ + t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); if (t1) { tmp &= t1; } @@ -2782,12 +2779,8 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - // TODO: ??? - tmp = MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (t1) { - tmp &= t1; - } + // TODO: If there is no __set we might do better + tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); if (ce) { UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); @@ -2902,6 +2895,7 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } + t2 = OP1_DATA_INFO(); if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION)) { tmp = (MAY_BE_REF | MAY_BE_RCN | MAY_BE_RC1 | t2) & ~MAY_BE_UNDEF; @@ -2911,17 +2905,8 @@ static int zend_update_type_info(const zend_op_array *op_array, if (t2 & MAY_BE_UNDEF) { tmp |= MAY_BE_NULL; } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); if (ssa_ops[i].result_def >= 0) { - // TODO: ??? - t1 = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (t1) { - tmp &= t1; - } UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); - if (ce) { - UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); - } } if ((opline+1)->op1_type == IS_CV) { opline++; @@ -2931,14 +2916,6 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp |= MAY_BE_NULL; } UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); - - tmp = OP1_INFO(); - if (tmp & (MAY_BE_ANY | MAY_BE_REF)) { - if (tmp & MAY_BE_RC1) { - tmp |= MAY_BE_RCN; - } - } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } break; case ZEND_BIND_GLOBAL: @@ -3457,21 +3434,13 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = zend_fetch_prop_info(op_array, ssa, opline, i, &ce); - if (tmp) { - UPDATE_SSA_TYPE_EX(tmp, ssa_ops[i].result_def, 1); - if (ce) { - UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); - } - } else { - tmp = MAY_BE_ANY | MAY_BE_ARRAY_KEY_ANY | MAY_BE_ARRAY_OF_ANY | MAY_BE_ARRAY_OF_REF; - if (opline->opcode == ZEND_FETCH_OBJ_R || opline->opcode == ZEND_FETCH_OBJ_IS) { - /* can't be REF because of ZVAL_COPY_DEREF() usage */ - tmp |= MAY_BE_RC1 | MAY_BE_RCN; - } else { - tmp |= MAY_BE_REF | MAY_BE_RC1 | MAY_BE_RCN | MAY_BE_ERROR; - } - UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + if (opline->opcode != ZEND_FETCH_OBJ_R && opline->opcode != ZEND_FETCH_OBJ_IS) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); } } break; diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 04e398fb75d01..1b776bae78e37 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -629,7 +629,6 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, break; case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: - case ZEND_ASSIGN_OBJ_REF: if (opline->op1_type == IS_CV) { ssa_ops[k].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; @@ -643,6 +642,22 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, //NEW_SSA_VAR(next->op1.var) } break; + case ZEND_ASSIGN_OBJ_REF: + if (opline->op1_type == IS_CV) { + ssa_ops[k].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(opline->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(opline->op1.var) + } + /* break missing intentionally */ + case ZEND_ASSIGN_STATIC_PROP: + if (next->op1_type == IS_CV) { + ssa_ops[k + 1].op1_def = ssa_vars_count; + var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count; + ssa_vars_count++; + //NEW_SSA_VAR(next->op1.var) + } + break; case ZEND_PRE_INC_OBJ: case ZEND_PRE_DEC_OBJ: case ZEND_POST_INC_OBJ: From 062de9d27e731433ed24a5373cc8d1a75fe2ee02 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 27 Jun 2018 22:28:06 +0200 Subject: [PATCH 270/369] Reduce ASSIGN_STATIC_PROP_REF specialization This operation should be very rare... At least drop the OP_DATA specialization. --- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 1178 ++++++--------------------------------- Zend/zend_vm_gen.php | 2 +- Zend/zend_vm_handlers.h | 1112 ++++++++++++++++++------------------ 4 files changed, 726 insertions(+), 1568 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index cf8ca438c6081..7449531e43ff9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2738,7 +2738,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C ZEND_VM_NEXT_OPCODE_EX(1, 2); } -ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC, SPEC(OP_DATA=VAR|CV)) +ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST|VAR, CACHE_SLOT|SRC) { USE_OPLINE zend_free_op free_op_data; diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 5f71475fba57c..a1260ddb63e92 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5284,7 +5284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -5295,85 +5295,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -5388,7 +5321,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -5396,7 +5329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -5414,6 +5347,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -8762,7 +8696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -8773,85 +8707,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -8866,7 +8733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -8874,7 +8741,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -8892,6 +8759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -9717,7 +9585,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -9728,85 +9596,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -9821,7 +9622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -9829,7 +9630,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -9847,6 +9648,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -15271,7 +15073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -15282,85 +15084,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -15375,7 +15110,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -15383,7 +15118,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -15401,6 +15136,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -17687,7 +17423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -17698,18 +17434,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -17724,7 +17460,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -17732,74 +17468,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); - - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -17817,6 +17486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -18386,7 +18056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -18397,85 +18067,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -18490,7 +18093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -18498,7 +18101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -18516,6 +18119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -46627,7 +46231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -46638,85 +46242,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_CONST OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -46731,7 +46268,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -46739,7 +46276,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -46757,6 +46294,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -52232,7 +51770,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -52243,85 +51781,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_VAR OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -52336,7 +51807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -52344,7 +51815,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -52362,6 +51833,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -53825,7 +53297,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS) +static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS) { USE_OPLINE zend_free_op free_op_data; @@ -53836,85 +53308,18 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV SAVE_OPLINE(); if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - value_ptr = _get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); - - if (IS_VAR == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { - prop = &EG(uninitialized_zval); - } else if (IS_VAR == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { - if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - UNDEF_RESULT(); - HANDLE_EXCEPTION(); - } - - /* op_data freed by assign_to_variable */ - ZEND_VM_NEXT_OPCODE_EX(1, 2); - } else { - if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - } - } - zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); - } - - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_COPY(EX_VAR(opline->result.var), prop); - } - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - ZEND_VM_NEXT_OPCODE_EX(1, 2); -} - -static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS) -{ - USE_OPLINE - - zval *prop, *value_ptr; - zend_property_info *prop_info; - zend_type ref_type = 0; - - SAVE_OPLINE(); - - if (zend_fetch_static_property_address(&prop, &prop_info, opline->extended_value & ~ZEND_RETURNS_FUNCTION, BP_VAR_W, 0 OPLINE_CC EXECUTE_DATA_CC) != SUCCESS) { - + FREE_UNFETCHED_OP((opline+1)->op1_type, (opline+1)->op1.var); UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value_ptr = _get_zval_ptr_cv_BP_VAR_W((opline+1)->op1.var EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); - if (IS_CV == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { + if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); - } else if (IS_CV == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { + } else if ((opline+1)->op1_type == IS_VAR && (opline->extended_value & ZEND_RETURNS_FUNCTION) && UNEXPECTED(!Z_ISREF_P(value_ptr))) { if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr, IS_UNUSED OPLINE_CC EXECUTE_DATA_CC))) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; UNDEF_RESULT(); HANDLE_EXCEPTION(); } @@ -53929,7 +53334,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (old_type) { if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } @@ -53937,7 +53342,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { ZVAL_DEREF(value_ptr); zend_throw_ref_type_error(ref_type, value_ptr); - + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { @@ -53955,6 +53360,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZVAL_COPY(EX_VAR(opline->result.var), prop); } + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; ZEND_VM_NEXT_OPCODE_EX(1, 2); } @@ -62060,130 +61466,30 @@ ZEND_API void execute_ex(zend_execute_data *ex) (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, - (void*)&&ZEND_NULL_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_LABEL, + (void*)&&ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_LABEL, (void*)&&ZEND_NULL_LABEL, (void*)&&ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_LABEL, (void*)&&ZEND_NULL_LABEL, @@ -63907,13 +63213,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CONST_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CONST_CONST) @@ -64255,13 +63557,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CONST_VAR) @@ -64407,13 +63705,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED): VM_TRACE(ZEND_INIT_STATIC_METHOD_CALL_SPEC_CONST_UNUSED) @@ -65159,13 +64453,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_TMPVAR_CONST) @@ -65371,13 +64661,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_TMPVAR_VAR) @@ -65471,13 +64757,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV) ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED): VM_TRACE(ZEND_UNSET_VAR_SPEC_TMPVAR_UNUSED) @@ -68453,13 +67735,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV) ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_FAST_CONCAT_SPEC_CV_CONST): VM_TRACE(ZEND_FAST_CONCAT_SPEC_CV_CONST) @@ -69029,13 +68307,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_REF_SPEC_CV_VAR) ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR): VM_TRACE(ZEND_UNSET_STATIC_PROP_SPEC_CV_VAR) @@ -69257,13 +68531,9 @@ ZEND_API void execute_ex(zend_execute_data *ex) VM_TRACE(ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV) ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); - HYBRID_BREAK(); - HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV): - VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); + HYBRID_CASE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED): + VM_TRACE(ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_ARGS_PASSTHRU); HYBRID_BREAK(); HYBRID_CASE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED): VM_TRACE(ZEND_VERIFY_RETURN_TYPE_SPEC_CV_UNUSED) @@ -73368,130 +72638,30 @@ void zend_vm_init(void) ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV_HANDLER, - ZEND_NULL_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR_HANDLER, - ZEND_NULL_HANDLER, - ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_HANDLER, ZEND_NULL_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_HANDLER, + ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_HANDLER, ZEND_NULL_HANDLER, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST_HANDLER, ZEND_NULL_HANDLER, @@ -74688,12 +73858,12 @@ void zend_vm_init(void) 3322 | SPEC_RULE_OP1 | SPEC_RULE_OP2, 3347 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, 3472 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_OP_DATA, - 3722 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3747 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3772 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 3797 | SPEC_RULE_OP1 | SPEC_RULE_OP2, - 4713 + 3597 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3622 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3647 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3672 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 3697 | SPEC_RULE_OP1 | SPEC_RULE_OP2, + 4613 }; #if (ZEND_VM_KIND == ZEND_VM_KIND_HYBRID) zend_opcode_handler_funcs = labels; @@ -74896,7 +74066,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3723 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74904,7 +74074,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3748 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74912,7 +74082,7 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3773 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; if (op->op1_type < op->op2_type) { zend_swap_operands(op); } @@ -74923,17 +74093,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3798 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3823 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 3848 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_MUL: @@ -74944,17 +74114,17 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3973 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3873 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_LONG && op2_info == MAY_BE_LONG) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 3998 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3898 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; + spec = 3923 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_EQUAL: @@ -74965,12 +74135,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4048 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 3948 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4123 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4023 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_NOT_EQUAL: @@ -74981,12 +74151,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4198 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4098 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4273 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; + spec = 4173 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH | SPEC_RULE_COMMUTATIVE; } break; case ZEND_IS_SMALLER: @@ -74994,12 +74164,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4348 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4248 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4423 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4323 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_IS_SMALLER_OR_EQUAL: @@ -75007,70 +74177,70 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4498 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4398 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } else if (op1_info == MAY_BE_DOUBLE && op2_info == MAY_BE_DOUBLE) { if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4573 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; + spec = 4473 | SPEC_RULE_OP1 | SPEC_RULE_OP2 | SPEC_RULE_SMART_BRANCH; } break; case ZEND_QM_ASSIGN: if (op1_info == MAY_BE_DOUBLE) { - spec = 4666 | SPEC_RULE_OP1; + spec = 4566 | SPEC_RULE_OP1; } else if (!(op1_info & ((MAY_BE_ANY|MAY_BE_UNDEF)-(MAY_BE_NULL|MAY_BE_FALSE|MAY_BE_TRUE|MAY_BE_LONG|MAY_BE_DOUBLE)))) { - spec = 4671 | SPEC_RULE_OP1; + spec = 4571 | SPEC_RULE_OP1; } break; case ZEND_PRE_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4648 | SPEC_RULE_RETVAL; + spec = 4548 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4650 | SPEC_RULE_RETVAL; + spec = 4550 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4652 | SPEC_RULE_RETVAL; + spec = 4552 | SPEC_RULE_RETVAL; } break; case ZEND_PRE_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4654 | SPEC_RULE_RETVAL; + spec = 4554 | SPEC_RULE_RETVAL; } else if (op1_info == MAY_BE_LONG) { - spec = 4656 | SPEC_RULE_RETVAL; + spec = 4556 | SPEC_RULE_RETVAL; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4658 | SPEC_RULE_RETVAL; + spec = 4558 | SPEC_RULE_RETVAL; } break; case ZEND_POST_INC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4660; + spec = 4560; } else if (op1_info == MAY_BE_LONG) { - spec = 4661; + spec = 4561; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4662; + spec = 4562; } break; case ZEND_POST_DEC: if (res_info == MAY_BE_LONG && op1_info == MAY_BE_LONG) { - spec = 4663; + spec = 4563; } else if (op1_info == MAY_BE_LONG) { - spec = 4664; + spec = 4564; } else if (op1_info == (MAY_BE_LONG|MAY_BE_DOUBLE)) { - spec = 4665; + spec = 4565; } break; case ZEND_JMP: if (OP_JMP_ADDR(op, op->op1) > op) { - spec = 3822; + spec = 3722; } break; case ZEND_SEND_VAR_EX: if (op->op2.num <= MAX_ARG_FLAG_NUM && (op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4706 | SPEC_RULE_OP1; + spec = 4606 | SPEC_RULE_OP1; } break; case ZEND_FE_FETCH_R: if (op->op2_type == IS_CV && (op1_info & (MAY_BE_UNDEF|MAY_BE_ANY|MAY_BE_REF)) == MAY_BE_ARRAY) { - spec = 4711 | SPEC_RULE_RETVAL; + spec = 4611 | SPEC_RULE_RETVAL; } break; case ZEND_FETCH_DIM_R: @@ -75078,12 +74248,12 @@ ZEND_API void ZEND_FASTCALL zend_vm_set_opcode_handler_ex(zend_op* op, uint32_t if (op->op1_type == IS_CONST && op->op2_type == IS_CONST) { break; } - spec = 4676 | SPEC_RULE_OP1 | SPEC_RULE_OP2; + spec = 4576 | SPEC_RULE_OP1 | SPEC_RULE_OP2; } break; case ZEND_SEND_VAR: if ((op1_info & (MAY_BE_UNDEF|MAY_BE_REF)) == 0) { - spec = 4701 | SPEC_RULE_OP1; + spec = 4601 | SPEC_RULE_OP1; } break; case ZEND_BW_OR: diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index aec2d627742dc..7146ad0b46cb9 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -571,7 +571,7 @@ ); $op_data_get_zval_ptr_ptr = array( - "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, execute_data, &free_op_data, \\1)", + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1 EXECUTE_DATA_CC)", "TMP" => "NULL", "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)", "CONST" => "NULL", diff --git a/Zend/zend_vm_handlers.h b/Zend/zend_vm_handlers.h index 7221718470066..ed2cdb9304ac4 100644 --- a/Zend/zend_vm_handlers.h +++ b/Zend/zend_vm_handlers.h @@ -1833,565 +1833,553 @@ _(3588, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_TMP) \ _(3589, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_VAR) \ _(3591, ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_VAR) \ - _(3601, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST_OP_DATA_CV) \ - _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_VAR) \ - _(3611, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR_OP_DATA_CV) \ - _(3614, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_VAR) \ - _(3616, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED_OP_DATA_CV) \ - _(3624, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ - _(3626, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ - _(3634, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ - _(3636, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ - _(3639, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ - _(3641, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ - _(3649, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_VAR) \ - _(3651, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST_OP_DATA_CV) \ - _(3659, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_VAR) \ - _(3661, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR_OP_DATA_CV) \ - _(3664, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_VAR) \ - _(3666, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED_OP_DATA_CV) \ - _(3699, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_VAR) \ - _(3701, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST_OP_DATA_CV) \ - _(3709, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_VAR) \ - _(3711, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR_OP_DATA_CV) \ - _(3714, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_VAR) \ - _(3716, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED_OP_DATA_CV) \ - _(3722, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3724, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3725, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3727, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3729, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3730, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3732, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3734, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3735, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3742, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ - _(3744, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ - _(3745, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3747, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3749, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3750, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3752, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3754, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3755, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3757, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3759, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3760, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3767, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ - _(3769, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ - _(3770, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3772, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3774, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3775, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3777, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3779, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3780, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3782, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3784, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3785, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3792, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ - _(3794, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ - _(3795, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3797, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ - _(3799, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ - _(3800, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ - _(3802, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3804, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3805, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3807, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ - _(3809, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ - _(3810, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ - _(3817, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ - _(3819, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ - _(3820, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ - _(3822, ZEND_JMP_FORWARD_SPEC) \ - _(3828, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3829, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3830, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3832, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3833, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3834, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3835, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3837, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3843, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3844, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3845, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3847, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3853, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3854, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3855, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3857, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3858, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3859, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3860, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3862, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3868, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ - _(3869, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3870, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3872, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3878, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3879, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3880, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3882, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3883, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3884, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3885, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3887, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3893, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3894, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3895, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3897, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3899, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3900, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3902, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ - _(3903, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3904, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3905, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3907, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3908, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3909, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3910, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3912, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3918, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3919, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3920, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3922, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3924, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3925, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3927, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ - _(3928, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3929, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3930, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3932, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3933, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3934, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3935, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3937, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3943, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ - _(3944, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3945, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3947, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(3949, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3950, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3952, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(3953, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3954, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3955, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3957, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3958, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3959, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3960, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3962, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3968, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(3969, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3970, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3972, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(3978, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3979, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3980, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3982, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3983, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3984, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3985, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3987, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3993, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ - _(3994, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3995, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(3997, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ - _(4003, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4004, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4005, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4007, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4008, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4009, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4010, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4012, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4018, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ - _(4019, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4020, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4022, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4028, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4029, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4030, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4032, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4033, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4034, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4035, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4037, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4043, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4044, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4045, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4047, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4063, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4064, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4065, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4066, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4067, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4068, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4069, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4070, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4071, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4075, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4076, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4077, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4078, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4079, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4080, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4081, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4082, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4083, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4084, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4085, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4086, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4090, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4091, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4092, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4108, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4109, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4110, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4111, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4112, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4113, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4114, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4115, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4116, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4120, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4121, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4122, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4138, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4139, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4140, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4141, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4142, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4143, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4144, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4145, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4146, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4150, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4151, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4152, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4153, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4154, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4155, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4156, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4157, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4158, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4159, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4160, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4161, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4165, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4166, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4167, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4183, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4184, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4185, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4186, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4187, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4188, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4189, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4190, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4191, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4195, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4196, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4197, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4213, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4214, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4215, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4216, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4217, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4218, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4219, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4220, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4221, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4225, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4226, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4227, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4228, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4229, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4230, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4231, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4232, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4233, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4234, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4235, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4236, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4240, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4241, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4242, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4258, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4259, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4260, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4261, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4262, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4263, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4264, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4265, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4266, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4270, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4271, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4272, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4288, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4289, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4290, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4291, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4292, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4293, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4294, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4295, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4296, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4300, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4301, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4302, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4303, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4304, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4305, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4306, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4307, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4308, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4309, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4310, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4311, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4315, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4316, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4317, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4333, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4334, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4335, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4336, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4337, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4338, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4339, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4340, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4341, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4345, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4346, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4347, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4351, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4352, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4353, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4354, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4355, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4356, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4360, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ - _(4361, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4362, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4363, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4364, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4365, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4366, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4367, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4368, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4369, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4370, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4371, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4375, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4376, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4377, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4378, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4379, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4380, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4381, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4382, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4383, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4384, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4385, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4386, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4390, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4391, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4392, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4408, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ - _(4409, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4410, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4411, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4412, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4413, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4414, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4415, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4416, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4420, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4421, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4422, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4426, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4427, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4428, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4429, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4430, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4431, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4435, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4436, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4437, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4438, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4439, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4440, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4441, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4442, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4443, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4444, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4445, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4446, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4450, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4451, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4452, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4453, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4454, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4455, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4456, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4457, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4458, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4459, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4460, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4461, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4465, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4466, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4467, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4483, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4484, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4485, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4486, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4487, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4488, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4489, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4490, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4491, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4495, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4496, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4497, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4501, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4502, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4503, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4504, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4505, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4506, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4510, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ - _(4511, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4512, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4513, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4514, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4515, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4516, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4517, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4518, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4519, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4520, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4521, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4525, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4526, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4527, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4528, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4529, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4530, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4531, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4532, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4533, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4534, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4535, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4536, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4540, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4541, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4542, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4558, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ - _(4559, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4560, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4561, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4562, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4563, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4564, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4565, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4566, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4570, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ - _(4571, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4572, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4576, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4577, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4578, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4579, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4580, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4581, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4585, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ - _(4586, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ - _(4587, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ - _(4588, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4589, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4590, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4591, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4592, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4593, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4594, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4595, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4596, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4600, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4601, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4602, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4603, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4604, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4605, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4606, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4607, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4608, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4609, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4610, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4611, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4615, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4616, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4617, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4633, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ - _(4634, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ - _(4635, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ - _(4636, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4637, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4638, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4639, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4640, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4641, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4645, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ - _(4646, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ - _(4647, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ - _(4648, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4649, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4650, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4651, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4652, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4653, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4654, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4655, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ - _(4656, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4657, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ - _(4658, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ - _(4659, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ - _(4660, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4661, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ - _(4662, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4663, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ - _(4664, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ - _(4665, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ - _(4666, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ - _(4667, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4668, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4670, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ - _(4671, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ - _(4672, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4673, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4675, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ - _(4677, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4678, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4680, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ - _(4681, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4682, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4683, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4685, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4686, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ - _(4687, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4688, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4690, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ - _(4696, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ - _(4697, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4698, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4700, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ - _(4703, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ - _(4705, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ - _(4708, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ - _(4710, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ - _(4711, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ - _(4712, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ - _(4712+1, ZEND_NULL) + _(3597, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_CONST) \ + _(3599, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_VAR) \ + _(3600, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CONST_UNUSED) \ + _(3602, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3604, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3605, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3607, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_CONST) \ + _(3609, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_VAR) \ + _(3610, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TMPVAR_UNUSED) \ + _(3617, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_CONST) \ + _(3619, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_VAR) \ + _(3620, ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV_UNUSED) \ + _(3622, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3624, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3625, ZEND_PRE_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3627, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3629, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3630, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3632, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3634, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3635, ZEND_PRE_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3642, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3644, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3645, ZEND_PRE_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3647, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3649, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3650, ZEND_PRE_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3652, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3654, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3655, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3657, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3659, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3660, ZEND_PRE_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3667, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3669, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3670, ZEND_PRE_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3672, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3674, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3675, ZEND_POST_INC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3677, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3679, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3680, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3682, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3684, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3685, ZEND_POST_INC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3692, ZEND_POST_INC_STATIC_PROP_SPEC_CV_CONST) \ + _(3694, ZEND_POST_INC_STATIC_PROP_SPEC_CV_VAR) \ + _(3695, ZEND_POST_INC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3697, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_CONST) \ + _(3699, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_VAR) \ + _(3700, ZEND_POST_DEC_STATIC_PROP_SPEC_CONST_UNUSED) \ + _(3702, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3704, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3705, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3707, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_CONST) \ + _(3709, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_VAR) \ + _(3710, ZEND_POST_DEC_STATIC_PROP_SPEC_TMPVAR_UNUSED) \ + _(3717, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_CONST) \ + _(3719, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_VAR) \ + _(3720, ZEND_POST_DEC_STATIC_PROP_SPEC_CV_UNUSED) \ + _(3722, ZEND_JMP_FORWARD_SPEC) \ + _(3728, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3729, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3730, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3732, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3733, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3734, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3735, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3737, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3743, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3744, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3745, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3747, ZEND_ADD_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3753, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3754, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3755, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3757, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3758, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3759, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3760, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3762, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3768, ZEND_ADD_LONG_SPEC_TMPVARCV_CONST) \ + _(3769, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3770, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3772, ZEND_ADD_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3778, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3779, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3780, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3782, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3783, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3784, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3785, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3787, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3793, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3794, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3795, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3797, ZEND_ADD_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3799, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3800, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3802, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_CONST_TMPVARCV) \ + _(3803, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3804, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3805, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3807, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3808, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3809, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3810, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3812, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3818, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3819, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3820, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3822, ZEND_SUB_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3824, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3825, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3827, ZEND_SUB_LONG_SPEC_CONST_TMPVARCV) \ + _(3828, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3829, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3830, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3832, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3833, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3834, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3835, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3837, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3843, ZEND_SUB_LONG_SPEC_TMPVARCV_CONST) \ + _(3844, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3845, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3847, ZEND_SUB_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3849, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3850, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3852, ZEND_SUB_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(3853, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3854, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3855, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3857, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3858, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3859, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3860, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3862, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3868, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3869, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3870, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3872, ZEND_SUB_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3878, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3879, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3880, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3882, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3883, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3884, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3885, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3887, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3893, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_CONST) \ + _(3894, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3895, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3897, ZEND_MUL_LONG_NO_OVERFLOW_SPEC_TMPVARCV_TMPVARCV) \ + _(3903, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3904, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3905, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3907, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3908, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3909, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3910, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3912, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3918, ZEND_MUL_LONG_SPEC_TMPVARCV_CONST) \ + _(3919, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3920, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3922, ZEND_MUL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3928, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3929, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3930, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3932, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3933, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3934, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3935, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3937, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3943, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(3944, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3945, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3947, ZEND_MUL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(3963, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3964, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3965, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3966, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3967, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3968, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3969, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3970, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3971, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3975, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3976, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3977, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3978, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(3979, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(3980, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(3981, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3982, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3983, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3984, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3985, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3986, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(3990, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(3991, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(3992, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4008, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4009, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4010, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4011, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4012, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4013, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4014, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4015, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4016, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4020, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4021, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4022, ZEND_IS_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4038, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4039, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4040, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4041, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4042, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4043, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4044, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4045, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4046, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4050, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4051, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4052, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4053, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4054, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4055, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4056, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4057, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4058, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4059, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4060, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4061, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4065, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4066, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4067, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4083, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4084, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4085, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4086, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4087, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4088, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4089, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4090, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4091, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4095, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4096, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4097, ZEND_IS_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4113, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4114, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4115, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4116, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4117, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4118, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4119, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4120, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4121, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4125, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4126, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4127, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4128, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4129, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4130, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4131, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4132, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4133, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4134, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4135, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4136, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4140, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4141, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4142, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4158, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4159, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4160, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4161, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4162, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4163, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4164, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4165, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4166, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4170, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4171, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4172, ZEND_IS_NOT_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4188, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4189, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4190, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4191, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4192, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4193, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4194, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4195, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4196, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4200, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4201, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4202, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4203, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4204, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4205, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4206, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4207, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4208, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4209, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4210, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4211, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4215, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4216, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4217, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4233, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4234, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4235, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4236, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4237, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4238, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4239, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4240, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4241, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4245, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4246, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4247, ZEND_IS_NOT_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4251, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4252, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4253, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4254, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4255, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4256, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4260, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV) \ + _(4261, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4262, ZEND_IS_SMALLER_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4263, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4264, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4265, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4266, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4267, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4268, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4269, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4270, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4271, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4275, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4276, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4277, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4278, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4279, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4280, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4281, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4282, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4283, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4284, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4285, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4286, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4290, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4291, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4292, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4308, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST) \ + _(4309, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4310, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4311, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4312, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4313, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4314, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4315, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4316, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4320, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4321, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4322, ZEND_IS_SMALLER_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4326, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4327, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4328, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4329, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4330, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4331, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4335, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4336, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4337, ZEND_IS_SMALLER_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4338, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4339, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4340, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4341, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4342, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4343, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4344, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4345, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4346, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4350, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4351, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4352, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4353, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4354, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4355, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4356, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4357, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4358, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4359, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4360, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4361, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4365, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4366, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4367, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4383, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4384, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4385, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4386, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4387, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4388, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4389, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4390, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4391, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4395, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4396, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4397, ZEND_IS_SMALLER_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4401, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4402, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4403, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4404, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4405, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4406, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4410, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV) \ + _(4411, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4412, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4413, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4414, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4415, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4416, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4417, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4418, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4419, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4420, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4421, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4425, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4426, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4427, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4428, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4429, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4430, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4431, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4432, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4433, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4434, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4435, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4436, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4440, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4441, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4442, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4458, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST) \ + _(4459, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4460, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4461, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4462, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4463, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4464, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4465, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4466, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4470, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV) \ + _(4471, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4472, ZEND_IS_SMALLER_OR_EQUAL_LONG_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4476, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4477, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4478, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4479, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4480, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4481, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4485, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV) \ + _(4486, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPZ) \ + _(4487, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_CONST_TMPVARCV_JMPNZ) \ + _(4488, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4489, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4490, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4491, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4492, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4493, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4494, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4495, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4496, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4500, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4501, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4502, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4503, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4504, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4505, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4506, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4507, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4508, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4509, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4510, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4511, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4515, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4516, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4517, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4533, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST) \ + _(4534, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPZ) \ + _(4535, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_CONST_JMPNZ) \ + _(4536, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4537, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4538, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4539, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4540, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4541, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4545, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV) \ + _(4546, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPZ) \ + _(4547, ZEND_IS_SMALLER_OR_EQUAL_DOUBLE_SPEC_TMPVARCV_TMPVARCV_JMPNZ) \ + _(4548, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4549, ZEND_PRE_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4550, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4551, ZEND_PRE_INC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4552, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4553, ZEND_PRE_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4554, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4555, ZEND_PRE_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV_RETVAL_USED) \ + _(4556, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4557, ZEND_PRE_DEC_LONG_SPEC_TMPVARCV_RETVAL_USED) \ + _(4558, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_UNUSED) \ + _(4559, ZEND_PRE_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV_RETVAL_USED) \ + _(4560, ZEND_POST_INC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4561, ZEND_POST_INC_LONG_SPEC_TMPVARCV) \ + _(4562, ZEND_POST_INC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4563, ZEND_POST_DEC_LONG_NO_OVERFLOW_SPEC_TMPVARCV) \ + _(4564, ZEND_POST_DEC_LONG_SPEC_TMPVARCV) \ + _(4565, ZEND_POST_DEC_LONG_OR_DOUBLE_SPEC_TMPVARCV) \ + _(4566, ZEND_QM_ASSIGN_DOUBLE_SPEC_CONST) \ + _(4567, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4568, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4570, ZEND_QM_ASSIGN_DOUBLE_SPEC_TMPVARCV) \ + _(4571, ZEND_QM_ASSIGN_NOREF_SPEC_CONST) \ + _(4572, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4573, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4575, ZEND_QM_ASSIGN_NOREF_SPEC_TMPVARCV) \ + _(4577, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4578, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4580, ZEND_FETCH_DIM_R_INDEX_SPEC_CONST_TMPVARCV) \ + _(4581, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4582, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4583, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4585, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4586, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_CONST) \ + _(4587, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4588, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4590, ZEND_FETCH_DIM_R_INDEX_SPEC_TMPVAR_TMPVARCV) \ + _(4596, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_CONST) \ + _(4597, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4598, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4600, ZEND_FETCH_DIM_R_INDEX_SPEC_CV_TMPVARCV) \ + _(4603, ZEND_SEND_VAR_SIMPLE_SPEC_VAR) \ + _(4605, ZEND_SEND_VAR_SIMPLE_SPEC_CV) \ + _(4608, ZEND_SEND_VAR_EX_SIMPLE_SPEC_VAR) \ + _(4610, ZEND_SEND_VAR_EX_SIMPLE_SPEC_CV) \ + _(4611, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_UNUSED) \ + _(4612, ZEND_FE_FETCH_R_SIMPLE_SPEC_VAR_CV_RETVAL_USED) \ + _(4612+1, ZEND_NULL) From c91ea1579279e74c8e1c0e86f276d4d05b6a77a2 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 27 Jun 2018 22:49:15 +0200 Subject: [PATCH 271/369] Accept BP type in get_static_property And move the initialization check in there, so it's automatically handled everywhere using this function. --- Zend/zend_API.c | 4 ++-- Zend/zend_execute.c | 12 +----------- Zend/zend_object_handlers.c | 30 +++++++++++++++++++++--------- Zend/zend_object_handlers.h | 2 +- ext/reflection/php_reflection.c | 5 +++-- 5 files changed, 28 insertions(+), 25 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 6f105f7f6f9ae..40064abc8e2e7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4110,7 +4110,7 @@ ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *na zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, 0, &prop_info); + property = zend_std_get_static_property(scope, key, BP_VAR_W, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); if (!property) { @@ -4237,7 +4237,7 @@ ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *na zend_string *key = zend_string_init(name, name_length, 0); EG(fake_scope) = scope; - property = zend_std_get_static_property(scope, key, silent, &prop_info); + property = zend_std_get_static_property(scope, key, silent ? BP_VAR_IS : BP_VAR_R, &prop_info); EG(fake_scope) = old_scope; zend_string_efree(key); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 225d295931d04..81970706afc35 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2658,7 +2658,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } } - *retval = zend_std_get_static_property(ce, name, fetch_type == BP_VAR_IS, &property_info); + *retval = zend_std_get_static_property(ce, name, fetch_type, &property_info); if (UNEXPECTED(op1_type != IS_CONST)) { zend_tmp_string_release(tmp_name); @@ -2697,16 +2697,6 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { - const char *class_name, *prop_name; - zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", - ZSTR_VAL(property_info->ce->name), - prop_name); - return FAILURE; - } - if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 569878fea1676..8662d292b6d10 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1514,23 +1514,24 @@ static void zend_intenal_class_init_statics(zend_class_entry *class_type) /* {{{ } } /* }}} */ -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent, zend_property_info **property_info) /* {{{ */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type, zend_property_info **property_info_ptr) /* {{{ */ { zval *ret; - *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); + zend_property_info *property_info = zend_hash_find_ptr(&ce->properties_info, property_name); + *property_info_ptr = property_info; - if (UNEXPECTED(*property_info == NULL)) { + if (UNEXPECTED(property_info == NULL)) { goto undeclared_property; } - if (UNEXPECTED(!zend_verify_property_access(*property_info, ce))) { - if (!silent) { - zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string((*property_info)->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); + if (UNEXPECTED(!zend_verify_property_access(property_info, ce))) { + if (type != BP_VAR_IS) { + zend_throw_error(NULL, "Cannot access %s property %s::$%s", zend_visibility_string(property_info->flags), ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } - if (UNEXPECTED(((*property_info)->flags & ZEND_ACC_STATIC) == 0)) { + if (UNEXPECTED((property_info->flags & ZEND_ACC_STATIC) == 0)) { goto undeclared_property; } @@ -1546,15 +1547,26 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p zend_intenal_class_init_statics(ce); } else { undeclared_property: - if (!silent) { + if (type != BP_VAR_IS) { zend_throw_error(NULL, "Access to undeclared static property: %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); } return NULL; } } - ret = CE_STATIC_MEMBERS(ce) + (*property_info)->offset; + ret = CE_STATIC_MEMBERS(ce) + property_info->offset; ZVAL_DEINDIRECT(ret); + + if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) + && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { + zend_throw_exception_ex(zend_ce_type_error, + ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_name)); + return NULL; + } + return ret; } /* }}} */ diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 14a2fc524ce11..23b51b364b357 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -175,7 +175,7 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key); -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, zend_bool silent, struct _zend_property_info **prop_info); +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info); ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name); ZEND_API zend_function *zend_std_get_constructor(zend_object *object); ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent); diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 7a2d84c3f6364..b5cd5f07b7802 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3927,7 +3927,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, 1, &prop_info); + prop = zend_std_get_static_property(ce, name, BP_VAR_IS, &prop_info); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3962,8 +3962,9 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, 1, &prop_info); + variable_ptr = zend_std_get_static_property(ce, name, BP_VAR_W, &prop_info); if (!variable_ptr) { + zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, "Class %s does not have a property named %s", ZSTR_VAL(ce->name), ZSTR_VAL(name)); return; From 50b1cf30e97c76c159cdd826b845c145be76d45a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 28 Jun 2018 15:15:34 +0000 Subject: [PATCH 272/369] Prevent type violations via array auto-promotion --- .../typed_properties_083.phpt | 72 +++ Zend/zend_compile.c | 55 ++- Zend/zend_compile.h | 3 +- Zend/zend_execute.c | 50 +- Zend/zend_vm_def.h | 21 +- Zend/zend_vm_execute.h | 452 ++++++++++++++---- Zend/zend_vm_gen.php | 2 + Zend/zend_vm_opcodes.c | 4 +- Zend/zend_vm_opcodes.h | 1 + ext/opcache/Optimizer/compact_literals.c | 14 +- ext/opcache/Optimizer/zend_optimizer.c | 6 +- 11 files changed, 537 insertions(+), 143 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_083.phpt diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt new file mode 100644 index 0000000000000..bcf304404486e --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -0,0 +1,72 @@ +--TEST-- +Test array promotion does not violate type restrictions +--FILE-- +i[] = 1; +var_dump($a->i); + +try { + $a->p[] = "test"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +try { // must be uninit + var_dump($a->p); +} catch (TypeError $e) { var_dump($e->getMessage()); } + +Foo::$a["bar"] = 2; +var_dump(Foo::$a); + +try { + Foo::$s["baz"][] = "baz"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +try { // must be uninit + var_dump(Foo::$s); +} catch (TypeError $e) { var_dump($e->getMessage()); } + +Foo::$a = null; +$ref = &Foo::$a; +$ref[] = 3; +var_dump($ref); + +$ref = &$a->p; +try { + $ref[] = "bar"; +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +try { + $ref["baz"][] = "bar"; // indirect assign +} catch (TypeError $e) { var_dump($e->getMessage()); } +var_dump($ref); + +?> +--EXPECT-- +array(1) { + [0]=> + int(1) +} +string(71) "Cannot write an array to a null property which does not allow for array" +string(65) "Typed property Foo::$p must not be accessed before initialization" +array(1) { + ["bar"]=> + int(2) +} +string(71) "Cannot write an array to a null property which does not allow for array" +string(72) "Typed static property Foo::$s must not be accessed before initialization" +array(1) { + [0]=> + int(3) +} +string(81) "Cannot write an array to a null or false reference which does not allow for array" +NULL +string(81) "Cannot write an array to a null or false reference which does not allow for array" +NULL diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index c537afec78a1c..6c77eccfb2ce0 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2612,7 +2612,7 @@ static zend_bool is_this_fetch(zend_ast *ast) /* {{{ */ } /* }}} */ -static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ +static zend_op *zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, int delayed) /* {{{ */ { if (is_this_fetch(ast)) { zend_op *opline = zend_emit_op(result, ZEND_FETCH_THIS, NULL, NULL); @@ -2620,9 +2620,11 @@ static void zend_compile_simple_var(znode *result, zend_ast *ast, uint32_t type, opline->result_type = IS_TMP_VAR; result->op_type = IS_TMP_VAR; } + return opline; } else if (zend_try_compile_cv(result, ast) == FAILURE) { - zend_compile_simple_var_no_cv(result, ast, type, delayed); + return zend_compile_simple_var_no_cv(result, ast, type, delayed); } + return NULL; } /* }}} */ @@ -2640,7 +2642,7 @@ static void zend_separate_if_call_and_write(znode *node, zend_ast *ast, uint32_t } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref); +zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref); void zend_compile_assign(znode *result, zend_ast *ast); static inline void zend_emit_assign_znode(zend_ast *var_ast, znode *value_node) /* {{{ */ @@ -2661,7 +2663,11 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t znode var_node, dim_node; - zend_delayed_compile_var(&var_node, var_ast, type, 0); + opline = zend_delayed_compile_var(&var_node, var_ast, type, 0); + if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { + opline->extended_value |= ZEND_FETCH_DIM_WRITE; + } + zend_separate_if_call_and_write(&var_node, var_ast, type); if (dim_ast == NULL) { @@ -2679,6 +2685,7 @@ static zend_op *zend_delayed_compile_dim(znode *result, zend_ast *ast, uint32_t opline = zend_delayed_emit_op(result, ZEND_FETCH_DIM_R, &var_node, &dim_node); zend_adjust_for_fetch_type(opline, result, type); + return opline; } /* }}} */ @@ -8496,35 +8503,31 @@ void zend_compile_expr(znode *result, zend_ast *ast) /* {{{ */ } /* }}} */ -void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ +zend_op *zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) /* {{{ */ { CG(zend_lineno) = zend_ast_get_lineno(ast); switch (ast->kind) { case ZEND_AST_VAR: - zend_compile_simple_var(result, ast, type, 0); - return; + return zend_compile_simple_var(result, ast, type, 0); case ZEND_AST_DIM: - zend_compile_dim(result, ast, type); - return; + return zend_compile_dim(result, ast, type); case ZEND_AST_PROP: - zend_compile_prop(result, ast, type, by_ref); - return; + return zend_compile_prop(result, ast, type, by_ref); case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, by_ref, 0); - return; + return zend_compile_static_prop(result, ast, type, by_ref, 0); case ZEND_AST_CALL: zend_compile_call(result, ast, type); - return; + return NULL; case ZEND_AST_METHOD_CALL: zend_compile_method_call(result, ast, type); - return; + return NULL; case ZEND_AST_STATIC_CALL: zend_compile_static_call(result, ast, type); - return; + return NULL; case ZEND_AST_ZNODE: *result = *zend_ast_get_znode(ast); - return; + return NULL; default: if (type == BP_VAR_W || type == BP_VAR_RW || type == BP_VAR_UNSET) { zend_error_noreturn(E_COMPILE_ERROR, @@ -8532,34 +8535,30 @@ void zend_compile_var(znode *result, zend_ast *ast, uint32_t type, int by_ref) / } zend_compile_expr(result, ast); - return; + return NULL; } } /* }}} */ -void zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */ +zend_op *zend_delayed_compile_var(znode *result, zend_ast *ast, uint32_t type, zend_bool by_ref) /* {{{ */ { switch (ast->kind) { case ZEND_AST_VAR: - zend_compile_simple_var(result, ast, type, 1); - return; + return zend_compile_simple_var(result, ast, type, 1); case ZEND_AST_DIM: - zend_delayed_compile_dim(result, ast, type); - return; + return zend_delayed_compile_dim(result, ast, type); case ZEND_AST_PROP: { zend_op *opline = zend_delayed_compile_prop(result, ast, type); if (by_ref) { opline->extended_value |= ZEND_FETCH_REF; } - return; + return opline; } case ZEND_AST_STATIC_PROP: - zend_compile_static_prop(result, ast, type, by_ref, 1); - return; + return zend_compile_static_prop(result, ast, type, by_ref, 1); default: - zend_compile_var(result, ast, type, 0); - return; + return zend_compile_var(result, ast, type, 0); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 5ca95e3f18a6e..1c6a7bf831e96 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -133,7 +133,7 @@ typedef union _zend_parser_stack_elem { void zend_compile_top_stmt(zend_ast *ast); void zend_compile_stmt(zend_ast *ast); void zend_compile_expr(znode *node, zend_ast *ast); -void zend_compile_var(znode *node, zend_ast *ast, uint32_t type, int by_ref); +zend_op *zend_compile_var(znode *node, zend_ast *ast, uint32_t type, int by_ref); void zend_eval_const_expr(zend_ast **ast_ptr); void zend_const_expr_to_zval(zval *result, zend_ast *ast); @@ -879,6 +879,7 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe #define ZEND_FETCH_REF (1<<0) +#define ZEND_FETCH_DIM_WRITE (1<<1) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 81970706afc35..231b3c1019be5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2127,7 +2127,7 @@ static zend_never_inline zval* ZEND_FASTCALL zend_fetch_dimension_address_inner_ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval *container, zval *dim, int dim_type, int type EXECUTE_DATA_DC) { - zval *retval; + zval *retval, *orig_container = container; if (EXPECTED(Z_TYPE_P(container) == IS_ARRAY)) { try_array: @@ -2208,8 +2208,13 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * } if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { - array_init(container); - goto fetch_from_array; + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_container), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_container)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_container)), + "Cannot write an array to a null or false reference which does not allow for array"); + } else { + array_init(container); + goto fetch_from_array; + } } else { /* for read-mode only */ ZVAL_NULL(result); @@ -2507,7 +2512,7 @@ static zend_never_inline int ZEND_FASTCALL zend_isempty_dim_slow(zval *container } } -static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t by_ref OPLINE_DC) +static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags OPLINE_DC) { zval *ptr; @@ -2538,9 +2543,10 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if (by_ref + if (flags && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) - && Z_TYPE_P(ptr) != IS_REFERENCE) { + && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) + || ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))))) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2549,6 +2555,15 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); } if (UNEXPECTED(prop_info)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { + if (!zend_verify_ref_type_assignable(prop_info->type, IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), + "Cannot write an array to a null property which does not allow for array"); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + } + return; + } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); ZVAL_UNDEF(ptr); @@ -2683,7 +2698,7 @@ static zend_never_inline int zend_fetch_static_property_address_ex(zval **retval } -static zend_always_inline int zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int by_ref OPLINE_DC EXECUTE_DATA_DC) { +static zend_always_inline int zend_fetch_static_property_address(zval **retval, zend_property_info **prop_info, uint32_t cache_slot, int fetch_type, int flags OPLINE_DC EXECUTE_DATA_DC) { int success; zend_property_info *property_info; @@ -2697,15 +2712,22 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if (by_ref && UNEXPECTED(property_info) && Z_TYPE_P(*retval) != IS_REFERENCE) { - zval *ref = *retval; - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { - zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + if (flags && UNEXPECTED(property_info)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Cannot write an array to a null property which does not allow for array"); return FAILURE; } - ZVAL_NEW_REF(ref, ref); - Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { + zval *ref = *retval; + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + return FAILURE; + } + ZVAL_NEW_REF(ref, ref); + Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + } } if (prop_info) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7449531e43ff9..8096a3d8546b6 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1762,7 +1762,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -1785,7 +1785,7 @@ ZEND_VM_HANDLER(173, ZEND_FETCH_STATIC_PROP_R, CONST|TMPVAR|CV, UNUSED|CLASS_FET ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_R); } -ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|CACHE_SLOT) +ZEND_VM_HANDLER(174, ZEND_FETCH_STATIC_PROP_W, CONST|TMPVAR|CV, UNUSED|CLASS_FETCH|CONST|VAR, FETCH_REF|DIM_WRITE|CACHE_SLOT) { ZEND_VM_DISPATCH_TO_HELPER(zend_fetch_static_prop_helper, type, BP_VAR_W); } @@ -2056,7 +2056,7 @@ ZEND_VM_C_LABEL(fetch_obj_r_no_object): ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); } -ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|CACHE_SLOT) +ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH_REF|DIM_WRITE|CACHE_SLOT) { USE_OPLINE zend_free_op free_op1, free_op2; @@ -2071,7 +2071,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -2466,14 +2466,14 @@ ZEND_VM_HANDLER(147, ZEND_ASSIGN_DIM, VAR|CV, CONST|TMPVAR|UNUSED|NEXT|CV, SPEC( { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); + orig_object_ptr = object_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { ZEND_VM_C_LABEL(try_assign_dim_array): @@ -2528,6 +2528,15 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + FREE_UNFETCHED_OP2(); + FREE_UNFETCHED_OP_DATA(); + FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); ZEND_VM_C_GOTO(try_assign_dim_array); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1260ddb63e92..b22252397e7bf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4738,7 +4738,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8437,7 +8437,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -9311,7 +9311,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14568,7 +14568,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17164,7 +17164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17797,7 +17797,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -25060,7 +25060,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -25717,14 +25717,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25778,6 +25778,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25804,14 +25813,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25866,6 +25875,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25892,14 +25910,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -25954,6 +25972,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -25980,14 +26007,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -26041,6 +26068,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -27881,7 +27917,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28539,14 +28575,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28600,6 +28636,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28626,14 +28671,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28688,6 +28733,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28714,14 +28768,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28776,6 +28830,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -28802,14 +28865,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -28863,6 +28926,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30410,14 +30482,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30471,6 +30543,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30497,14 +30578,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30559,6 +30640,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30585,14 +30675,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30647,6 +30737,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -30673,14 +30772,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -30734,6 +30833,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32167,7 +32275,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32824,14 +32932,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -32885,6 +32993,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32911,14 +33028,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -32973,6 +33090,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -32999,14 +33125,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -33061,6 +33187,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -33087,14 +33222,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA { USE_OPLINE zend_free_op free_op1; - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -33148,6 +33283,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -34750,7 +34894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -36824,7 +36968,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -39524,7 +39668,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -44366,7 +44510,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -44650,7 +44794,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -45609,14 +45753,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45670,6 +45814,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45696,14 +45849,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45758,6 +45911,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45784,14 +45946,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45846,6 +46008,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -45872,14 +46043,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -45933,6 +46104,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49149,7 +49329,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49902,14 +50082,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -49963,6 +50143,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -49989,14 +50178,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50051,6 +50240,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50077,14 +50275,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2, free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50139,6 +50337,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -50165,14 +50372,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op2; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -50226,6 +50433,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -51406,7 +51622,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -52639,7 +52855,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_REF, type, opline->extended_value & ZEND_FETCH_REF OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -52951,14 +53167,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53012,6 +53228,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53038,14 +53263,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53100,6 +53325,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53126,14 +53360,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53188,6 +53422,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -53214,14 +53457,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -53275,6 +53518,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -55667,7 +55919,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_REF) : NULL), BP_VAR_W, opline->extended_value & ZEND_FETCH_REF OPLINE_CC); + zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -56418,14 +56670,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56479,6 +56731,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56505,14 +56766,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56567,6 +56828,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56593,14 +56863,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zend_free_op free_op_data; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56655,6 +56925,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { @@ -56681,14 +56960,14 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ { USE_OPLINE - zval *object_ptr; + zval *object_ptr, *orig_object_ptr; zval *value; zval *variable_ptr; zval *dim; SAVE_OPLINE(); - object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); + orig_object_ptr = object_ptr = _get_zval_ptr_cv_undef_BP_VAR_W(opline->op1.var EXECUTE_DATA_CC); if (EXPECTED(Z_TYPE_P(object_ptr) == IS_ARRAY)) { try_assign_dim_array: @@ -56742,6 +57021,15 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { + if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + "Cannot write an array to a null or false reference which does not allow for array"); + + + + UNDEF_RESULT(); + HANDLE_EXCEPTION(); + } ZVAL_ARR(object_ptr, zend_new_array(8)); goto try_assign_dim_array; } else { diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index 7146ad0b46cb9..69f694232f3e0 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -78,6 +78,7 @@ "ZEND_VM_EXT_ARRAY_INIT" => 1<<19, "ZEND_VM_EXT_REF" => 1<<20, "ZEND_VM_EXT_FETCH_REF" => 1<<21, + "ZEND_VM_EXT_DIM_WRITE" => 1<<19, "ZEND_VM_EXT_MASK" => 0x0f000000, "ZEND_VM_EXT_NUM" => 0x01000000, "ZEND_VM_EXT_LAST_CATCH" => 0x02000000, @@ -134,6 +135,7 @@ "FETCH_REF" => ZEND_VM_EXT_FETCH_REF, "SRC" => ZEND_VM_EXT_SRC, "CACHE_SLOT" => ZEND_VM_EXT_CACHE_SLOT, + "DIM_WRITE" => ZEND_VM_EXT_DIM_WRITE, ); $vm_kind_name = array( diff --git a/Zend/zend_vm_opcodes.c b/Zend/zend_vm_opcodes.c index 19c8b2e9d70b4..5f16bb67b6e18 100644 --- a/Zend/zend_vm_opcodes.c +++ b/Zend/zend_vm_opcodes.c @@ -317,7 +317,7 @@ static uint32_t zend_vm_opcodes_flags[206] = { 0x00040757, 0x00010107, 0x00006701, - 0x00240751, + 0x002c0751, 0x00010107, 0x00006701, 0x00040751, @@ -406,7 +406,7 @@ static uint32_t zend_vm_opcodes_flags[206] = { 0x03000000, 0x03000100, 0x00047307, - 0x00247307, + 0x002c7307, 0x00047307, 0x00047307, 0x00247307, diff --git a/Zend/zend_vm_opcodes.h b/Zend/zend_vm_opcodes.h index de2607e4cc2cd..1a1eea813f878 100644 --- a/Zend/zend_vm_opcodes.h +++ b/Zend/zend_vm_opcodes.h @@ -54,6 +54,7 @@ #define ZEND_VM_EXT_ARRAY_INIT 0x00080000 #define ZEND_VM_EXT_REF 0x00100000 #define ZEND_VM_EXT_FETCH_REF 0x00200000 +#define ZEND_VM_EXT_DIM_WRITE 0x00080000 #define ZEND_VM_EXT_MASK 0x0f000000 #define ZEND_VM_EXT_NUM 0x01000000 #define ZEND_VM_EXT_LAST_CATCH 0x02000000 diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index a16cd873925a0..e68c0b8259b30 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -556,12 +556,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_REF); + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); } else { - opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_REF); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_REF; + property_slot[opline->op2.constant] = opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE); } } } @@ -686,17 +686,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 880bbc0ae0b74..4a308537c5e89 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -349,10 +349,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } break; case ZEND_SEND_VAR: @@ -445,7 +445,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION | ZEND_FETCH_REF | ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); } break; case ZEND_INIT_FCALL: From 4ce995d49ea992865161ebe3186a5db83eb002af Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 28 Jun 2018 18:35:18 +0000 Subject: [PATCH 273/369] Fix type check for array promotion check --- Zend/zend_execute.h | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index e9b6741b008f5..6a2b55c61a45a 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -75,6 +75,9 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type type, zend_uchar new_type) { + if (!type) { + return 1; + } zend_uchar cur_type = ZEND_TYPE_CODE(type); return new_type == cur_type || (ZEND_TYPE_ALLOW_NULL(type) && new_type == IS_NULL) From 406d59469f6bf52e05824bc2ac44a2d1cb6c37d1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 28 Jun 2018 23:58:58 +0200 Subject: [PATCH 274/369] Restore fast-path check for uninitialized static property It's not sufficient to check on the slow-path only, as opcache may combine cache entries. --- Zend/zend_execute.c | 14 +++++++++++++- ext/opcache/Optimizer/zend_ssa.c | 2 +- 2 files changed, 14 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 231b3c1019be5..b8e1544393bd9 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2705,6 +2705,18 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (opline->op1_type == IS_CONST && (opline->op2_type == IS_CONST || (opline->op2_type == IS_UNUSED && (opline->op2.num == ZEND_FETCH_CLASS_SELF || opline->op2.num == ZEND_FETCH_CLASS_PARENT))) && EXPECTED(CACHED_PTR(cache_slot) != NULL)) { *retval = CACHED_PTR(cache_slot + sizeof(void *)); property_info = CACHED_PTR(cache_slot + sizeof(void *) * 2); + + if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) + && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { + const char *class_name, *prop_name; + zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); + zend_throw_exception_ex(zend_ce_type_error, + ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), + "Typed static property %s::$%s must not be accessed before initialization", + ZSTR_VAL(property_info->ce->name), + prop_name); + return FAILURE; + } } else { success = zend_fetch_static_property_address_ex(retval, &property_info, cache_slot, fetch_type OPLINE_CC EXECUTE_DATA_CC); if (UNEXPECTED(success != SUCCESS)) { @@ -2712,7 +2724,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } } - if (flags && UNEXPECTED(property_info)) { + if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Cannot write an array to a null property which does not allow for array"); diff --git a/ext/opcache/Optimizer/zend_ssa.c b/ext/opcache/Optimizer/zend_ssa.c index 1b776bae78e37..1c260a8171505 100644 --- a/ext/opcache/Optimizer/zend_ssa.c +++ b/ext/opcache/Optimizer/zend_ssa.c @@ -650,7 +650,7 @@ static int zend_ssa_rename(const zend_op_array *op_array, uint32_t build_flags, //NEW_SSA_VAR(opline->op1.var) } /* break missing intentionally */ - case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: if (next->op1_type == IS_CV) { ssa_ops[k + 1].op1_def = ssa_vars_count; var[EX_VAR_TO_NUM(next->op1.var)] = ssa_vars_count; From 561f868f9cf2c910b3d327ca79eeba6efab6710c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 30 Jun 2018 08:37:10 +0000 Subject: [PATCH 275/369] Add ReflectionProperty::isInitialized() --- ext/reflection/php_reflection.c | 61 +++++++++++++++++++ .../ReflectionProperty_isInitialized.phpt | 34 +++++++++++ 2 files changed, 95 insertions(+) create mode 100644 ext/reflection/tests/ReflectionProperty_isInitialized.phpt diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index f1f640e92fb12..66f33e11e8a33 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5669,6 +5669,62 @@ ZEND_METHOD(reflection_property, setValue) } /* }}} */ +/* {{{ proto public mixed ReflectionProperty::isInitialized([stdclass object]) + Returns this property's value */ +ZEND_METHOD(reflection_property, isInitialized) +{ + reflection_object *intern; + property_reference *ref; + zval *object, *name; + zval *member_p = NULL; + + METHOD_NOTSTATIC(reflection_property_ptr); + GET_REFLECTION_OBJECT_PTR(ref); + + if (!(ref->prop.flags & (ZEND_ACC_PUBLIC | ZEND_ACC_IMPLICIT_PUBLIC)) && intern->ignore_visibility == 0) { + name = _default_load_name(getThis()); + zend_throw_exception_ex(reflection_exception_ptr, 0, + "Cannot access non-public member %s::%s", ZSTR_VAL(intern->ce->name), Z_STRVAL_P(name)); + return; + } + + if (ref->prop.flags & ZEND_ACC_IMPLICIT_PUBLIC) { + RETURN_TRUE; + } + + if (ref->prop.flags & ZEND_ACC_STATIC) { + zend_property_info *dummy; + zend_class_entry *old_scope = EG(fake_scope); + EG(fake_scope) = ref->ce; + member_p = zend_std_get_static_property(ref->ce, ref->unmangled_name, BP_VAR_IS, &dummy); + EG(fake_scope) = old_scope; + + if (member_p) { + ZVAL_DEREF(member_p); + RETURN_BOOL(!Z_ISUNDEF_P(member_p)) + } + RETURN_FALSE; + } else { + zval rv; + + if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &object) == FAILURE) { + return; + } + + if (!instanceof_function(Z_OBJCE_P(object), ref->ce)) { + _DO_THROW("Given object is not an instance of the class this property was declared in"); + /* Returns from this function */ + } + + member_p = zend_read_property_ex(ref->ce, object, ref->unmangled_name, 1, &rv); + RETVAL_BOOL(member_p != &EG(uninitialized_zval)); + if (member_p == &rv) { + zval_ptr_dtor(member_p); + } + } +} +/* }}} */ + /* {{{ proto public ReflectionClass ReflectionProperty::getDeclaringClass() Get the declaring class */ ZEND_METHOD(reflection_property, getDeclaringClass) @@ -6621,6 +6677,10 @@ ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_setValue, 0, 0, 1) ZEND_ARG_INFO(0, value) ZEND_END_ARG_INFO() +ZEND_BEGIN_ARG_INFO_EX(arginfo_reflection_property_isInitialized, 0, 0, 0) + ZEND_ARG_INFO(0, object) +ZEND_END_ARG_INFO() + ZEND_BEGIN_ARG_INFO(arginfo_reflection_property_setAccessible, 0) ZEND_ARG_INFO(0, visible) ZEND_END_ARG_INFO() @@ -6633,6 +6693,7 @@ static const zend_function_entry reflection_property_functions[] = { ZEND_ME(reflection_property, getName, arginfo_reflection__void, 0) ZEND_ME(reflection_property, getValue, arginfo_reflection_property_getValue, 0) ZEND_ME(reflection_property, setValue, arginfo_reflection_property_setValue, 0) + ZEND_ME(reflection_property, isInitialized, arginfo_reflection_property_isInitialized, 0) ZEND_ME(reflection_property, isPublic, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isPrivate, arginfo_reflection__void, 0) ZEND_ME(reflection_property, isProtected, arginfo_reflection__void, 0) diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt new file mode 100644 index 0000000000000..a9aca7765fac6 --- /dev/null +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -0,0 +1,34 @@ +--TEST-- +Test ReflectionProperty::isInitialized() +--FILE-- +isInitialized()); +var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); +var_dump((new ReflectionProperty(A::class, 's'))->isInitialized()); +$a = new A; +$a->d = null; +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'd'))->isInitialized($a)); + +?> +--EXPECT-- +bool(true) +bool(false) +bool(true) +bool(true) +bool(false) +bool(true) +bool(true) + From 04aaea88b975d8a92395badfa8688007b99d17ff Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 30 Jun 2018 12:00:01 +0200 Subject: [PATCH 276/369] Minor cleanups --- Zend/zend_execute.c | 6 ++---- ext/reflection/php_reflection.c | 1 - 2 files changed, 2 insertions(+), 5 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 3398380378cef..b2e927b1a2814 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1705,13 +1705,13 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ prop = Z_REFVAL_P(prop); } - ZVAL_COPY_VALUE(EX_VAR(opline->result.var), prop); + ZVAL_COPY(EX_VAR(opline->result.var), prop); if (UNEXPECTED(ref_type || prop_info)) { /* special case for typed properties */ zval z_copy; - ZVAL_DUP(&z_copy, prop); + ZVAL_COPY(&z_copy, prop); if (inc) { increment_function(&z_copy); } else { @@ -1727,10 +1727,8 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); } zval_ptr_dtor(&z_copy); - Z_TRY_ADDREF_P(prop); /* we copied by value into result.var */ } } else { - zval_opt_copy_ctor(prop); if (inc) { increment_function(prop); } else { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a72a87cb878c3..1dff147560344 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5675,7 +5675,6 @@ ZEND_METHOD(reflection_property, isInitialized) if (ref->prop.flags & ZEND_ACC_STATIC) { member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); if (member_p) { - ZVAL_DEREF(member_p); RETURN_BOOL(!Z_ISUNDEF_P(member_p)) } RETURN_FALSE; From e8dc5114b40a4f6fe9161a6498ae77aeb8da265a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 1 Jul 2018 09:05:55 +0000 Subject: [PATCH 277/369] Fix refcount on std_write_property with coercion --- Zend/zend_object_handlers.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 8662d292b6d10..7ecec0bd3eb78 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -803,17 +803,21 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot); zval tmp, *val; + Z_TRY_ADDREF_P(value); + if (UNEXPECTED(prop_info)) { val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; } value = val; } + found: - zend_assign_to_variable(variable_ptr, value, IS_CV, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); + zend_assign_to_variable(variable_ptr, value, IS_VAR, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); goto exit; } } else if (EXPECTED(IS_DYNAMIC_PROPERTY_OFFSET(property_offset))) { @@ -825,6 +829,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zobj->properties = zend_array_dup(zobj->properties); } if ((variable_ptr = zend_hash_find(zobj->properties, Z_STR_P(member))) != NULL) { + Z_TRY_ADDREF_P(value); goto found; } } From ef67defb72f7524dee24d2b658b3c1def525aaff Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 18:16:31 +0200 Subject: [PATCH 278/369] Fix ReflectionProperty::isInitialized() for dynamic props A dynamic properties may exist at time of ReflectionProperty instantiation but be unset later, so we cannot short-circuit. --- ext/reflection/php_reflection.c | 4 --- .../ReflectionProperty_isInitialized.phpt | 29 +++++++++++++++++-- 2 files changed, 26 insertions(+), 7 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 1dff147560344..2c3e6b5f91c8b 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5668,10 +5668,6 @@ ZEND_METHOD(reflection_property, isInitialized) return; } - if (ref->prop.flags & ZEND_ACC_IMPLICIT_PUBLIC) { - RETURN_TRUE; - } - if (ref->prop.flags & ZEND_ACC_STATIC) { member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); if (member_p) { diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index a9aca7765fac6..ce1b4bd45f819 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -12,23 +12,46 @@ class A { public $n; } +echo "Static properties:\n"; var_dump((new ReflectionProperty(A::class, 'ssv'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 's'))->isInitialized()); + +echo "Declared properties:\n"; $a = new A; -$a->d = null; var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); -var_dump((new ReflectionProperty($a, 'd'))->isInitialized($a)); + +echo "Declared properties after unset:\n"; +unset($a->iv); +unset($a->i); +unset($a->n); +var_dump((new ReflectionProperty($a, 'i'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'iv'))->isInitialized($a)); +var_dump((new ReflectionProperty($a, 'n'))->isInitialized($a)); + +echo "Dynamic properties:\n"; +$a->d = null; +$rp = new ReflectionProperty($a, 'd'); +var_dump($rp->isInitialized($a)); +unset($a->d); +var_dump($rp->isInitialized($a)); ?> --EXPECT-- +Static properties: bool(true) bool(false) bool(true) +Declared properties: bool(true) bool(false) bool(true) +Declared properties after unset: +bool(false) +bool(false) +bool(false) +Dynamic properties: bool(true) - +bool(false) From 050f6424ddd6539ec3ae7d2dc3b3cf0b43d85ea5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 18:40:24 +0200 Subject: [PATCH 279/369] Fix ReflectionProperty::setValue() on typed static property --- Zend/zend_API.c | 20 ++++++++------ .../ReflectionProperty_typed_static.phpt | 27 +++++++++++++++++++ 2 files changed, 39 insertions(+), 8 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index fa9ec2da4c3eb..62af2fd52a1d0 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -4104,7 +4104,7 @@ ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string *name, zval *value) /* {{{ */ { - zval *property; + zval *property, tmp; zend_property_info *prop_info; zend_class_entry *old_scope = EG(fake_scope); @@ -4116,14 +4116,18 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string return FAILURE; } - if (property != value) { - zval garbage; - ZVAL_DEREF(property); - ZVAL_DEREF(value); - ZVAL_COPY_VALUE(&garbage, property); - ZVAL_COPY(property, value); - zval_ptr_dtor(&garbage); + Z_TRY_ADDREF_P(value); + if (prop_info->type) { + zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); + if (UNEXPECTED(!val)) { + zend_verify_property_type_error(prop_info, name, value); + Z_TRY_DELREF_P(value); + return FAILURE; + } + value = val; } + + zend_assign_to_variable(property, value, IS_VAR, /* strict */ 0); return SUCCESS; } /* }}} */ diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index 65e5069218d69..40d595cfd3d5e 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -6,6 +6,7 @@ ReflectionProperty::getValue() on typed static property class Test { public static int $x = 42; public static int $y; + public static $z; } $rp = new ReflectionProperty('Test', 'x'); @@ -18,7 +19,33 @@ try { echo $e->getMessage(), "\n"; } +$rp->setValue("24"); +var_dump($rp->getValue()); + +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + +Test::$z =& Test::$y; + +$rp = new ReflectionProperty('Test', 'z'); +try { + $rp->setValue("foo"); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($rp->getValue()); + + ?> --EXPECT-- int(42) Typed static property Test::$y must not be accessed before initialization +int(24) +Typed property Test::$y must be int, string used +int(24) +Cannot assign string to reference of type int +int(24) From 8355232cbd7ce8730b1d7b24e95f465663b0a4d6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 2 Jul 2018 22:26:52 +0200 Subject: [PATCH 280/369] Fix class check --- ext/reflection/php_reflection.c | 2 +- .../ReflectionProperty_isInitialized.phpt | 30 +++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index dc5e74c20850d..b567cef249b35 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5624,7 +5624,7 @@ ZEND_METHOD(reflection_property, isInitialized) return; } - if (!instanceof_function(Z_OBJCE_P(object), ref->ce)) { + if (!instanceof_function(Z_OBJCE_P(object), ref->prop.ce)) { _DO_THROW("Given object is not an instance of the class this property was declared in"); /* Returns from this function */ } diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index ce1b4bd45f819..587919605dc72 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -10,8 +10,12 @@ class A { public ?int $iv = null; public ?int $i; public $n; + + private int $p; } +class B extends A { } + echo "Static properties:\n"; var_dump((new ReflectionProperty(A::class, 'ssv'))->isInitialized()); var_dump((new ReflectionProperty(A::class, 'ss'))->isInitialized()); @@ -38,6 +42,26 @@ var_dump($rp->isInitialized($a)); unset($a->d); var_dump($rp->isInitialized($a)); +echo "Visibility handling:\n"; +$rp = new ReflectionProperty('A', 'p'); +try { + var_dump($rp->isInitialized($a)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} +$rp->setAccessible(true); +var_dump($rp->isInitialized($a)); + +echo "Object type:\n"; +$rp = new ReflectionProperty('B', 'i'); +var_dump($rp->isInitialized($a)); + +try { + var_dump($rp->isInitialized(new stdClass)); +} catch (ReflectionException $e) { + echo $e->getMessage(), "\n"; +} + ?> --EXPECT-- Static properties: @@ -55,3 +79,9 @@ bool(false) Dynamic properties: bool(true) bool(false) +Visibility handling: +Cannot access non-public member A::$p +bool(false) +Object type: +bool(false) +Given object is not an instance of the class this property was declared in From 13777bd7dbb2ab0f675a2b8838496969efdd5e11 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 2 Jul 2018 22:35:17 +0000 Subject: [PATCH 281/369] References are the intersection of all present property types at any time --- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 4 +- .../typed_properties_044.phpt | 4 +- .../typed_properties_045.phpt | 4 +- .../typed_properties_055.phpt | 2 +- .../typed_properties_062.phpt | 8 +- .../typed_properties_063.phpt | 8 +- .../typed_properties_064.phpt | 8 +- .../typed_properties_065.phpt | 6 +- .../typed_properties_068.phpt | 8 +- .../typed_properties_069.phpt | 2 +- .../typed_properties_078.phpt | 6 +- .../typed_properties_079.phpt | 4 +- .../typed_properties_081.phpt | 4 +- .../typed_properties_082.phpt | 4 +- Zend/zend_API.c | 8 +- Zend/zend_API.h | 11 +- Zend/zend_execute.c | 310 ++- Zend/zend_execute.h | 39 +- Zend/zend_object_handlers.c | 12 +- Zend/zend_objects.c | 4 +- Zend/zend_opcode.c | 2 +- Zend/zend_types.h | 8 - Zend/zend_vm_def.h | 179 +- Zend/zend_vm_execute.h | 1696 +++++++++-------- ext/reflection/php_reflection.c | 9 +- ...ctionClass_setStaticPropertyValue_003.phpt | 8 +- .../ReflectionProperty_typed_static.phpt | 2 +- ext/simplexml/simplexml.c | 4 - 29 files changed, 1251 insertions(+), 1115 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 7ab7afec8ec23..a58c37fd22cb6 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->qux of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index e6cb2ad271d65..d0ecd6d32285d 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -38,11 +38,11 @@ var_dump($foo); ?> --EXPECTF-- int(42) -Cannot assign null to reference of type int +Typed property class@anonymous::$baz must be int, null used int(1) int(10) int(10) -Cannot assign null to reference of type int +Cannot assign null to reference held by property class@anonymous->baz of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 2fe689d95f077..f2632ef09e489 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference of type ?int -Cannot assign float to reference of type ?int +Cannot assign float to reference held by property class@anonymous->bar of type ?int +Cannot assign float to reference held by property class@anonymous->bar of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 830bbb121cb28..96733563e6371 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference of type int +Cannot assign array to reference held by property Foo->bar of type int float(0.5) float(20) -Cannot assign array to reference of type float +Cannot assign array to reference held by property Foo->baz of type float diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index fd4921e07892d..a648d97b63ae6 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -22,7 +22,7 @@ $f($o->a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference of type int in %s:%d +Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A->bar of type int in %s:%d Stack trace: #0 %s(%d): {closure}(2) #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index 2f36daba93e7e..f91e9ab758d7a 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +Cannot assign array to reference held by property class@anonymous->foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index abfde99d5b333..76567d2d7892a 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +Cannot assign array to reference held by property class@anonymous->foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 08bc33a22febb..ae1dbc6deb33b 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign array to reference of type int +Cannot assign array to reference held by property class@anonymous->foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index 0ca8fecba7c16..78276a9d9a10d 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -45,11 +45,11 @@ echo gettype($a->foo),"\n"; --EXPECT-- int(2) int(21) -Cannot assign string to reference of type int +Cannot assign string to reference held by property class@anonymous->foo of type int int(21) int(20) int(19) -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer -Cannot assign float to reference of type int +Cannot assign float to reference held by property class@anonymous->foo of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 2cce66d63564c..97deab9c570ab 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -81,7 +81,7 @@ int(3) int(3) int(4) int(4) -Cannot assign null to reference of type int +Cannot assign null to reference held by property Foo::$i of type int int(4) int(4) Typed property Foo::$i must be int, null used @@ -91,12 +91,12 @@ string(1) "5" int(5) int(0) string(1) "0" -Cannot assign string to reference of type int +Typed property Foo::$i must be int, string used int(0) string(1) "x" -Static property and reference types int and string are not compatible +Static property type int is not compatible with the reference held by property Foo::$s of type string int(0) string(1) "5" -Static property and reference types string and int are not compatible +Static property type string is not compatible with the reference held by property Foo::$i of type int int(0) string(1) "5" diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt index d0afa395bde25..946c316296d06 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -22,7 +22,7 @@ var_dump(nonNumericStringRef()); ?> --EXPECTF-- -Cannot assign string to reference of type int +Typed property Foo::$i must be int, string used Typed static property Foo::$i must not be accessed before initialization string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 062c6b32c993a..3ceb77f91c84f 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -45,15 +45,15 @@ var_dump($ref instanceof ArrayIterator); --EXPECT-- array(0) { } -string(71) "Property and reference types ?Traversable and ?array are not compatible" +string(114) "Property type ?Traversable is not compatible with the reference held by property class@anonymous->a of type ?array" array(0) { } array(1) { [0]=> int(1) } -string(55) "Cannot assign ArrayIterator to reference of type ?array" +string(91) "Cannot assign ArrayIterator to reference held by property class@anonymous->a of type ?array" bool(false) -string(53) "Cannot assign array to reference of type ?Traversable" +string(89) "Cannot assign array to reference held by property class@anonymous->t of type ?Traversable" bool(false) bool(true) diff --git a/Zend/tests/type_declarations/typed_properties_079.phpt b/Zend/tests/type_declarations/typed_properties_079.phpt index 18ebf68762b43..449d6a56f1162 100644 --- a/Zend/tests/type_declarations/typed_properties_079.phpt +++ b/Zend/tests/type_declarations/typed_properties_079.phpt @@ -26,9 +26,9 @@ var_dump($a); ?> --EXPECT-- -string(54) "Cannot assign ArrayIterator to reference of type array" +string(78) "Cannot assign ArrayIterator to reference held by property A::$a of type ?array" array(0) { } -string(45) "Cannot assign int to reference of type ?array" +string(68) "Cannot assign int to reference held by property A::$a of type ?array" NULL diff --git a/Zend/tests/type_declarations/typed_properties_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt index e432b73e31f7d..23b1abf825d89 100644 --- a/Zend/tests/type_declarations/typed_properties_081.phpt +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -13,11 +13,11 @@ $test2 = clone $test; unset($test); try { $x = "foo"; -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($test2->x); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test->x of type int int(42) diff --git a/Zend/tests/type_declarations/typed_properties_082.phpt b/Zend/tests/type_declarations/typed_properties_082.phpt index a42cc5525fd66..1e4e62e89b435 100644 --- a/Zend/tests/type_declarations/typed_properties_082.phpt +++ b/Zend/tests/type_declarations/typed_properties_082.phpt @@ -14,7 +14,7 @@ class Test2 extends Test { $x =& Test::$x; try { $x = "foo"; -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($x, Test::$x); Test::$x =& Test2::$y; // remove the typed ref from $x @@ -23,7 +23,7 @@ var_dump($x, Test::$x); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test::$x of type int int(0) int(0) string(3) "foo" diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 0e97968873df5..834ab62202fc3 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -704,7 +704,7 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons { zval **p = va_arg(*va, zval **); - if (Z_ISREF_P(real_arg) && Z_REFTYPE_P(real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(real_arg), IS_ARRAY)) { + if (Z_ISREF_P(real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(real_arg)) && !zend_verify_ref_assignable_type(Z_REF_P(real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) { return "array"; } @@ -1193,7 +1193,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ } v = zend_verify_property_type(prop_info, &tmp, &tmp2, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!v)) { - zend_verify_property_type_error(prop_info, prop_info->name, &tmp); + zend_verify_property_type_error(prop_info, &tmp); class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; @@ -1261,7 +1261,7 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti val = zend_verify_property_type(property_info, prop, &tmp, 0); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(property_info, key, prop); + zend_verify_property_type_error(property_info, prop); continue; } ZVAL_COPY_VALUE(slot, val); @@ -4127,7 +4127,7 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string if (prop_info->type) { zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, name, value); + zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); return FAILURE; } diff --git a/Zend/zend_API.h b/Zend/zend_API.h index f7ae06fd293e4..66e49aadc1e64 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -679,17 +679,18 @@ END_EXTERN_C() #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { - zend_type ref_type; - if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_TYPE_IS_SET(ref_type = Z_REFTYPE_P(zv)))) { + zend_reference *ref; + if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { + zend_property_info *error_prop; zval tmp; ZVAL_COPY_VALUE(&tmp, arg); - if (zend_verify_ref_type_assignable_zval(ref_type, &tmp, strict)) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, strict)) == NULL)) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { if (!silent) { - zend_throw_ref_type_error(ref_type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); } zval_ptr_dtor(&tmp); return FAILURE; @@ -1186,7 +1187,7 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha /* old "t" */ #define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ Z_PARAM_PROLOGUE(1, separate); \ - if (Z_ISREF_P(_real_arg) && Z_REFTYPE_P(_real_arg) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(_real_arg), IS_ARRAY)) { \ + if (Z_ISREF_P(_real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(_real_arg)) && zend_verify_ref_assignable_type(Z_REF_P(_real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0)) != NULL) { \ _expected_type = Z_EXPECTED_ARRAY; \ error_code = ZPP_ERROR_WRONG_ARG; \ break; \ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c5fbadd5483b6..d1f132e97d63a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -914,7 +914,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z return zend_verify_weak_scalar_type_hint(type_hint, arg, ret); } -ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property) +ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zval *property) { /* we _may_ land here in case reading already errored and runtime cache thus has not been updated (i.e. it contains a valid but unrelated info) */ if (EG(exception)) { @@ -925,7 +925,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be an instance of %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(name), + ZSTR_VAL(info->name), ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", Z_TYPE_P(property) == IS_OBJECT ? @@ -935,7 +935,7 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i zend_throw_exception_ex(zend_ce_type_error, info->type, "Typed property %s::$%s must be %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(name), + ZSTR_VAL(info->name), zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", Z_TYPE_P(property) == IS_OBJECT ? @@ -1015,7 +1015,7 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { zend_uchar cur_type; if (!ZEND_TYPE_IS_SET(type)) { @@ -1023,7 +1023,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } ZVAL_DEREF(zv); - if (zend_verify_ref_type_assignable(type, Z_TYPE_P(zv))) { + if (zend_verify_type_assignable(type, Z_TYPE_P(zv))) { return 1; } @@ -1032,9 +1032,6 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ } cur_type = ZEND_TYPE_CODE(type); - if (cur_type == IS_CALLABLE) { - return zend_is_callable(zv, IS_CALLABLE_CHECK_SILENT, NULL); - } if (cur_type == IS_ITERABLE) { return zend_is_iterable(zv); } @@ -1042,9 +1039,9 @@ static zend_always_inline zend_bool i_zend_verify_ref_type_assignable_zval(zend_ return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { - return i_zend_verify_ref_type_assignable_zval(type, zv, strict); + return i_zend_verify_type_assignable_zval(type, zv, strict); } static zend_always_inline zend_bool zend_check_type( @@ -1053,14 +1050,15 @@ static zend_always_inline zend_bool zend_check_type( zval *default_value, zend_class_entry *scope, zend_bool is_return_type) { - zend_type ref_type = 0; + + zend_reference *ref = NULL; if (!ZEND_TYPE_IS_SET(type)) { return 1; } if (UNEXPECTED(Z_ISREF_P(arg))) { - ref_type = Z_REFTYPE_P(arg); + ref = Z_REF_P(arg); arg = Z_REFVAL_P(arg); } @@ -1094,7 +1092,7 @@ static zend_always_inline zend_bool zend_check_type( } else if (ZEND_TYPE_CODE(type) == _IS_BOOL && EXPECTED(Z_TYPE_P(arg) == IS_FALSE || Z_TYPE_P(arg) == IS_TRUE)) { return 1; - } else if (ref_type) { + } else if (ref && ZEND_REF_HAS_TYPE_SOURCES(ref)) { return 0; /* we cannot have conversions for typed refs */ } else { return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg, arg, @@ -1320,19 +1318,20 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * ZVAL_COPY_VALUE(z, value); } if (UNEXPECTED(Z_ISREF_P(z))) { - zend_type type = Z_REFTYPE_P(z); - zval *ref = Z_REFVAL_P(z); - binary_op(&res, ref, value); - if (type && !zend_verify_ref_type_assignable_zval(type, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zend_throw_ref_type_error(type, &res); + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(z); + zval *refval = Z_REFVAL_P(z); + binary_op(&res, refval, value); + if (ZEND_REF_HAS_TYPE_SOURCES(ref) && (error_prop = zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) != NULL) { + zend_throw_ref_type_error_zval(error_prop, &res); zval_ptr_dtor(&res); if (z == &rv) { zval_ptr_dtor(&rv); } return; } - zval_ptr_dtor(ref); - ZVAL_COPY(ref, &res); + zval_ptr_dtor(refval); + ZVAL_COPY(refval, &res); } else { binary_op(&res, z, value); Z_OBJ_HT_P(object)->write_dimension(object, property, &res); @@ -1627,7 +1626,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, prop); + zend_verify_property_type_error(prop_info, prop); if (inc) { ZVAL_LONG(prop, ZEND_LONG_MAX); } else { @@ -1636,13 +1635,15 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (Z_ISREF_P(prop)) { - ref_type = Z_REFTYPE_P(prop); + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } prop = Z_REFVAL_P(prop); } - if (UNEXPECTED(ref_type || prop_info)) { + if (UNEXPECTED(ref || prop_info)) { /* special case for typed properties */ zval z_copy; @@ -1652,14 +1653,14 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -1692,7 +1693,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, prop); + zend_verify_property_type_error(prop_info, prop); if (inc) { ZVAL_LONG(prop, ZEND_LONG_MAX); } else { @@ -1702,15 +1703,17 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (Z_ISREF_P(prop)) { - ref_type = Z_REFTYPE_P(prop); + if (ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(prop))) { + ref = Z_REF_P(prop); + } prop = Z_REFVAL_P(prop); } ZVAL_COPY(EX_VAR(opline->result.var), prop); - if (UNEXPECTED(ref_type || prop_info)) { + if (UNEXPECTED(ref || prop_info)) { /* special case for typed properties */ zval z_copy; @@ -1720,14 +1723,14 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -2207,8 +2210,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * } if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { - if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_container), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_container)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_container)), + zend_property_info *error_prop; + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_container), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); } else { array_init(container); @@ -2555,9 +2559,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { - if (!zend_verify_ref_type_assignable(prop_info->type, IS_ARRAY)) { + if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property which does not allow for array"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2571,7 +2575,6 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } ZVAL_NEW_REF(ptr, ptr); - Z_REFTYPE_P(ptr) = zend_get_prop_info_ref_type(prop_info); ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ptr), prop_info); } } @@ -2724,7 +2727,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_ref_type_assignable(property_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) + && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) + && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), "Cannot write an array to a null property which does not allow for array"); return FAILURE; @@ -2736,8 +2741,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return FAILURE; } ZVAL_NEW_REF(ref, ref); - Z_REFTYPE_P(ref) = zend_get_prop_info_ref_type(property_info); - ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + if (property_info->type) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); + } } } @@ -2748,126 +2754,118 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Cannot assign %s to reference of type %s%s", - Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), - ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", - ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)) - ); -} - -static zend_always_inline void swap_types(zend_type *type1, zend_type *type2) { - zend_type tmp = *type1; - *type1 = *type2; - *type2 = tmp; -} - -/* Returns intersection type, or type "void" if intersection impossible, or 0 if intersection - * currently not representable. */ -static zend_type compute_intersection_type(zend_type type1, zend_type type2) { - if (type1 == type2) { - return type1; - } +/* detects impossible intersections of types */ +static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { + zend_property_info *prop; - /* If one of the type is "mixed", the intersection is the other type. */ - if (!ZEND_TYPE_IS_SET(type1)) { - return type2; - } else if (!ZEND_TYPE_IS_SET(type2)) { - return type1; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; } - /* Intersection is nullable only if both are nullable. */ - if (ZEND_TYPE_ALLOW_NULL(type1) != ZEND_TYPE_ALLOW_NULL(type2)) { - type1 = ZEND_TYPE_WITHOUT_NULL(type1); - type2 = ZEND_TYPE_WITHOUT_NULL(type2); - } + if (ZEND_TYPE_IS_CLASS(type)) { + /* interfaces can be intersected with any other interface, object and iterable; classes must be */ + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + zend_type prop_type = prop->type; + if (ZEND_TYPE_IS_CLASS(prop_type)) { + if ((!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) || !(ZEND_TYPE_CE(prop_type)->ce_flags & ZEND_ACC_INTERFACE)) + && !instanceof_function(ZEND_TYPE_CE(prop_type), ZEND_TYPE_CE(type)) && !instanceof_function(ZEND_TYPE_CE(type), ZEND_TYPE_CE(prop_type))) { + return prop; + } + } else if (ZEND_TYPE_CODE(prop_type) != IS_OBJECT && (ZEND_TYPE_CODE(prop_type) != IS_ITERABLE || (!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(type), zend_ce_traversable)))) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } else { + switch (ZEND_TYPE_CODE(type)) { + case IS_OBJECT: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!ZEND_TYPE_IS_CLASS(prop->type) && ZEND_TYPE_CODE(prop->type) != IS_OBJECT && ZEND_TYPE_CODE(prop->type) != IS_ITERABLE) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - /* For class types, we can only handle cases where one type is a child of the other. - * Anything else would require full intersection types. */ - if (ZEND_TYPE_IS_CLASS(type1) && ZEND_TYPE_IS_CLASS(type2)) { - if (instanceof_function(ZEND_TYPE_CE(type1), ZEND_TYPE_CE(type2))) { - return type1; - } else if (instanceof_function(ZEND_TYPE_CE(type2), ZEND_TYPE_CE(type1))) { - return type2; - } - return 0; - } + case IS_ARRAY: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - if (ZEND_TYPE_IS_CODE(type1) && ZEND_TYPE_IS_CODE(type2)) { - if (ZEND_TYPE_CODE(type1) == ZEND_TYPE_CODE(type2)) { - return type1; - } + case IS_ITERABLE: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) ? !(ZEND_TYPE_CE(prop->type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(prop->type), zend_ce_traversable) : (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY && ZEND_TYPE_CODE(prop->type) != IS_OBJECT)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; - /* Make sure the smaller code is on the left. */ - if (ZEND_TYPE_CODE(type1) > ZEND_TYPE_CODE(type2)) { - swap_types(&type1, &type2); + case _IS_BOOL: + case IS_LONG: + case IS_DOUBLE: + case IS_STRING: + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_WITHOUT_NULL(prop->type) == ZEND_TYPE_WITHOUT_NULL(type)) { + return NULL; + } + return prop; + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + /* break intentionally missing */ + default: + ZEND_ASSERT(0); } } - - /* Make sure class type (if any) is on the right. */ - if (ZEND_TYPE_IS_CLASS(type1)) { - swap_types(&type1, &type2); - } - - ZEND_ASSERT(ZEND_TYPE_IS_CODE(type1)); - switch (ZEND_TYPE_CODE(type1)) { - case _IS_BOOL: - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - break; - case IS_ARRAY: - if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_ITERABLE) { - return type1; - } - break; - case IS_OBJECT: - if (ZEND_TYPE_IS_CLASS(type2)) { - return type2; - } - break; - case IS_ITERABLE: - if (ZEND_TYPE_IS_CLASS(type2) && - instanceof_function(ZEND_TYPE_CE(type2), zend_ce_traversable)) { - return type2; - } - if (ZEND_TYPE_IS_CODE(type2) && ZEND_TYPE_CODE(type2) == IS_OBJECT) { - return ZEND_TYPE_ENCODE_CLASS(zend_ce_traversable, ZEND_TYPE_ALLOW_NULL(type1)); - } - break; - default: - ZEND_ASSERT(0); - break; - } - - /* Intersection is empty */ - return ZEND_TYPE_ENCODE(IS_VOID, 0); + return NULL; } -static zend_always_inline zend_type i_zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - zend_type intersect_type = compute_intersection_type(old_type, ref_type); - if (EXPECTED(intersect_type != 0 && intersect_type != ZEND_TYPE_ENCODE(IS_VOID, 0))) { - return intersect_type; - } +ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { + return i_zend_verify_ref_assignable_type(ref, type); +} - /* TODO(typed_refs) Throw different errors for "intersection illegal" and "can't represent - * intersection" cases? */ +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type) { zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(ref_type) ? IS_OBJECT : ZEND_TYPE_CODE(ref_type), - "%s and reference types %s%s and %s%s are not compatible", + zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type), + "%s type %s%s is not compatible with the reference held by property %s%s%s of type %s%s", source, - ZEND_TYPE_ALLOW_NULL(ref_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(ref_type) ? ZSTR_VAL(ZEND_TYPE_CE(ref_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(ref_type)), - ZEND_TYPE_ALLOW_NULL(old_type) ? "?" : "", - ZEND_TYPE_IS_CLASS(old_type) ? ZSTR_VAL(ZEND_TYPE_CE(old_type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(old_type)) + ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", + ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)), + ZSTR_VAL(prop->ce->name), + (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop->name), + ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + ); +} + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference held by property %s%s%s of type %s%s", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop->ce->name), + (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop->name), + ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) ); - return 0; } -ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type) { - return i_zend_check_typed_assign_typed_ref(source, old_type, ref_type); +static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { + zend_property_info *prop; + + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + + return NULL; +} + +ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) +{ + return i_zend_verify_ref_assignable_zval(ref, zv, strict); } ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) @@ -2894,23 +2892,22 @@ ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_li list->ptr[list->num++] = prop; } -ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) { zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); - zend_type type = 0; - zend_property_info **end, **ptr; + zend_property_info **ptr; if (!ZEND_PROPERTY_INFO_SOURCE_IS_LIST(source_list->list)) { ZEND_ASSERT(source_list->ptr == prop); source_list->ptr = NULL; - return 0; + return; } if (list->num == 1) { ZEND_ASSERT(*list->ptr == prop); efree(list); source_list->ptr = NULL; - return 0; + return; } --list->num; @@ -2921,17 +2918,10 @@ ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *sour } *ptr = list->ptr[list->num]; - ptr = list->ptr, end = ptr + list->num; - do { - type = compute_intersection_type(type, (*ptr)->type); - } while (++ptr != end); - if (list->num >= 4 && list->num * 4 == list->num_allocated) { list->num_allocated = list->num * 2; source_list->list = ZEND_PROPERTY_INFO_SOURCE_FROM_LIST(erealloc(list, sizeof(zend_property_info_list) + (list->num_allocated - 1) * sizeof(zend_property_info *))); } - - return type; } static zend_never_inline void zend_fetch_this_var(int type OPLINE_DC EXECUTE_DATA_DC) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 6a2b55c61a45a..1f4dee0ce5e6b 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -58,7 +58,7 @@ ZEND_API void ZEND_FASTCALL zend_check_internal_arg_type(zend_function *zf, uint ZEND_API int ZEND_FASTCALL zend_check_arg_type(zend_function *zf, uint32_t arg_num, zval *arg, zval *default_value, void **cache_slot); ZEND_API ZEND_COLD void ZEND_FASTCALL zend_missing_arg_error(zend_execute_data *execute_data); -ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type old_type, zend_type ref_type); +ZEND_API zend_type zend_check_typed_assign_typed_ref(const char *source, zend_type type, zend_reference *ref); ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info); @@ -74,7 +74,7 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in } /* do not call when new_type == IS_REFERENCE or new_type == IS_OBJECT! */ -static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type type, zend_uchar new_type) { +static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, zend_uchar new_type) { if (!type) { return 1; } @@ -85,8 +85,20 @@ static zend_always_inline zend_bool zend_verify_ref_type_assignable(zend_type ty || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } -ZEND_API zend_bool zend_verify_ref_type_assignable_zval(zend_type type, zval *zv, zend_bool strict); -ZEND_API ZEND_COLD void zend_throw_ref_type_error(zend_type type, zval *zv); +ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); +ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); + +ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv); +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type); + +#define ZEND_REF_TYPE_SOURCES(ref) \ + (ref)->sources + +#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ + (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) + +ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value, zend_uchar value_type, zend_bool strict) { @@ -103,14 +115,15 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval zend_refcounted *garbage; if (Z_ISREF_P(variable_ptr)) { - if (UNEXPECTED(Z_REFTYPE_P(variable_ptr))) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { + zend_property_info *error_prop; zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); if (need_copy) { ZVAL_COPY(&tmp, value); value = &tmp; } - if (!zend_verify_ref_type_assignable_zval(Z_REFTYPE_P(variable_ptr), value, strict)) { - zend_throw_ref_type_error(Z_REFTYPE_P(variable_ptr), value); + if ((error_prop = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) != NULL) { + zend_throw_ref_type_error_zval(error_prop, value); zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } @@ -471,16 +484,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in } zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); -ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zend_string *name, zval *property); - -#define ZEND_REF_TYPE_SOURCES(ref) \ - (ref)->sources - -#define ZEND_REF_HAS_TYPE_SOURCES(ref) \ - (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) - -ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); -ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); +ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property); #define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \ zend_ref_add_type_source(&ZEND_REF_TYPE_SOURCES(ref), source) @@ -514,6 +518,7 @@ ZEND_API zend_type zend_ref_del_type_source(zend_property_info_source_list *sour } \ } while (0) + END_EXTERN_C() #endif /* ZEND_EXECUTE_H */ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 7ecec0bd3eb78..6c7c38e761d8f 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -733,8 +733,10 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void zval *val = retval; if (Z_ISREF_P(val)) { + zend_property_info *error_prop; /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ - if (zend_check_typed_assign_typed_ref("Property", Z_REFTYPE_P(val), zend_get_prop_info_ref_type(prop_info)) == 0) { + if ((error_prop = zend_verify_ref_assignable_type(Z_REF_P(val), zend_get_prop_info_ref_type(prop_info)))) { + zend_throw_ref_type_error_type("Property", error_prop, zend_get_prop_info_ref_type(prop_info)); goto exit; } /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ @@ -742,7 +744,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), val); + zend_verify_property_type_error(prop_info, val); } } goto exit; @@ -808,7 +810,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(prop_info)) { val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; @@ -879,7 +881,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(member), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); goto exit; } @@ -1097,7 +1099,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, Z_STR_P(member)); if (UNEXPECTED(prop_info->type)) { - Z_REFTYPE_P(slot) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } } zval_ptr_dtor(slot); diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index 41c2f65068c55..2a06c491a4fcf 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -59,7 +59,7 @@ ZEND_API void zend_object_std_dtor(zend_object *object) zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { - Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); break; /* stop iteration here, the array might be realloc()'ed */ } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); @@ -203,7 +203,7 @@ ZEND_API void ZEND_FASTCALL zend_objects_clone_members(zend_object *new_object, i_zval_ptr_dtor(dst ZEND_FILE_LINE_CC); ZVAL_COPY_VALUE(dst, src); zval_add_ref(dst); - if (UNEXPECTED(Z_ISREF_P(dst)) && UNEXPECTED(Z_REFTYPE_P(dst) != NULL)) { + if (UNEXPECTED(Z_ISREF_P(dst))) { zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(dst), prop_info) { if (prop_info->ce == new_object->ce && dst == OBJ_PROP(new_object, prop_info->offset)) { diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index acf2a1d5708b5..7c7851ab42e38 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -244,7 +244,7 @@ ZEND_API void destroy_zend_class(zval *zv) zend_property_info *prop_info; ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { if (prop_info->ce == ce && p - ce->default_static_members_table == prop_info->offset) { - Z_REFTYPE_P(p) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); break; /* stop iteration here, the array might be realloc()'ed */ } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); diff --git a/Zend/zend_types.h b/Zend/zend_types.h index c9b88abb8930c..1391e17cc7cbc 100644 --- a/Zend/zend_types.h +++ b/Zend/zend_types.h @@ -404,7 +404,6 @@ typedef union { struct _zend_reference { zend_refcounted_h gc; zval val; - zend_type type; zend_property_info_source_list sources; }; @@ -722,9 +721,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { #define Z_REFVAL(zval) &Z_REF(zval)->val #define Z_REFVAL_P(zval_p) Z_REFVAL(*(zval_p)) -#define Z_REFTYPE(zval) Z_REF(zval)->type -#define Z_REFTYPE_P(zval_p) Z_REFTYPE(*(zval_p)) - #define Z_AST(zval) (zval).value.ast #define Z_AST_P(zval_p) Z_AST(*(zval_p)) @@ -890,7 +886,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { (zend_reference *) emalloc(sizeof(zend_reference)); \ GC_SET_REFCOUNT(_ref, 1); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ - _ref->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ @@ -902,7 +897,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, 1); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, r); \ - _ref->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ @@ -915,7 +909,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_SET_REFCOUNT(_ref, (refcount)); \ GC_TYPE_INFO(_ref) = IS_REFERENCE; \ ZVAL_COPY_VALUE(&_ref->val, _z); \ - _ref->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(_z) = _ref; \ Z_TYPE_INFO_P(_z) = IS_REFERENCE_EX; \ @@ -928,7 +921,6 @@ static zend_always_inline uint32_t zval_gc_info(uint32_t gc_type_info) { GC_TYPE_INFO(_ref) = IS_REFERENCE | \ (GC_PERSISTENT << GC_FLAGS_SHIFT); \ ZVAL_COPY_VALUE(&_ref->val, r); \ - _ref->type = 0; \ _ref->sources.ptr = NULL; \ Z_REF_P(z) = _ref; \ Z_TYPE_INFO_P(z) = IS_REFERENCE_EX; \ diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 5eafcada6c925..f957b91125913 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -834,10 +834,12 @@ ZEND_VM_C_LABEL(assign_op_object): ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -847,19 +849,19 @@ ZEND_VM_C_LABEL(assign_op_object): } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -891,7 +893,8 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -908,24 +911,25 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -936,7 +940,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), prop); } - + FREE_OP_DATA(); /* assign_static_prop has two opcodes! */ ZEND_VM_NEXT_OPCODE_EX(1, 2); @@ -977,16 +981,17 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (OP2_TYPE != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP2(); FREE_OP(free_op_data1); @@ -1070,25 +1075,26 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1397,7 +1403,7 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1422,25 +1428,26 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1460,7 +1467,7 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1485,25 +1492,26 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -1523,7 +1531,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1544,7 +1553,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1552,8 +1561,8 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1567,7 +1576,8 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1588,7 +1598,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -1596,8 +1606,8 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -2315,7 +2325,7 @@ ZEND_VM_C_LABEL(assign_object): if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); FREE_OP2(); FREE_OP1_VAR_PTR(); @@ -2436,7 +2446,7 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -2528,8 +2538,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array): FREE_OP_DATA(); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); @@ -2694,7 +2705,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -2705,20 +2716,23 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2726,13 +2740,12 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2753,7 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -2778,31 +2791,31 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -6479,7 +6492,7 @@ ZEND_VM_HANDLER(126, ZEND_FE_FETCH_RW, VAR, ANY, JMP_ADDR) zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); if (UNEXPECTED(prop_info)) { ZVAL_NEW_REF(value, value); - Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); value_type = IS_REFERENCE_EX; } } @@ -7844,7 +7857,7 @@ ZEND_VM_C_LABEL(check_indirect): if (UNEXPECTED(!Z_ISREF_P(value))) { ZVAL_MAKE_REF_EX(value, 2); ref = Z_REF_P(value); - ref->type = 0; + ref->sources.ptr = NULL; } else { ref = Z_REF_P(value); GC_ADDREF(ref); @@ -8250,7 +8263,7 @@ ZEND_VM_HANDLER(183, ZEND_BIND_STATIC, CV, CONST, REF) GC_SET_REFCOUNT(ref, 2); GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); - ref->type = 0; + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 2f2ef1d602494..599a7d12c3ba3 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4530,7 +4530,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -4547,24 +4548,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -5102,7 +5104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5154,7 +5156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5206,7 +5208,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5258,7 +5260,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -5290,7 +5292,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -5315,31 +5317,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -7107,7 +7109,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -7124,24 +7127,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -8510,7 +8514,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8562,7 +8566,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8614,7 +8618,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8666,7 +8670,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -8698,7 +8702,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -8723,31 +8727,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -8980,7 +8984,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -8997,24 +9002,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -9399,7 +9405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9451,7 +9457,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9503,7 +9509,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9555,7 +9561,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -9587,7 +9593,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -9612,31 +9618,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -14885,7 +14891,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -14937,7 +14943,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -14989,7 +14995,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -15041,7 +15047,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -15073,7 +15079,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -15098,31 +15104,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17231,7 +17237,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17283,7 +17289,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17335,7 +17341,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17387,7 +17393,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17419,7 +17425,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -17444,31 +17450,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17864,7 +17870,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17916,7 +17922,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -17968,7 +17974,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -18020,7 +18026,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -18052,7 +18058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -18077,31 +18083,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -20172,7 +20178,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -20189,24 +20196,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -20738,7 +20746,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -20755,24 +20764,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -21437,7 +21447,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -21454,24 +21465,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -22407,7 +22419,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22432,25 +22444,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22470,7 +22483,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22495,25 +22508,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22533,7 +22547,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22558,25 +22572,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22596,7 +22611,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22621,25 +22636,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -22659,7 +22675,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22680,7 +22697,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22688,8 +22705,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -22703,7 +22720,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22724,7 +22742,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -22732,8 +22750,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -23735,7 +23753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FE_FETCH_RW_SPEC_VAR_HANDLER(Z zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(array), p->key, NULL); if (UNEXPECTED(prop_info)) { ZVAL_NEW_REF(value, value); - Z_REFTYPE_P(value) = zend_get_prop_info_ref_type(prop_info); + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(value), prop_info); value_type = IS_REFERENCE_EX; } } @@ -24187,10 +24205,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -24200,19 +24220,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -24244,7 +24264,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -24261,24 +24282,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -24330,16 +24352,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -24422,25 +24445,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -25183,7 +25207,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25324,7 +25348,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25465,7 +25489,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25606,7 +25630,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -25766,8 +25790,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -25863,8 +25888,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -25960,8 +25986,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -26056,8 +26083,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26201,7 +26229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -26212,20 +26240,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26233,13 +26264,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26312,7 +26342,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -26323,20 +26353,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26344,13 +26377,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -27038,10 +27070,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -27051,19 +27085,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -27095,7 +27129,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -27112,24 +27147,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -27181,16 +27217,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -27274,25 +27311,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -28039,7 +28077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28180,7 +28218,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28321,7 +28359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28462,7 +28500,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -28622,8 +28660,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28719,8 +28758,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -28816,8 +28856,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -28912,8 +28953,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29001,7 +29043,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -29012,20 +29054,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -29033,13 +29078,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29112,7 +29156,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -29123,20 +29167,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -29144,13 +29191,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -30063,7 +30109,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -30080,24 +30127,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -30149,16 +30197,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -30527,8 +30576,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30624,8 +30674,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -30721,8 +30772,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -30817,8 +30869,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -31551,10 +31604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -31564,19 +31619,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -31635,16 +31690,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31727,25 +31783,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -32394,7 +32451,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32535,7 +32592,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32676,7 +32733,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32817,7 +32874,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -32977,8 +33034,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33074,8 +33132,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -33171,8 +33230,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -33267,8 +33327,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33460,7 +33521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -33471,20 +33532,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33492,13 +33556,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33571,7 +33634,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -33582,20 +33645,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33603,13 +33669,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -34479,10 +34544,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -34492,19 +34559,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -35082,7 +35149,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -35223,7 +35290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35364,7 +35431,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35505,7 +35572,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -35658,7 +35725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -35669,20 +35736,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -35690,13 +35760,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35768,7 +35837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -35779,20 +35848,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -35800,13 +35872,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -36550,10 +36621,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -36563,19 +36636,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -37157,7 +37230,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37298,7 +37371,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37439,7 +37512,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37580,7 +37653,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37733,7 +37806,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -37744,20 +37817,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -37765,13 +37841,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37843,7 +37918,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -37854,20 +37929,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); @@ -37875,13 +37953,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -39253,10 +39330,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -39266,19 +39345,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -39856,7 +39935,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -39997,7 +40076,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40138,7 +40217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40279,7 +40358,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -40432,7 +40511,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -40443,20 +40522,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -40464,13 +40546,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40542,7 +40623,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -40553,20 +40634,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -40574,13 +40658,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -41219,7 +41302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41244,25 +41327,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41281,7 +41365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41306,25 +41390,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41343,7 +41428,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41368,25 +41453,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41405,7 +41491,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41430,25 +41516,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -41467,7 +41554,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41488,7 +41576,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -41496,8 +41584,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41510,7 +41598,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_type ref_type = 0; + zend_property_info *error_prop; + zend_reference *ref = NULL; var_ptr = _get_zval_ptr_cv_undef_BP_VAR_RW(opline->op1.var EXECUTE_DATA_CC); @@ -41531,7 +41620,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } @@ -41539,8 +41628,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(ref_type) && UNEXPECTED(!zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -43649,10 +43738,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -43662,19 +43753,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -43706,7 +43797,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -43723,24 +43815,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -43792,16 +43885,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -43884,25 +43978,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -45005,7 +45100,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -45146,7 +45241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45287,7 +45382,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45428,7 +45523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -45549,7 +45644,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45601,7 +45696,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45653,7 +45748,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45705,7 +45800,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -45796,8 +45891,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -45893,8 +45989,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -45990,8 +46087,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46086,8 +46184,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46231,7 +46330,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -46242,20 +46341,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46263,13 +46365,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46341,7 +46442,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -46352,20 +46453,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -46373,13 +46477,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46399,7 +46502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -46424,31 +46527,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -47378,7 +47481,7 @@ static ZEND_VM_HOT ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_GLOBAL_SPEC_C if (UNEXPECTED(!Z_ISREF_P(value))) { ZVAL_MAKE_REF_EX(value, 2); ref = Z_REF_P(value); - ref->type = 0; + ref->sources.ptr = NULL; } else { ref = Z_REF_P(value); GC_ADDREF(ref); @@ -47446,7 +47549,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_BIND_STATIC_SPEC_CV_CONST_HAND GC_SET_REFCOUNT(ref, 2); GC_TYPE_INFO(ref) = IS_REFERENCE; ZVAL_COPY_VALUE(&ref->val, value); - ref->type = 0; + ref->sources.ptr = NULL; Z_REF_P(value) = ref; Z_TYPE_INFO_P(value) = IS_REFERENCE_EX; ZVAL_REF(variable_ptr, ref); @@ -48289,10 +48392,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -48302,19 +48407,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -48346,7 +48451,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -48363,24 +48469,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -48432,16 +48539,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -48525,25 +48633,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -49538,7 +49647,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49679,7 +49788,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49820,7 +49929,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49961,7 +50070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -50121,8 +50230,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50218,8 +50328,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50315,8 +50426,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50411,8 +50523,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50500,7 +50613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -50511,20 +50624,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -50532,13 +50648,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50610,7 +50725,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -50621,20 +50736,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); zval_ptr_dtor_nogc(free_op2); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); zval_ptr_dtor_nogc(free_op2); @@ -50642,13 +50760,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -51673,7 +51790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51725,7 +51842,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51777,7 +51894,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51829,7 +51946,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -51966,7 +52083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -51991,31 +52108,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -52297,7 +52414,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zend_free_op free_op_data; zval *prop, *value; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; SAVE_OPLINE(); @@ -52314,24 +52432,25 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (UNEXPECTED(Z_ISREF_P(prop))) { - ref_type = Z_REFTYPE_P(prop); + ref = Z_REF_P(prop); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } SEPARATE_ZVAL_NOREF(prop); - if (UNEXPECTED(prop_info->type || ref_type)) { + if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, prop_info->name, &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -52383,16 +52502,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -52955,7 +53075,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53007,7 +53127,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53059,7 +53179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53111,7 +53231,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); UNDEF_RESULT(); HANDLE_EXCEPTION(); @@ -53202,8 +53322,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53299,8 +53420,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -53396,8 +53518,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -53492,8 +53615,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53529,7 +53653,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type ref_type = 0; + zend_type prop_type = 0; SAVE_OPLINE(); @@ -53554,31 +53678,31 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); - - if (old_type) { - if ((ref_type = i_zend_check_typed_assign_typed_ref("Static property", old_type, ref_type)) == 0) { - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); + + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Static property", error_prop, prop_type); + if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } if (UNEXPECTED(Z_REFCOUNTED_P(prop)) && Z_ISREF_P(prop)) { - Z_REFTYPE_P(prop) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info); } } } zend_assign_to_variable_reference(prop, value_ptr); - if (ref_type) { - Z_REFTYPE_P(prop) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -55033,10 +55157,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref; + zend_bool is_typed_ref = 0; if (UNEXPECTED(Z_ISREF_P(zptr))) { - ref_type = Z_REFTYPE_P(zptr); + ref = Z_REF_P(zptr); + is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } SEPARATE_ZVAL_NOREF(zptr); @@ -55046,19 +55172,19 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP } else { prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); } - if (UNEXPECTED(prop_info || ref_type)) { + if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(ref_type ? zend_verify_ref_type_assignable_zval(ref_type, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (ref_type) { - zend_throw_ref_type_error(ref_type, &z_copy); + if (is_typed_ref) { + zend_throw_ref_type_error_zval(prop_info, &z_copy); } else { - zend_verify_property_type_error(prop_info, Z_STR_P(property), &z_copy); + zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); } @@ -55117,16 +55243,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) { - zend_type type = Z_REFTYPE_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - if (UNEXPECTED(type)) { + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(type, &tmp, EX_USES_STRICT_TYPES()))) { + if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error(type, &tmp); + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55209,25 +55336,26 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper ZVAL_NULL(EX_VAR(opline->result.var)); } } else { - zend_type ref_type = 0; + zend_reference *ref = NULL; if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref_type = Z_REFTYPE_P(var_ptr); + ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); } - if (UNEXPECTED(ref_type)) { + if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (EXPECTED(zend_verify_ref_type_assignable_zval(ref_type, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(&old); - } else { - zend_throw_ref_type_error(ref_type, var_ptr); + if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { + zend_throw_ref_type_error_zval(error_prop, var_ptr); zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); + } else { + zval_ptr_dtor(&old); } } else { SEPARATE_ZVAL_NOREF(var_ptr); @@ -56122,7 +56250,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -56263,7 +56391,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56404,7 +56532,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56545,7 +56673,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ if (UNEXPECTED(prop_info != NULL)) { val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, Z_STR_P(property), value); + zend_verify_property_type_error(prop_info, value); @@ -56705,8 +56833,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -56802,8 +56931,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -56899,8 +57029,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zval_ptr_dtor_nogc(free_op_data); } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -56995,8 +57126,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { - if (Z_ISREF_P(orig_object_ptr) && !zend_verify_ref_type_assignable(Z_REFTYPE_P(orig_object_ptr), IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(Z_REFTYPE_P(orig_object_ptr)) ? IS_OBJECT : ZEND_TYPE_CODE(Z_REFTYPE_P(orig_object_ptr)), + zend_property_info *error_prop; + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57188,7 +57320,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -57199,20 +57331,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -57220,13 +57355,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57298,7 +57432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type ref_type = 0; + zend_type prop_type = 0; zend_property_info *prop_info; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { @@ -57309,20 +57443,23 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - ref_type = zend_get_prop_info_ref_type(prop_info); - if (Z_TYPE_P(value_ptr) == IS_REFERENCE) { - zend_type old_type = Z_REFTYPE_P(value_ptr); + zval *val = value_ptr; + prop_type = zend_get_prop_info_ref_type(prop_info); + if (Z_ISREF_P(val)) { + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(val); + val = Z_REFVAL_P(val); - if (old_type && (ref_type = i_zend_check_typed_assign_typed_ref("Property", old_type, ref_type)) == 0) { + if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { + zend_throw_ref_type_error_type("Property", error_prop, prop_type); HANDLE_EXCEPTION(); } } - if (!i_zend_verify_ref_type_assignable_zval(ref_type, value_ptr, EX_USES_STRICT_TYPES())) { - ZVAL_DEREF(value_ptr); - zend_throw_ref_type_error(ref_type, value_ptr); + if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { + zend_verify_property_type_error(prop_info, val); @@ -57330,13 +57467,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - Z_REFTYPE_P(variable_ptr) = ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (ref_type) { - Z_REFTYPE_P(variable_ptr) = ref_type; + if (prop_type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b567cef249b35..b394846a9c507 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3948,17 +3948,18 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } if (Z_ISREF_P(variable_ptr)) { - zend_type ref_type = Z_REFTYPE_P(variable_ptr); + zend_property_info *error_prop; + zend_reference *ref = Z_REF_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if (ref_type && !zend_verify_ref_type_assignable_zval(ref_type, value, 0)) { - zend_throw_ref_type_error(ref_type, value); + if ((error_prop = zend_verify_ref_assignable_zval(ref, value, 0)) != NULL) { + zend_throw_ref_type_error_zval(error_prop, value); return; } } if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { - zend_verify_property_type_error(prop_info, prop_info->name, value); + zend_verify_property_type_error(prop_info, value); return; } diff --git a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt index 524985ec1e88c..a83900a12317e 100644 --- a/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt +++ b/ext/reflection/tests/ReflectionClass_setStaticPropertyValue_003.phpt @@ -12,7 +12,7 @@ $rc = new ReflectionClass('Test'); try { $rc->setStaticPropertyValue("y", "foo"); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump(Test::$y); $rc->setStaticPropertyValue("y", "21"); @@ -23,7 +23,7 @@ Test::$x =& Test::$y; try { $rc->setStaticPropertyValue("x", "foo"); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump(Test::$y); $rc->setStaticPropertyValue("x", "42"); @@ -31,9 +31,9 @@ var_dump(Test::$y); ?> --EXPECT-- -string(48) "Typed property Test::$y must be int, string used" +Typed property Test::$y must be int, string used int(2) int(21) -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test::$y of type int int(21) int(42) diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index 40d595cfd3d5e..cc69dd8230449 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -47,5 +47,5 @@ Typed static property Test::$y must not be accessed before initialization int(24) Typed property Test::$y must be int, string used int(24) -Cannot assign string to reference of type int +Cannot assign string to reference held by property Test::$y of type int int(24) diff --git a/ext/simplexml/simplexml.c b/ext/simplexml/simplexml.c index f4c4a188c9219..b0c567707d335 100644 --- a/ext/simplexml/simplexml.c +++ b/ext/simplexml/simplexml.c @@ -435,7 +435,6 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo int test = 0; int new_value = 0; zend_long cnt = 0; - int retval = SUCCESS; zval tmp_zv, zval_copy; zend_string *trim_str; @@ -628,14 +627,12 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo } else if (!member || Z_TYPE_P(member) == IS_LONG) { if (member && cnt < Z_LVAL_P(member)) { php_error_docref(NULL, E_WARNING, "Cannot add element %s number " ZEND_LONG_FMT " when only " ZEND_LONG_FMT " such elements exist", mynode->name, Z_LVAL_P(member), cnt); - retval = FAILURE; } newnode = xmlNewTextChild(mynode->parent, mynode->ns, mynode->name, value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } } else if (attribs) { if (Z_TYPE_P(member) == IS_LONG) { php_error_docref(NULL, E_WARNING, "Cannot change attribute number " ZEND_LONG_FMT " when only %d attributes exist", Z_LVAL_P(member), nodendx); - retval = FAILURE; } else { newnode = (xmlNodePtr)xmlNewProp(node, (xmlChar *)Z_STRVAL_P(member), value ? (xmlChar *)Z_STRVAL_P(value) : NULL); } @@ -650,7 +647,6 @@ static zval *sxe_prop_dim_write(zval *object, zval *member, zval *value, zend_bo } if (new_value) { zval_ptr_dtor(value); - return new_value; } return value; } From 428a00f4a131f2fe6d139183a7a7b922d6f13c9a Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 2 Jul 2018 22:47:59 +0000 Subject: [PATCH 282/369] Fix a last test --- ext/standard/tests/array/extract_typed_ref.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index d329f2b7b1055..f480a410946b9 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -13,11 +13,11 @@ $i =& $test->i; $s =& $test->s; try { extract(['i' => 'foo', 's' => 42]); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (TypeError $e) { echo $e->getMessage(), "\n"; } var_dump($test->i, $test->s); ?> --EXPECT-- -string(45) "Cannot assign string to reference of type int" +Cannot assign string to reference held by property Test->i of type int int(0) string(2) "42" From e888cf14b485bc10ae9e0d4eda74e4c5312db180 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 20:55:15 +0200 Subject: [PATCH 283/369] Remove 't' zpp type The 't' type will not be usable by extensions. Replace it with zend_try_array_init(_size) functions. --- Zend/zend_API.c | 12 ------------ Zend/zend_API.h | 22 ++++++++++++++++++++++ ext/enchant/enchant.c | 8 +++++--- ext/intl/idn/idn.c | 8 +++++--- ext/ldap/ldap.c | 25 +++++++++++++++++-------- ext/mbstring/mbstring.c | 9 +++++---- ext/mbstring/php_mbregex.c | 8 +++++--- ext/oci8/oci8_interface.c | 19 ++++++++++++------- ext/odbc/php_odbc.c | 9 +++++---- ext/openssl/openssl.c | 26 +++++++++++++++++--------- ext/pcntl/pcntl.c | 34 +++++++++++++++++++++------------- ext/soap/soap.c | 12 ++++++++---- ext/sockets/sockets.c | 10 +++++++--- ext/standard/dns_win32.c | 29 +++++++++++++++++++---------- ext/xml/xml.c | 14 +++++++++----- 15 files changed, 157 insertions(+), 88 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 834ab62202fc3..004421dde1550 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -700,18 +700,6 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons } break; - case 't': - { - zval **p = va_arg(*va, zval **); - - if (Z_ISREF_P(real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(real_arg)) && !zend_verify_ref_assignable_type(Z_REF_P(real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) { - return "array"; - } - - zend_parse_arg_zval_deref(arg, p, check_null); - } - break; - case 'o': { zval **p = va_arg(*va, zval **); diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 66e49aadc1e64..c6308cf4f3c7d 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -774,6 +774,28 @@ static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { zend_try_assign(zv, &_zv); \ } while (0) +/* Initializes a reference to an empty array and returns dereferenced zval, + * or NULL if the initialization failed. */ +static zend_always_inline zval *zend_try_array_init(zval *zv) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(0)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + +static zend_always_inline zval *zend_try_array_init_size(zval *zv, size_t size) { + zval tmp; + ZVAL_ARR(&tmp, zend_new_array(size)); + if (UNEXPECTED(zend_try_assign(zv, &tmp) == FAILURE)) { + return NULL; + } + ZVAL_DEREF(zv); + return zv; +} + /* Fast parameter parsing API */ /* Fast ZPP is always enabled now; this define is left in for compatibility diff --git a/ext/enchant/enchant.c b/ext/enchant/enchant.c index 677adc47ddbe9..eba6e33c58dbf 100644 --- a/ext/enchant/enchant.c +++ b/ext/enchant/enchant.c @@ -711,13 +711,15 @@ PHP_FUNCTION(enchant_dict_quick_check) size_t wordlen; enchant_dict *pdict; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|t", &dict, &word, &wordlen, &sugg) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rs|z", &dict, &word, &wordlen, &sugg) == FAILURE) { RETURN_FALSE; } if (sugg) { - zval_ptr_dtor(sugg); - array_init(sugg); + sugg = zend_try_array_init(sugg); + if (!sugg) { + return; + } } PHP_ENCHANT_GET_DICT; diff --git a/ext/intl/idn/idn.c b/ext/intl/idn/idn.c index 5d8943c4b3a0e..9cf61160a2eee 100644 --- a/ext/intl/idn/idn.c +++ b/ext/intl/idn/idn.c @@ -279,7 +279,7 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) intl_error_reset(NULL); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llt", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "S|llz", &domain, &option, &variant, &idna_info) == FAILURE) { php_intl_bad_args("bad arguments"); RETURN_NULL(); /* don't set FALSE because that's not the way it was before... */ @@ -319,8 +319,10 @@ static void php_intl_idn_handoff(INTERNAL_FUNCTION_PARAMETERS, int mode) "4 arguments were provided, but INTL_IDNA_VARIANT_2003 only " "takes 3 - extra argument ignored"); } else { - zval_dtor(idna_info); - array_init(idna_info); + idna_info = zend_try_array_init(idna_info); + if (!idna_info) { + return; + } } } diff --git a/ext/ldap/ldap.c b/ext/ldap/ldap.c index 2a654e43761a7..3413d3655da67 100644 --- a/ext/ldap/ldap.c +++ b/ext/ldap/ldap.c @@ -578,7 +578,11 @@ static void _php_ldap_controls_to_array(LDAP *ld, LDAPControl** ctrls, zval* arr zval tmp1; LDAPControl **ctrlp; - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } + if (ctrls == NULL) { return; } @@ -3330,7 +3334,7 @@ PHP_FUNCTION(ldap_parse_result) char *lmatcheddn, *lerrmsg; int rc, lerrcode, myargcount = ZEND_NUM_ARGS(); - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zztt", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz|zzzz", &link, &result, &errcode, &matcheddn, &errmsg, &referrals, &serverctrls) != SUCCESS) { return; } @@ -3360,8 +3364,10 @@ PHP_FUNCTION(ldap_parse_result) case 7: _php_ldap_controls_to_array(ld->link, lserverctrls, serverctrls, 0); case 6: - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -3525,7 +3531,7 @@ PHP_FUNCTION(ldap_parse_reference) ldap_resultentry *resultentry; char **lreferrals, **refp; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrt", &link, &result_entry, &referrals) != SUCCESS) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rrz", &link, &result_entry, &referrals) != SUCCESS) { return; } @@ -3541,8 +3547,11 @@ PHP_FUNCTION(ldap_parse_reference) RETURN_FALSE; } - zval_ptr_dtor(referrals); - array_init(referrals); + referrals = zend_try_array_init(referrals); + if (!referrals) { + return; + } + if (lreferrals != NULL) { refp = lreferrals; while (*refp) { @@ -4207,7 +4216,7 @@ PHP_FUNCTION(ldap_exop_passwd) int rc, myargcount = ZEND_NUM_ARGS(), msgid, err; char* errmsg; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzt", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "r|zzzz", &link, &user, &oldpw, &newpw, &serverctrls) == FAILURE) { WRONG_PARAM_COUNT; } diff --git a/ext/mbstring/mbstring.c b/ext/mbstring/mbstring.c index 72095e9d2c1cc..884d1527aaeae 100644 --- a/ext/mbstring/mbstring.c +++ b/ext/mbstring/mbstring.c @@ -2133,14 +2133,15 @@ PHP_FUNCTION(mb_parse_str) const mbfl_encoding *detected; track_vars_array = NULL; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|t", &encstr, &encstr_len, &track_vars_array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|z", &encstr, &encstr_len, &track_vars_array) == FAILURE) { return; } if (track_vars_array != NULL) { - /* Clear out the array */ - zval_dtor(track_vars_array); - array_init(track_vars_array); + track_vars_array = zend_try_array_init(track_vars_array); + if (!track_vars_array) { + return; + } } encstr = estrndup(encstr, encstr_len); diff --git a/ext/mbstring/php_mbregex.c b/ext/mbstring/php_mbregex.c index a372aebc3afc4..b7f4480025a74 100644 --- a/ext/mbstring/php_mbregex.c +++ b/ext/mbstring/php_mbregex.c @@ -696,13 +696,15 @@ static void _php_mb_regex_ereg_exec(INTERNAL_FUNCTION_PARAMETERS, int icase) OnigOptionType options; char *str; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|t", &arg_pattern, &string, &string_len, &array) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs|z", &arg_pattern, &string, &string_len, &array) == FAILURE) { RETURN_FALSE; } if (array != NULL) { - zval_dtor(array); - array_init(array); + array = zend_try_array_init(array); + if (!array) { + return; + } } if (!php_mb_check_encoding( diff --git a/ext/oci8/oci8_interface.c b/ext/oci8/oci8_interface.c index 140613ec58745..a29d2a1befb53 100644 --- a/ext/oci8/oci8_interface.c +++ b/ext/oci8/oci8_interface.c @@ -1434,26 +1434,27 @@ PHP_FUNCTION(oci_fetch_all) int i; zend_long rows = 0, flags = 0, skip = 0, maxrows = -1; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|lll", &z_statement, &array, &skip, &maxrows, &flags) == FAILURE) { return; } PHP_OCI_ZVAL_TO_STATEMENT(z_statement, statement); - zval_ptr_dtor(array); - while (skip--) { if (php_oci_statement_fetch(statement, nrows)) { - array_init(array); + zend_try_array_init(array); RETURN_LONG(0); } } if (flags & PHP_OCI_FETCHSTATEMENT_BY_ROW) { /* Fetch by Row: array will contain one sub-array per query row */ - array_init(array); - columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); + array = zend_try_array_init(array); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); for (i = 0; i < statement->ncolumns; i++) { columns[ i ] = php_oci_statement_get_column(statement, i + 1, NULL, 0); } @@ -1488,7 +1489,11 @@ PHP_FUNCTION(oci_fetch_all) } else { /* default to BY_COLUMN */ /* Fetch by columns: array will contain one sub-array per query column */ - array_init_size(array, statement->ncolumns); + array = zend_try_array_init_size(array, statement->ncolumns); + if (!array) { + return; + } + columns = safe_emalloc(statement->ncolumns, sizeof(php_oci_out_column *), 0); outarrs = safe_emalloc(statement->ncolumns, sizeof(zval*), 0); diff --git a/ext/odbc/php_odbc.c b/ext/odbc/php_odbc.c index 198f5fce0702d..e44c5b9564dbc 100644 --- a/ext/odbc/php_odbc.c +++ b/ext/odbc/php_odbc.c @@ -1880,13 +1880,13 @@ PHP_FUNCTION(odbc_fetch_into) #endif /* HAVE_SQL_EXTENDED_FETCH */ #ifdef HAVE_SQL_EXTENDED_FETCH - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz|l", &pv_res, &pv_res_arr, &pv_row) == FAILURE) { return; } rownum = pv_row; #else - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rt", &pv_res, &pv_res_arr) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rz", &pv_res, &pv_res_arr) == FAILURE) { return; } #endif /* HAVE_SQL_EXTENDED_FETCH */ @@ -1900,8 +1900,9 @@ PHP_FUNCTION(odbc_fetch_into) RETURN_FALSE; } - if (Z_TYPE_P(pv_res_arr) != IS_ARRAY) { - array_init(pv_res_arr); + pv_res_arr = zend_try_array_init(pv_res_arr); + if (!pv_res_arr) { + return; } #ifdef HAVE_SQL_EXTENDED_FETCH diff --git a/ext/openssl/openssl.c b/ext/openssl/openssl.c index 1106f2afbe7cc..8dbc54a51ebc7 100644 --- a/ext/openssl/openssl.c +++ b/ext/openssl/openssl.c @@ -2959,7 +2959,7 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_in = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sts", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szs", &zp12, &zp12_len, &zout, &pass, &pass_len) == FAILURE) return; RETVAL_FALSE; @@ -2977,8 +2977,10 @@ PHP_FUNCTION(openssl_pkcs12_read) BIO * bio_out; int cert_num; - zval_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto cleanup; + } if (cert) { bio_out = BIO_new(BIO_s_mem()); @@ -5342,7 +5344,7 @@ PHP_FUNCTION(openssl_pkcs7_read) PKCS7 * p7 = NULL; int i; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st", &p7b, &p7b_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz", &p7b, &p7b_len, &zout) == FAILURE) { return; } @@ -5384,8 +5386,10 @@ PHP_FUNCTION(openssl_pkcs7_read) break; } - zval_dtor(zout); - array_init(zout); + zout = zend_try_array_init(zout); + if (!zout) { + goto clean_exit; + } if (certs != NULL) { for (i = 0; i < sk_X509_num(certs); i++) { @@ -6058,7 +6062,7 @@ PHP_FUNCTION(openssl_seal) const EVP_CIPHER *cipher; EVP_CIPHER_CTX *ctx; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "szta|sz", &data, &data_len, + if (zend_parse_parameters(ZEND_NUM_ARGS(), "szza|sz", &data, &data_len, &sealdata, &ekeys, &pubkeys, &method, &method_len, &iv) == FAILURE) { return; } @@ -6135,8 +6139,12 @@ PHP_FUNCTION(openssl_seal) ZEND_TRY_ASSIGN_NEW_STR(sealdata, zend_string_init((char*)buf, len1 + len2, 0)); efree(buf); - zval_dtor(ekeys); - array_init(ekeys); + ekeys = zend_try_array_init(ekeys); + if (!ekeys) { + EVP_CIPHER_CTX_free(ctx); + goto clean_exit; + } + for (i=0; i 0 && user_siginfo) { - zval_dtor(user_siginfo); - array_init(user_siginfo); + user_siginfo = zend_try_array_init(user_siginfo); + if (!user_siginfo) { + return; + } add_assoc_long_ex(user_siginfo, "signo", sizeof("signo")-1, siginfo->si_signo); add_assoc_long_ex(user_siginfo, "errno", sizeof("errno")-1, siginfo->si_errno); diff --git a/ext/soap/soap.c b/ext/soap/soap.c index cf0542311d3ec..43d6a1441b138 100644 --- a/ext/soap/soap.c +++ b/ext/soap/soap.c @@ -2812,7 +2812,7 @@ PHP_METHOD(SoapClient, __call) zend_bool free_soap_headers = 0; zval *this_ptr; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zt", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sa|a!zz", &function, &function_len, &args, &options, &headers, &output_headers) == FAILURE) { return; } @@ -2884,14 +2884,18 @@ PHP_METHOD(SoapClient, __call) } ZEND_HASH_FOREACH_END(); } if (output_headers) { - zval_ptr_dtor(output_headers); - array_init(output_headers); + output_headers = zend_try_array_init(output_headers); + if (!output_headers) { + goto cleanup; + } } + do_soap_call(execute_data, this_ptr, function, function_len, arg_count, real_args, return_value, location, soap_action, uri, soap_headers, output_headers); + +cleanup: if (arg_count > 0) { efree(real_args); } - if (soap_headers && free_soap_headers) { zend_hash_destroy(soap_headers); efree(soap_headers); diff --git a/ext/sockets/sockets.c b/ext/sockets/sockets.c index c3e1e64dab550..ddc756d5d70b9 100644 --- a/ext/sockets/sockets.c +++ b/ext/sockets/sockets.c @@ -2214,7 +2214,7 @@ PHP_FUNCTION(socket_create_pair) PHP_SOCKET fds_array[2]; zend_long domain, type, protocol; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllt", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "lllz", &domain, &type, &protocol, &fds_array_zval) == FAILURE) { return; } @@ -2243,8 +2243,12 @@ PHP_FUNCTION(socket_create_pair) RETURN_FALSE; } - zval_ptr_dtor(fds_array_zval); - array_init(fds_array_zval); + fds_array_zval = zend_try_array_init(fds_array_zval); + if (!fds_array_zval) { + efree(php_sock[0]); + efree(php_sock[1]); + return; + } php_sock[0]->bsd_socket = fds_array[0]; php_sock[1]->bsd_socket = fds_array[1]; diff --git a/ext/standard/dns_win32.c b/ext/standard/dns_win32.c index 3e3930af57d83..dbd5b743add1d 100644 --- a/ext/standard/dns_win32.c +++ b/ext/standard/dns_win32.c @@ -50,7 +50,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ DNS_STATUS status; /* Return value of DnsQuery_A() function */ PDNS_RECORD pResult, pRec; /* Pointer to DNS_RECORD structure */ - if (zend_parse_parameters(ZEND_NUM_ARGS(), "st|t", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "sz|z", &hostname, &hostname_len, &mx_list, &weight_list) == FAILURE) { return; } @@ -60,12 +60,16 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ RETURN_FALSE; } - zval_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + goto cleanup; + } if (weight_list) { - zval_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + goto cleanup; + } } for (pRec = pResult; pRec; pRec = pRec->pNext) { @@ -81,6 +85,7 @@ PHP_FUNCTION(dns_get_mx) /* {{{ */ } } +cleanup: /* Free memory allocated for DNS records. */ DnsRecordListFree(pResult, DnsFreeRecordListDeep); @@ -352,18 +357,22 @@ PHP_FUNCTION(dns_get_record) int type, type_to_fetch, first_query = 1, store_results = 1; zend_bool raw = 0; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lt!t!b", + if (zend_parse_parameters(ZEND_NUM_ARGS(), "s|lz!z!b", &hostname, &hostname_len, &type_param, &authns, &addtl, &raw) == FAILURE) { return; } if (authns) { - zval_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { diff --git a/ext/xml/xml.c b/ext/xml/xml.c index e982002e32773..b0c4107a68ade 100644 --- a/ext/xml/xml.c +++ b/ext/xml/xml.c @@ -1411,21 +1411,25 @@ PHP_FUNCTION(xml_parse_into_struct) size_t data_len; int ret; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "rst|t", &pind, &data, &data_len, &xdata, &info) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "rsz|z", &pind, &data, &data_len, &xdata, &info) == FAILURE) { return; } if (info) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if ((parser = (xml_parser *)zend_fetch_resource(Z_RES_P(pind), "XML Parser", le_xml_parser)) == NULL) { RETURN_FALSE; } - zval_ptr_dtor(xdata); - array_init(xdata); + xdata = zend_try_array_init(xdata); + if (!xdata) { + return; + } ZVAL_COPY_VALUE(&parser->data, xdata); From d35b33808688f4439ee23939e87c27b86b7bab71 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 21:35:19 +0200 Subject: [PATCH 284/369] Drop ARRAY_ASSIGNABLE as well --- Zend/zend_API.h | 13 ------------- ext/pcre/php_pcre.c | 8 +++++--- ext/standard/dns.c | 32 ++++++++++++++++++++------------ ext/standard/exec.c | 17 ++++++++++------- ext/standard/image.c | 8 +++++--- ext/standard/proc_open.c | 10 ++++++---- ext/standard/string.c | 10 ++++++---- 7 files changed, 52 insertions(+), 46 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index c6308cf4f3c7d..7eead233bec6c 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -1206,19 +1206,6 @@ ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_exception(int num, cha #define Z_PARAM_STR(dest) \ Z_PARAM_STR_EX(dest, 0, 0) -/* old "t" */ -#define Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, check_null, separate) \ - Z_PARAM_PROLOGUE(1, separate); \ - if (Z_ISREF_P(_real_arg) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(_real_arg)) && zend_verify_ref_assignable_type(Z_REF_P(_real_arg), ZEND_TYPE_ENCODE(IS_ARRAY, 0)) != NULL) { \ - _expected_type = Z_EXPECTED_ARRAY; \ - error_code = ZPP_ERROR_WRONG_ARG; \ - break; \ - } \ - zend_parse_arg_zval_deref(_arg, &dest, check_null); - -#define Z_PARAM_ARRAY_ASSIGNABLE(dest) \ - Z_PARAM_ARRAY_ASSIGNABLE_EX(dest, 0, 0) - /* old "z" */ #define Z_PARAM_ZVAL_EX2(dest, check_null, deref, separate) \ Z_PARAM_PROLOGUE(deref, separate); \ diff --git a/ext/pcre/php_pcre.c b/ext/pcre/php_pcre.c index 1a395591e96e4..44e863ba22bef 100644 --- a/ext/pcre/php_pcre.c +++ b/ext/pcre/php_pcre.c @@ -949,7 +949,7 @@ static void php_do_pcre_match(INTERNAL_FUNCTION_PARAMETERS, int global) /* {{{ * Z_PARAM_STR(regex) Z_PARAM_STR(subject) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(subpats) + Z_PARAM_ZVAL(subpats) Z_PARAM_LONG(flags) Z_PARAM_LONG(start_offset) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -994,8 +994,10 @@ PHPAPI void php_pcre_match_impl(pcre_cache_entry *pce, char *subject, size_t sub /* Overwrite the passed-in value for subpatterns with an empty array. */ if (subpats != NULL) { - zval_ptr_dtor(subpats); - array_init(subpats); + subpats = zend_try_array_init(subpats); + if (!subpats) { + return; + } } subpats_order = global ? PREG_PATTERN_ORDER : 0; diff --git a/ext/standard/dns.c b/ext/standard/dns.c index 6800fc36f3505..29d51916a1c30 100644 --- a/ext/standard/dns.c +++ b/ext/standard/dns.c @@ -811,18 +811,22 @@ PHP_FUNCTION(dns_get_record) Z_PARAM_STRING(hostname, hostname_len) Z_PARAM_OPTIONAL Z_PARAM_LONG(type_param) - Z_PARAM_ARRAY_ASSIGNABLE(authns) - Z_PARAM_ARRAY_ASSIGNABLE(addtl) + Z_PARAM_ZVAL(authns) + Z_PARAM_ZVAL(addtl) Z_PARAM_BOOL(raw) ZEND_PARSE_PARAMETERS_END(); if (authns) { - zval_ptr_dtor(authns); - array_init(authns); + authns = zend_try_array_init(authns); + if (!authns) { + return; + } } if (addtl) { - zval_ptr_dtor(addtl); - array_init(addtl); + addtl = zend_try_array_init(addtl); + if (!addtl) { + return; + } } if (!raw) { @@ -1044,17 +1048,21 @@ PHP_FUNCTION(dns_get_mx) ZEND_PARSE_PARAMETERS_START(2, 3) Z_PARAM_STRING(hostname, hostname_len) - Z_PARAM_ARRAY_ASSIGNABLE(mx_list) + Z_PARAM_ZVAL(mx_list) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(weight_list) + Z_PARAM_ZVAL(weight_list) ZEND_PARSE_PARAMETERS_END(); - zval_ptr_dtor(mx_list); - array_init(mx_list); + mx_list = zend_try_array_init(mx_list); + if (!mx_list) { + return; + } if (weight_list) { - zval_ptr_dtor(weight_list); - array_init(weight_list); + weight_list = zend_try_array_init(weight_list); + if (!weight_list) { + return; + } } #if defined(HAVE_DNS_SEARCH) diff --git a/ext/standard/exec.c b/ext/standard/exec.c index 379be2f2cf507..e0c0cf44f0112 100644 --- a/ext/standard/exec.c +++ b/ext/standard/exec.c @@ -217,7 +217,7 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ Z_PARAM_STRING(cmd, cmd_len) Z_PARAM_OPTIONAL if (!mode) { - Z_PARAM_ARRAY_ASSIGNABLE_EX(ret_array, 0, 1) + Z_PARAM_ZVAL(ret_array) } Z_PARAM_ZVAL(ret_code) ZEND_PARSE_PARAMETERS_END_EX(RETURN_FALSE); @@ -234,13 +234,16 @@ static void php_exec_ex(INTERNAL_FUNCTION_PARAMETERS, int mode) /* {{{ */ if (!ret_array) { ret = php_exec(mode, cmd, NULL, return_value); } else { - if (Z_TYPE_P(ret_array) != IS_ARRAY) { - zval_ptr_dtor(ret_array); - array_init(ret_array); - } else if (Z_REFCOUNT_P(ret_array) > 1) { - zval_ptr_dtor(ret_array); - ZVAL_ARR(ret_array, zend_array_dup(Z_ARR_P(ret_array))); + if (Z_TYPE_P(Z_REFVAL_P(ret_array)) == IS_ARRAY) { + ZVAL_DEREF(ret_array); + SEPARATE_ARRAY(ret_array); + } else { + ret_array = zend_try_array_init(ret_array); + if (!ret_array) { + return; + } } + ret = php_exec(2, cmd, ret_array, return_value); } if (ret_code) { diff --git a/ext/standard/image.c b/ext/standard/image.c index f6b605b4d7e55..7dfad5ae9d423 100644 --- a/ext/standard/image.c +++ b/ext/standard/image.c @@ -1475,12 +1475,14 @@ static void php_getimagesize_from_any(INTERNAL_FUNCTION_PARAMETERS, int mode) { ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(input, input_len) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(info) + Z_PARAM_ZVAL(info) ZEND_PARSE_PARAMETERS_END(); if (argc == 2) { - zval_ptr_dtor(info); - array_init(info); + info = zend_try_array_init(info); + if (!info) { + return; + } } if (mode == FROM_PATH) { diff --git a/ext/standard/proc_open.c b/ext/standard/proc_open.c index ffa7fd768927f..a96ab09e572cc 100644 --- a/ext/standard/proc_open.c +++ b/ext/standard/proc_open.c @@ -448,7 +448,7 @@ PHP_FUNCTION(proc_open) ZEND_PARSE_PARAMETERS_START(3, 6) Z_PARAM_STRING(command, command_len) Z_PARAM_ARRAY(descriptorspec) - Z_PARAM_ARRAY_ASSIGNABLE(pipes) + Z_PARAM_ZVAL(pipes) Z_PARAM_OPTIONAL Z_PARAM_STRING_EX(cwd, cwd_len, 1, 0) Z_PARAM_ARRAY_EX(environment, 1, 0) @@ -863,6 +863,11 @@ PHP_FUNCTION(proc_open) #endif /* we forked/spawned and this is the parent */ + pipes = zend_try_array_init(pipes); + if (!pipes) { + goto exit_fail; + } + proc = (struct php_process_handle*)pemalloc(sizeof(struct php_process_handle), is_persistent); proc->is_persistent = is_persistent; proc->command = command; @@ -874,9 +879,6 @@ PHP_FUNCTION(proc_open) #endif proc->env = env; - zval_ptr_dtor(pipes); - array_init(pipes); - #if PHP_CAN_DO_PTS if (dev_ptmx >= 0) { close(dev_ptmx); diff --git a/ext/standard/string.c b/ext/standard/string.c index 41d2ad2c7ff19..e5f3c189ffb6e 100644 --- a/ext/standard/string.c +++ b/ext/standard/string.c @@ -4870,7 +4870,7 @@ PHP_FUNCTION(parse_str) ZEND_PARSE_PARAMETERS_START(1, 2) Z_PARAM_STRING(arg, arglen) Z_PARAM_OPTIONAL - Z_PARAM_ARRAY_ASSIGNABLE(arrayArg) + Z_PARAM_ZVAL(arrayArg) ZEND_PARSE_PARAMETERS_END(); res = estrndup(arg, arglen); @@ -4892,9 +4892,11 @@ PHP_FUNCTION(parse_str) zend_throw_error(NULL, "Cannot re-assign $this"); } } else { - /* Clear out the array that was passed in. */ - zval_ptr_dtor(arrayArg); - array_init(arrayArg); + arrayArg = zend_try_array_init(arrayArg); + if (!arrayArg) { + return; + } + sapi_module.treat_data(PARSE_STRING, res, arrayArg); } } From 3bfbbf840d8ce36ffed90be9edc96a273247e1db Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Jul 2018 11:00:10 +0200 Subject: [PATCH 285/369] Abort early on exception in extract() In line with upstream. Also remove silent parameter from zend_try_assign_ex(). --- Zend/zend_API.h | 8 ++--- ext/standard/array.c | 34 +++++++++---------- .../tests/array/extract_typed_ref.phpt | 2 +- 3 files changed, 20 insertions(+), 24 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 7eead233bec6c..1953ca727e677 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -678,7 +678,7 @@ END_EXTERN_C() #define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D #define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D -static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool silent, zend_bool strict) { +static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool strict) { zend_reference *ref; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { zend_property_info *error_prop; @@ -689,9 +689,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - if (!silent) { - zend_throw_ref_type_error_zval(error_prop, &tmp); - } + zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); return FAILURE; } @@ -705,7 +703,7 @@ static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool } static zend_always_inline int zend_try_assign(zval *zv, zval *arg) { - return zend_try_assign_ex(zv, arg, 0, ZEND_ARG_USES_STRICT_TYPES()); + return zend_try_assign_ex(zv, arg, ZEND_ARG_USES_STRICT_TYPES()); } #define ZEND_TRY_ASSIGN_NULL(zv) do { \ diff --git a/ext/standard/array.c b/ext/standard/array.c index 03d628acdf00a..d892721d85b73 100644 --- a/ext/standard/array.c +++ b/ext/standard/array.c @@ -1801,9 +1801,8 @@ static zend_long php_extract_if_exists(zend_array *arr, zend_array *symbol_table } ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + return -1; } count++; } @@ -1887,9 +1886,8 @@ static zend_long php_extract_overwrite(zend_array *arr, zend_array *symbol_table } ZVAL_DEREF(entry); Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + return -1; } } else { ZVAL_DEREF(entry); @@ -1992,9 +1990,9 @@ static zend_long php_extract_prefix_if_exists(zend_array *arr, zend_array *symbo orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2121,9 +2119,9 @@ static zend_long php_extract_prefix_same(zend_array *arr, zend_array *symbol_tab orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2228,9 +2226,9 @@ static zend_long php_extract_prefix_all(zend_array *arr, zend_array *symbol_tabl orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); @@ -2337,9 +2335,9 @@ static zend_long php_extract_prefix_invalid(zend_array *arr, zend_array *symbol_ orig_var = Z_INDIRECT_P(orig_var); } Z_TRY_ADDREF_P(entry); - if (zend_try_assign_ex(orig_var, entry, exception_thrown, 0) == FAILURE) { - exception_thrown = 1; - continue; + if (zend_try_assign_ex(orig_var, entry, 0) == FAILURE) { + zend_string_release_ex(Z_STR(final_name), 0); + return -1; } } else { Z_TRY_ADDREF_P(entry); diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index f480a410946b9..8eac12945f487 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -20,4 +20,4 @@ var_dump($test->i, $test->s); --EXPECT-- Cannot assign string to reference held by property Test->i of type int int(0) -string(2) "42" +string(0) "" From acd013c8f70cb157d6575fd945c0344d03271cdb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 4 Jul 2018 11:02:53 +0200 Subject: [PATCH 286/369] Move throwing of error into verify_ref_assignable_zval() --- Zend/zend_API.h | 4 +- Zend/zend_execute.c | 25 ++-- Zend/zend_execute.h | 6 +- Zend/zend_vm_def.h | 36 ++--- Zend/zend_vm_execute.h | 230 ++++++++++---------------------- ext/reflection/php_reflection.c | 4 +- 6 files changed, 92 insertions(+), 213 deletions(-) diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 1953ca727e677..7840298e6d653 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -681,15 +681,13 @@ END_EXTERN_C() static zend_always_inline int zend_try_assign_ex(zval *zv, zval *arg, zend_bool strict) { zend_reference *ref; if (EXPECTED(Z_ISREF_P(zv)) && UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref = Z_REF_P(zv)))) { - zend_property_info *error_prop; zval tmp; ZVAL_COPY_VALUE(&tmp, arg); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, strict)) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, strict))) { zv = Z_REFVAL_P(zv); zval_ptr_dtor(zv); ZVAL_COPY_VALUE(zv, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); return FAILURE; } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f69346aaede0f..da1477776f410 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1297,12 +1297,10 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * ZVAL_COPY_VALUE(z, value); } if (UNEXPECTED(Z_ISREF_P(z))) { - zend_property_info *error_prop; zend_reference *ref = Z_REF_P(z); zval *refval = Z_REFVAL_P(z); binary_op(&res, refval, value); - if (ZEND_REF_HAS_TYPE_SOURCES(ref) && (error_prop = zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) != NULL) { - zend_throw_ref_type_error_zval(error_prop, &res); + if (ZEND_REF_HAS_TYPE_SOURCES(ref) && !zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { zval_ptr_dtor(&res); if (z == &rv) { zval_ptr_dtor(&rv); @@ -1632,13 +1630,11 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -1702,13 +1698,11 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -2838,19 +2832,20 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } -static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { +static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { zend_property_info *prop; ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { - return prop; + zend_throw_ref_type_error_zval(prop, zv); + return 0; } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; + return 1; } -ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { return i_zend_verify_ref_assignable_zval(ref, zv, strict); } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 1f4dee0ce5e6b..9c1c3fa3f98ee 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -86,7 +86,7 @@ static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, } ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); -ZEND_API zend_property_info *zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); +ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv); ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type); @@ -116,14 +116,12 @@ static zend_always_inline zval* zend_assign_to_variable(zval *variable_ptr, zval if (Z_ISREF_P(variable_ptr)) { if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(variable_ptr)))) { - zend_property_info *error_prop; zend_bool need_copy = (value_type & (IS_CONST|IS_CV)) || ((value_type & IS_VAR) && UNEXPECTED(ref) && Z_REFCOUNT_P(variable_ptr) > 1); if (need_copy) { ZVAL_COPY(&tmp, value); value = &tmp; } - if ((error_prop = zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) != NULL) { - zend_throw_ref_type_error_zval(error_prop, value); + if (!zend_verify_ref_assignable_zval(Z_REF_P(variable_ptr), value, strict)) { zval_ptr_dtor(value); return Z_REFVAL_P(variable_ptr); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e653cfa43678c..d9051b1b637d5 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -854,13 +854,11 @@ ZEND_VM_C_LABEL(assign_op_object): zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -922,13 +920,11 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -984,14 +980,12 @@ ZEND_VM_C_LABEL(assign_dim_op_new_array): zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP2(); FREE_OP(free_op_data1); @@ -1085,15 +1079,13 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -1436,15 +1428,13 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1500,15 +1490,13 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1534,7 +1522,6 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1564,8 +1551,7 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1579,7 +1565,6 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1609,8 +1594,7 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 0b96c0217eb70..16bc34a8e1773 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4586,13 +4586,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -7176,13 +7174,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -9059,13 +9055,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -20291,13 +20285,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -20859,13 +20851,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -21560,13 +21550,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -22533,15 +22521,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22597,15 +22583,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22661,15 +22645,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22725,15 +22707,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22759,7 +22739,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22789,8 +22768,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -22804,7 +22782,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22834,8 +22811,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -24309,13 +24285,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -24377,13 +24351,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -24439,14 +24411,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -24539,15 +24509,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -27194,13 +27162,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -27262,13 +27228,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -27324,14 +27288,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -27425,15 +27387,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -30262,13 +30222,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -30324,14 +30282,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31763,13 +31719,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -31832,14 +31786,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -31932,15 +31884,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -34723,13 +34673,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -36800,13 +36748,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -39509,13 +39455,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -41491,15 +41435,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41554,15 +41496,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41617,15 +41557,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41680,15 +41618,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41713,7 +41649,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41743,8 +41678,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41757,7 +41691,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_property_info *error_prop; zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41787,8 +41720,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -43917,13 +43849,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -43985,13 +43915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -44047,14 +43975,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -44147,15 +44073,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -48605,13 +48529,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -48673,13 +48595,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -48735,14 +48655,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); zval_ptr_dtor_nogc(free_op2); FREE_OP(free_op_data1); @@ -48836,15 +48754,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { @@ -52664,13 +52580,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -52726,14 +52640,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55413,13 +55325,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? (prop_info = zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES())) == NULL : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { - if (is_typed_ref) { - zend_throw_ref_type_error_zval(prop_info, &z_copy); - } else { + if (!is_typed_ref) { zend_verify_property_type_error(prop_info, &z_copy); } zval_ptr_dtor(&z_copy); @@ -55482,14 +55392,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_dim_helper_SP zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval tmp; binary_op(&tmp, var_ptr, value); - if (EXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES())) == NULL)) { + if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &tmp); } else { - zend_throw_ref_type_error_zval(error_prop, &tmp); zval_ptr_dtor(&tmp); FREE_OP(free_op_data1); @@ -55582,15 +55490,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper } if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zend_property_info *error_prop; zval old; ZVAL_COPY_VALUE(&old, var_ptr); zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); - if (UNEXPECTED((error_prop = zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES())) != NULL)) { - zend_throw_ref_type_error_zval(error_prop, var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); } else { diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b394846a9c507..d5881c7b2a521 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3948,12 +3948,10 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } if (Z_ISREF_P(variable_ptr)) { - zend_property_info *error_prop; zend_reference *ref = Z_REF_P(variable_ptr); variable_ptr = Z_REFVAL_P(variable_ptr); - if ((error_prop = zend_verify_ref_assignable_zval(ref, value, 0)) != NULL) { - zend_throw_ref_type_error_zval(error_prop, value); + if (!zend_verify_ref_assignable_zval(ref, value, 0)) { return; } } From a10222ecf75c46ec973f9cca3ce2b8133d131a4a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Tue, 3 Jul 2018 21:51:57 +0200 Subject: [PATCH 287/369] Don't constrain type intersections This allows intersecting ?int and ?string with value null, and is conceptually forward-compatible with union types, at which point we must deal with the problem of conflicting coercive types anyway. Implemented in a way that only performs type coercion (if necessary) once. --- .../typed_properties_068.phpt | 4 +- .../typed_properties_076.phpt | 3 +- .../typed_properties_078.phpt | 2 +- Zend/zend_execute.c | 254 ++++--- Zend/zend_execute.h | 30 +- Zend/zend_object_handlers.c | 17 +- Zend/zend_vm_def.h | 44 +- Zend/zend_vm_execute.h | 649 +++--------------- 8 files changed, 286 insertions(+), 717 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 97deab9c570ab..508e079a94fbd 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -94,9 +94,9 @@ string(1) "0" Typed property Foo::$i must be int, string used int(0) string(1) "x" -Static property type int is not compatible with the reference held by property Foo::$s of type string +Reference with value of type string held by property Foo::$s of type string is not compatible with property Foo::$i of type int int(0) string(1) "5" -Static property type string is not compatible with the reference held by property Foo::$i of type int +Reference with value of type int held by property Foo::$i of type int is not compatible with property Foo::$s of type string int(0) string(1) "5" diff --git a/Zend/tests/type_declarations/typed_properties_076.phpt b/Zend/tests/type_declarations/typed_properties_076.phpt index 93a8585cdd8be..b0d0bfedf808f 100644 --- a/Zend/tests/type_declarations/typed_properties_076.phpt +++ b/Zend/tests/type_declarations/typed_properties_076.phpt @@ -51,7 +51,8 @@ $test = new Test; invalid($test, 'int', 'float', 42.0); valid($test, 'int', 'nint', 42); invalid($test, 'int', 'nint', null); -invalid($test, 'nint', 'nstring', null); +valid($test, 'nint', 'nstring', null); +invalid($test, 'nint', 'nstring', '42'); valid($test, 'A', 'A', new A); valid($test, 'A', 'B', new B); invalid($test, 'A', 'B', new A); diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 3ceb77f91c84f..52c1ffccbe55b 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -45,7 +45,7 @@ var_dump($ref instanceof ArrayIterator); --EXPECT-- array(0) { } -string(114) "Property type ?Traversable is not compatible with the reference held by property class@anonymous->a of type ?array" +string(89) "Typed property class@anonymous::$t must be an instance of Traversable or null, array used" array(0) { } array(1) { diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index da1477776f410..9f22784e7b60e 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -994,35 +994,6 @@ zval* zend_verify_property_type(zend_property_info *info, zval *property, zval * return i_zend_verify_property_type(info, property, tmp, strict); } -static zend_always_inline zend_bool i_zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { - zend_uchar cur_type; - - if (!ZEND_TYPE_IS_SET(type)) { - return 1; - } - ZVAL_DEREF(zv); - - if (zend_verify_type_assignable(type, Z_TYPE_P(zv))) { - return 1; - } - - if (ZEND_TYPE_IS_CLASS(type)) { - return Z_TYPE_P(zv) == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type)); - } - - cur_type = ZEND_TYPE_CODE(type); - if (cur_type == IS_ITERABLE) { - return zend_is_iterable(zv); - } - - return zend_verify_scalar_type_hint(cur_type, zv, zv, strict); -} - -ZEND_API zend_bool zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) -{ - return i_zend_verify_type_assignable_zval(type, zv, strict); -} - static zend_always_inline zend_bool zend_check_type( zend_type type, zval *arg, zend_class_entry **ce, void **cache_slot, @@ -2189,7 +2160,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (EXPECTED(Z_TYPE_P(container) <= IS_FALSE)) { if (type != BP_VAR_UNSET) { zend_property_info *error_prop; - if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_container), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); } else { @@ -2735,87 +2706,44 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -/* detects impossible intersections of types */ -static zend_always_inline zend_property_info *i_zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { +/* Checks whether an array can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { zend_property_info *prop; - if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { return NULL; } - if (ZEND_TYPE_IS_CLASS(type)) { - /* interfaces can be intersected with any other interface, object and iterable; classes must be */ - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - zend_type prop_type = prop->type; - if (ZEND_TYPE_IS_CLASS(prop_type)) { - if ((!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) || !(ZEND_TYPE_CE(prop_type)->ce_flags & ZEND_ACC_INTERFACE)) - && !instanceof_function(ZEND_TYPE_CE(prop_type), ZEND_TYPE_CE(type)) && !instanceof_function(ZEND_TYPE_CE(type), ZEND_TYPE_CE(prop_type))) { - return prop; - } - } else if (ZEND_TYPE_CODE(prop_type) != IS_OBJECT && (ZEND_TYPE_CODE(prop_type) != IS_ITERABLE || (!(ZEND_TYPE_CE(type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(type), zend_ce_traversable)))) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - } else { - switch (ZEND_TYPE_CODE(type)) { - case IS_OBJECT: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!ZEND_TYPE_IS_CLASS(prop->type) && ZEND_TYPE_CODE(prop->type) != IS_OBJECT && ZEND_TYPE_CODE(prop->type) != IS_ITERABLE) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case IS_ARRAY: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case IS_ITERABLE: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) ? !(ZEND_TYPE_CE(prop->type)->ce_flags & ZEND_ACC_INTERFACE) && !instanceof_function(ZEND_TYPE_CE(prop->type), zend_ce_traversable) : (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY && ZEND_TYPE_CODE(prop->type) != IS_OBJECT)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; - - case _IS_BOOL: - case IS_LONG: - case IS_DOUBLE: - case IS_STRING: - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_WITHOUT_NULL(prop->type) == ZEND_TYPE_WITHOUT_NULL(type)) { - return NULL; - } - return prop; - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - /* break intentionally missing */ - default: - ZEND_ASSERT(0); + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + return prop; } - } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); return NULL; } -ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type) { - return i_zend_verify_ref_assignable_type(ref, type); +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { + return i_zend_check_ref_array_assignable(ref); } -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type) { +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *class_name1, *class_name2, *prop_name1, *prop_name2; + zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); + zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); zend_throw_exception_ex( - zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop->type), - "%s type %s%s is not compatible with the reference held by property %s%s%s of type %s%s", - source, - ZEND_TYPE_ALLOW_NULL(type) ? "?" : "", - ZEND_TYPE_IS_CLASS(type) ? ZSTR_VAL(ZEND_TYPE_CE(type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(type)), - ZSTR_VAL(prop->ce->name), - (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", - ZSTR_VAL(prop->name), - ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + zend_ce_type_error, 0, + "Reference with value of type %s held by property %s%s%s of type %s%s is not compatible with property %s%s%s of type %s%s", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop1->ce->name), + (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", + prop_name1, + ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + ZSTR_VAL(prop2->ce->name), + (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", + prop_name2, + ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); } @@ -2832,16 +2760,108 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } +ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( + zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + zend_throw_exception_ex( + zend_ce_type_error, 0, + "Cannot assign %s to reference held by property %s%s%s of type %s%s and property %s%s%s of type %s%s, as this would result in an inconsistent type conversion", + Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), + ZSTR_VAL(prop1->ce->name), + (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop1->name), + ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + ZSTR_VAL(prop2->ce->name), + (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", + ZSTR_VAL(prop2->name), + ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", + ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + ); +} + +/* 1: valid, 0: invalid, -1: may be valid after type coercion */ +static zend_always_inline int i_zend_verify_type_assignable_zval(zend_type type, zval *zv, zend_bool strict) { + zend_uchar type_code; + zend_uchar zv_type = Z_TYPE_P(zv); + + if (ZEND_TYPE_IS_CLASS(type)) { + return (zv_type == IS_OBJECT && instanceof_function(Z_OBJCE_P(zv), ZEND_TYPE_CE(type))) + || (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL); + } + + type_code = ZEND_TYPE_CODE(type); + if (type_code == zv_type || + (ZEND_TYPE_ALLOW_NULL(type) && zv_type == IS_NULL) || + (type_code == _IS_BOOL && (zv_type == IS_FALSE || zv_type == IS_TRUE))) { + return 1; + } + + if (type_code == IS_ITERABLE) { + return zend_is_iterable(zv); + } + + /* No weak conversions for arrays and objects */ + if (type_code == IS_ARRAY || type_code == IS_OBJECT) { + return 0; + } + + if (strict) { + /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ + if (type_code != IS_DOUBLE || Z_TYPE_P(zv) != IS_LONG) { + return 0; + } + } else if (Z_TYPE_P(zv) == IS_NULL) { + /* NULL may be accepted only by nullable hints (this is already checked) */ + return 0; + } + + /* Coercion may be necessary, check separately */ + return -1; +} + static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict) { zend_property_info *prop; + /* The value must satisfy each property type, and coerce to the same value for each property + * type. Right now, the latter rule means that *if* coercion is necessary, then all types + * must be the same (modulo nullability). To handle this, remember the first type we see and + * compare against it when coercion becomes necessary. */ + zend_property_info *seen_prop = NULL; + zend_uchar seen_type; + zend_bool needs_coercion = 0; + + ZEND_ASSERT(Z_TYPE_P(zv) != IS_REFERENCE); ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!i_zend_verify_type_assignable_zval(prop->type, zv, strict)) { + int result; + + /* Only sources that carry a type should be registered. */ + zend_type type = prop->type; + ZEND_ASSERT(ZEND_TYPE_IS_SET(type)); + + result = i_zend_verify_type_assignable_zval(type, zv, strict); + if (result == 0) { zend_throw_ref_type_error_zval(prop, zv); return 0; } + + if (result < 0) { + needs_coercion = 1; + } + + if (!seen_prop) { + seen_prop = prop; + seen_type = ZEND_TYPE_IS_CLASS(type) ? IS_OBJECT : ZEND_TYPE_CODE(type); + } else if (needs_coercion && seen_type != ZEND_TYPE_CODE(type)) { + zend_throw_conflicting_coercion_error(seen_prop, prop, zv); + return 0; + } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv, zv))) { + zend_throw_ref_type_error_zval(prop, zv); + return 0; + } + return 1; } @@ -2850,6 +2870,40 @@ ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv return i_zend_verify_ref_assignable_zval(ref, zv, strict); } +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict) { + zval *val = orig_val; + if (Z_ISREF_P(val) && ZEND_REF_HAS_TYPE_SOURCES(Z_REF_P(val))) { + zend_type prop_type = zend_get_prop_info_ref_type(prop_info); + int result; + + val = Z_REFVAL_P(val); + result = i_zend_verify_type_assignable_zval(prop_type, val, strict); + if (result > 0) { + return 1; + } + + if (result < 0) { + zend_property_info *ref_prop = ZEND_REF_FIRST_SOURCE(Z_REF_P(orig_val)); + if (ZEND_TYPE_CODE(prop_type) != ZEND_TYPE_CODE(ref_prop->type)) { + /* Invalid due to conflicting coercion */ + zend_throw_ref_type_error_type(ref_prop, prop_info, val); + return 0; + } + if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_type), val, val)) { + return 1; + } + } + } else { + ZVAL_DEREF(val); + if (i_zend_verify_property_type(prop_info, val, val, strict)) { + return 1; + } + } + + zend_verify_property_type_error(prop_info, val); + return 0; +} + ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop) { zend_property_info_list *list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(source_list->list); diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index 9c1c3fa3f98ee..ce28252eec336 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -85,11 +85,12 @@ static zend_always_inline zend_bool zend_verify_type_assignable(zend_type type, || (cur_type == IS_ITERABLE && new_type == IS_ARRAY); } -ZEND_API zend_property_info *zend_verify_ref_assignable_type(zend_reference *ref, zend_type type); +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref); ZEND_API zend_bool zend_verify_ref_assignable_zval(zend_reference *ref, zval *zv, zend_bool strict); +ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_info, zval *orig_val, zend_bool strict); ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv); -ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_property_info *prop, zend_type type); +ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv); #define ZEND_REF_TYPE_SOURCES(ref) \ (ref)->sources @@ -97,6 +98,12 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(const char *source, zend_ #define ZEND_REF_HAS_TYPE_SOURCES(ref) \ (ZEND_REF_TYPE_SOURCES(ref).ptr != NULL) +#define ZEND_REF_FIRST_SOURCE(ref) \ + (ZEND_PROPERTY_INFO_SOURCE_IS_LIST((ref)->sources.list) \ + ? ZEND_PROPERTY_INFO_SOURCE_TO_LIST((ref)->sources.list)->ptr[0] \ + : (ref)->sources.ptr) + + ZEND_API void zend_ref_add_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); ZEND_API void zend_ref_del_type_source(zend_property_info_source_list *source_list, zend_property_info *prop); @@ -492,26 +499,21 @@ ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *p #define ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) do { \ zend_property_info_source_list *_source_list = &ZEND_REF_TYPE_SOURCES(ref); \ - size_t _num; \ - zend_property_info *_prop; \ + zend_property_info **_prop, **_end; \ zend_property_info_list *_list; \ if (_source_list->ptr) { \ if (ZEND_PROPERTY_INFO_SOURCE_IS_LIST(_source_list->list)) { \ _list = ZEND_PROPERTY_INFO_SOURCE_TO_LIST(_source_list->list); \ - _num = _list->num; \ - _prop = _list->ptr[--_num]; \ + _prop = _list->ptr; \ + _end = _list->ptr + _list->num; \ } else { \ - _prop = _source_list->ptr; \ - _num = 0; \ + _prop = &_source_list->ptr; \ + _end = _prop + 1; \ } \ - while (1) { \ - prop = _prop; \ + for (; _prop < _end; _prop++) { \ + prop = *_prop; \ #define ZEND_REF_FOREACH_TYPE_SOURCES_END() \ - if (_num == 0) { \ - break; \ - } \ - _prop = _list->ptr[--_num]; \ } \ } \ } while (0) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 6c7c38e761d8f..2eecdf762e939 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -730,22 +730,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot)))) { - zval *val = retval; - - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - /* the overloaded property type must be compatible with the reference type so that we don't coercively cast and end up with a value type not matching the reference type */ - if ((error_prop = zend_verify_ref_assignable_type(Z_REF_P(val), zend_get_prop_info_ref_type(prop_info)))) { - zend_throw_ref_type_error_type("Property", error_prop, zend_get_prop_info_ref_type(prop_info)); - goto exit; - } - /* we do not add a reference type here - reference types must be backed up by references being assigned to an actual typed container */ - val = Z_REFVAL_P(val); - } - - if (UNEXPECTED(zend_verify_property_type(prop_info, val, val, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES)) == NULL)) { - zend_verify_property_type_error(prop_info, val); - } + zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); } goto exit; } else if (Z_STRVAL_P(member)[0] == '\0' && Z_STRLEN_P(member) != 0) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index d9051b1b637d5..a848df56867c1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2532,7 +2532,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); FREE_UNFETCHED_OP2(); @@ -2698,8 +2698,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C FREE_OP2(); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (OP2_TYPE == IS_CONST) { @@ -2709,23 +2708,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { FREE_OP1_VAR_PTR(); FREE_OP2(); FREE_OP_DATA_VAR_PTR(); @@ -2738,7 +2721,7 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -2759,7 +2742,6 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -2784,21 +2766,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { FREE_OP_DATA_VAR_PTR(); HANDLE_EXCEPTION(); } @@ -2808,7 +2776,7 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP_REF, CONST|TMPVAR|CV, UNUSED|CONST| } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 16bc34a8e1773..76fec9533595a 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5320,7 +5320,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -5345,21 +5344,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -5369,7 +5354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -8744,7 +8729,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -8769,21 +8753,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -8793,7 +8763,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -9633,7 +9603,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -9658,21 +9627,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -9682,7 +9637,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -15130,7 +15085,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -15155,21 +15109,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -15179,7 +15119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -17495,7 +17435,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -17520,21 +17459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -17544,7 +17469,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -18128,7 +18053,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -18153,21 +18077,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -18177,7 +18087,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -25849,7 +25759,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -25950,7 +25860,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26051,7 +25961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26151,7 +26061,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -26296,8 +26206,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -26307,23 +26216,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -26336,7 +26229,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -26409,8 +26302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -26420,23 +26312,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26449,7 +26325,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -28731,7 +28607,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28832,7 +28708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -28933,7 +28809,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29033,7 +28909,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29122,8 +28998,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29133,23 +29008,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -29162,7 +29021,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -29235,8 +29094,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -29246,23 +29104,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; zval_ptr_dtor_nogc(free_op2); @@ -29275,7 +29117,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -30663,7 +30505,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30764,7 +30606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30865,7 +30707,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -30965,7 +30807,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33130,7 +32972,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33231,7 +33073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33332,7 +33174,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33432,7 +33274,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -33625,8 +33467,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -33636,23 +33477,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -33665,7 +33490,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -33738,8 +33563,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -33749,23 +33573,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33778,7 +33586,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35832,8 +35640,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -35843,23 +35650,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -35872,7 +35663,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -35944,8 +35735,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -35955,23 +35745,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -35984,7 +35758,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -37911,8 +37685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -37922,23 +37695,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -37951,7 +37708,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -38023,8 +37780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -38034,23 +37790,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); @@ -38063,7 +37803,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40614,8 +40354,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -40625,23 +40364,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -40654,7 +40377,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -40726,8 +40449,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -40737,23 +40459,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -40766,7 +40472,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -45984,7 +45690,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46085,7 +45791,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46186,7 +45892,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46286,7 +45992,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -46431,8 +46137,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -46442,23 +46147,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -46471,7 +46160,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46543,8 +46232,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CONST == IS_CONST) { @@ -46554,23 +46242,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -46583,7 +46255,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -46603,7 +46275,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -46628,21 +46299,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -46652,7 +46309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -50349,7 +50006,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50450,7 +50107,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50551,7 +50208,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50651,7 +50308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50740,8 +50397,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -50751,23 +50407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -50780,7 +50420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -50852,8 +50492,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ zval_ptr_dtor_nogc(free_op2); ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { @@ -50863,23 +50502,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - zval_ptr_dtor_nogc(free_op2); - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { zval_ptr_dtor_nogc(free_op2); @@ -50892,7 +50515,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -52220,7 +51843,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -52245,21 +51867,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -52269,7 +51877,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -53462,7 +53070,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53563,7 +53171,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53664,7 +53272,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53764,7 +53372,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -53801,7 +53409,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV zend_free_op free_op_data; zval *prop, *value_ptr; zend_property_info *prop_info; - zend_type prop_type = 0; SAVE_OPLINE(); @@ -53826,21 +53433,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { if (UNEXPECTED(prop_info->type)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Static property", error_prop, prop_type); - if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (free_op_data) {zval_ptr_dtor_nogc(free_op_data);}; HANDLE_EXCEPTION(); } @@ -53850,7 +53443,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV } } zend_assign_to_variable_reference(prop, value_ptr); - if (prop_type) { + if (prop_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info); } @@ -56985,7 +56578,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57086,7 +56679,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57187,7 +56780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57287,7 +56880,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; - if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_verify_ref_assignable_type(Z_REF_P(orig_object_ptr), ZEND_TYPE_ENCODE(IS_ARRAY, 0))) != NULL) { + if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), "Cannot write an array to a null or false reference which does not allow for array"); @@ -57480,8 +57073,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -57491,23 +57083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; @@ -57520,7 +57096,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } @@ -57592,8 +57168,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D ZEND_VM_NEXT_OPCODE_EX(1, 2); } else { - zend_type prop_type = 0; - zend_property_info *prop_info; + zend_property_info *prop_info = NULL; if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { if (IS_CV == IS_CONST) { @@ -57603,23 +57178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } if (UNEXPECTED(prop_info)) { - zval *val = value_ptr; - prop_type = zend_get_prop_info_ref_type(prop_info); - if (Z_ISREF_P(val)) { - zend_property_info *error_prop; - zend_reference *ref = Z_REF_P(val); - val = Z_REFVAL_P(val); - - if ((error_prop = i_zend_verify_ref_assignable_type(ref, prop_type))) { - zend_throw_ref_type_error_type("Property", error_prop, prop_type); - - - - HANDLE_EXCEPTION(); - } - } - if (!i_zend_verify_property_type(prop_info, val, val, EX_USES_STRICT_TYPES())) { - zend_verify_property_type_error(prop_info, val); + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { @@ -57632,7 +57191,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } } zend_assign_to_variable_reference(variable_ptr, value_ptr); - if (prop_type) { + if (prop_info) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } From ae8a1989fa96cbc4f7f215ae3a80e49da7333f3f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 11 Jul 2018 23:11:52 +0200 Subject: [PATCH 288/369] Fix build without execute_data $register --- Zend/zend_vm_execute.h | 18 +++++++++--------- Zend/zend_vm_gen.php | 2 +- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 7bb85714e254f..51ebfc4c5205e 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -5343,7 +5343,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -8762,7 +8762,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -9636,7 +9636,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CO HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -15123,7 +15123,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -17483,7 +17483,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -18101,7 +18101,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_TM HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -46379,7 +46379,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -51957,7 +51957,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); @@ -53523,7 +53523,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_CV HANDLE_EXCEPTION(); } - value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W EXECUTE_DATA_CC); + value_ptr = get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, BP_VAR_W); if ((opline+1)->op1_type == IS_VAR && UNEXPECTED(Z_ISERROR_P(value_ptr))) { prop = &EG(uninitialized_zval); diff --git a/Zend/zend_vm_gen.php b/Zend/zend_vm_gen.php index c91cc4b76dc5c..5b9f1e60cb046 100644 --- a/Zend/zend_vm_gen.php +++ b/Zend/zend_vm_gen.php @@ -573,7 +573,7 @@ ); $op_data_get_zval_ptr_ptr = array( - "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1 EXECUTE_DATA_CC)", + "ANY" => "get_zval_ptr_ptr((opline+1)->op1_type, (opline+1)->op1, &free_op_data, \\1)", "TMP" => "NULL", "VAR" => "_get_zval_ptr_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC)", "CONST" => "NULL", From eda393bb712ff280a4f68973dc0e1f80b3735af0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Fri, 13 Jul 2018 23:41:26 +0200 Subject: [PATCH 289/369] Move push/pop function prologue off fast path in VM --- Zend/zend_vm_def.h | 99 ++++++------- Zend/zend_vm_execute.h | 312 +++++++++++++++++++++-------------------- 2 files changed, 212 insertions(+), 199 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index bb719b75fbdc9..1c4fe0f668f40 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1398,7 +1398,6 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1423,27 +1422,27 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -1460,7 +1459,6 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1485,27 +1483,28 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - FREE_OP1_VAR_PTR(); - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -1522,7 +1521,6 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1543,17 +1541,21 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); } FREE_OP1_VAR_PTR(); @@ -1565,7 +1567,6 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = GET_OP1_ZVAL_PTR_PTR_UNDEF(BP_VAR_RW); @@ -1586,17 +1587,21 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + decrement_function(var_ptr); } FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 51ebfc4c5205e..35bc295c41576 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22459,7 +22459,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22484,27 +22483,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -22521,7 +22520,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22546,27 +22544,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -22583,7 +22581,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22608,27 +22605,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -22645,7 +22643,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22670,27 +22667,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -22707,7 +22705,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22728,17 +22725,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - increment_function(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22750,7 +22751,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND USE_OPLINE zend_free_op free_op1; zval *var_ptr; - zend_reference *ref = NULL; var_ptr = _get_zval_ptr_ptr_var(opline->op1.var, &free_op1 EXECUTE_DATA_CC); @@ -22771,17 +22771,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); - decrement_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + decrement_function(var_ptr); } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -41195,7 +41199,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41220,27 +41223,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -41256,7 +41259,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41281,27 +41283,27 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - increment_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + increment_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); increment_function(var_ptr); } @@ -41317,7 +41319,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41342,27 +41343,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -41378,7 +41380,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41403,27 +41404,28 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) { - zval old; - ZVAL_COPY_VALUE(&old, var_ptr); + if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) { + zval old; + ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); - decrement_function(var_ptr); + zval_opt_copy_ctor(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, &old); - HANDLE_EXCEPTION(); + HANDLE_EXCEPTION(); + } else { + zval_ptr_dtor(&old); + } } else { - zval_ptr_dtor(&old); + decrement_function(var_ptr); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); decrement_function(var_ptr); } @@ -41439,7 +41441,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41460,17 +41461,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + increment_function(var_ptr); - increment_function(var_ptr); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + increment_function(var_ptr); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); @@ -41481,7 +41486,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ USE_OPLINE zval *var_ptr; - zend_reference *ref = NULL; var_ptr = EX_VAR(opline->op1.var); @@ -41502,17 +41506,21 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ } if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) { - ref = Z_REF_P(var_ptr); + zend_reference *ref = Z_REF_P(var_ptr); var_ptr = Z_REFVAL_P(var_ptr); - } - ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); - decrement_function(var_ptr); + decrement_function(var_ptr); - if (UNEXPECTED(ref) && UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { - zval_ptr_dtor(var_ptr); - ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + zval_ptr_dtor(var_ptr); + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else { + ZVAL_COPY(EX_VAR(opline->result.var), var_ptr); + + decrement_function(var_ptr); } ZEND_VM_NEXT_OPCODE_CHECK_EXCEPTION(); From 1f737291c7e09a297ee083f1a591d22dabae0a97 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 16 Jul 2018 21:03:32 +0200 Subject: [PATCH 290/369] Resolve aliases during property type LSP checks --- .../typed_properties_084.phpt | 25 ++++++++++++++++ Zend/zend_inheritance.c | 30 ++++++++++++++++--- 2 files changed, 51 insertions(+), 4 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_084.phpt diff --git a/Zend/tests/type_declarations/typed_properties_084.phpt b/Zend/tests/type_declarations/typed_properties_084.phpt new file mode 100644 index 0000000000000..fb3c86115eee7 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_084.phpt @@ -0,0 +1,25 @@ +--TEST-- +Typed properties and class aliases +--FILE-- + +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index a8865239fdded..c85572da04abf 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -676,6 +676,30 @@ zend_string* zend_resolve_property_type(zend_string *type, zend_class_entry *sco return type; } /* }}} */ +zend_bool class_types_compatible( + zend_type parent_type, zend_class_entry *parent_ce, + zend_type child_type, zend_class_entry *child_ce +) { + zend_string *parent_name = ZEND_TYPE_IS_CE(parent_type) + ? ZEND_TYPE_CE(parent_type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(parent_type), parent_ce); + zend_string *child_name = ZEND_TYPE_IS_CE(child_type) + ? ZEND_TYPE_CE(child_type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(child_type), child_ce); + if (zend_string_equals_ci(parent_name, child_name)) { + return 1; + } else { + /* Check for class aliases */ + zend_class_entry *parent_type_ce = ZEND_TYPE_IS_CE(parent_type) + ? ZEND_TYPE_CE(parent_type) + : zend_lookup_class(parent_name); + zend_class_entry *child_type_ce = ZEND_TYPE_IS_CE(child_type) + ? ZEND_TYPE_CE(child_type) + : zend_lookup_class(child_name); + return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; + } +} + static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ { zval *child = zend_hash_find_ex(&ce->properties_info, key, 1); @@ -714,10 +738,8 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (ZEND_TYPE_IS_CLASS(parent_info->type)) { if (!ZEND_TYPE_IS_CLASS(child_info->type) || ZEND_TYPE_ALLOW_NULL(child_info->type) != ZEND_TYPE_ALLOW_NULL(parent_info->type) || - !zend_string_equals_ci( - ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce), - ZEND_TYPE_IS_CE(child_info->type) ? ZEND_TYPE_CE(child_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(child_info->type), child_info->ce) - )) { + !class_types_compatible(parent_info->type, parent_info->ce, child_info->type, child_info->ce) + ) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), From 7f25e95a684b360d4e3fc39292249696eb9d415d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 16 Jul 2018 21:18:57 +0200 Subject: [PATCH 291/369] Check for conflicting property types in traits --- .../typed_properties_085.phpt | 17 ++++++ Zend/zend_inheritance.c | 55 +++++++++++-------- 2 files changed, 48 insertions(+), 24 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_085.phpt diff --git a/Zend/tests/type_declarations/typed_properties_085.phpt b/Zend/tests/type_declarations/typed_properties_085.phpt new file mode 100644 index 0000000000000..ccac3768cb1c4 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_085.phpt @@ -0,0 +1,17 @@ +--TEST-- +Important properties with different types from traits +--FILE-- + +--EXPECTF-- +Fatal error: T1 and T2 define the same property ($prop) in the composition of C. However, the definition differs and is considered incompatible. Class was composed in %s on line %d diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index c85572da04abf..791b3ed889918 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -676,28 +676,36 @@ zend_string* zend_resolve_property_type(zend_string *type, zend_class_entry *sco return type; } /* }}} */ -zend_bool class_types_compatible( - zend_type parent_type, zend_class_entry *parent_ce, - zend_type child_type, zend_class_entry *child_ce -) { - zend_string *parent_name = ZEND_TYPE_IS_CE(parent_type) - ? ZEND_TYPE_CE(parent_type)->name - : zend_resolve_property_type(ZEND_TYPE_NAME(parent_type), parent_ce); - zend_string *child_name = ZEND_TYPE_IS_CE(child_type) - ? ZEND_TYPE_CE(child_type)->name - : zend_resolve_property_type(ZEND_TYPE_NAME(child_type), child_ce); +zend_bool property_types_compatible(zend_property_info *parent_info, zend_property_info *child_info) { + zend_string *parent_name, *child_name; + zend_class_entry *parent_type_ce, *child_type_ce; + if (parent_info->type == child_info->type) { + return 1; + } + + if (!ZEND_TYPE_IS_CLASS(parent_info->type) || !ZEND_TYPE_IS_CLASS(child_info->type) || + ZEND_TYPE_ALLOW_NULL(parent_info->type) != ZEND_TYPE_ALLOW_NULL(child_info->type)) { + return 0; + } + + parent_name = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce); + child_name = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type)->name + : zend_resolve_property_type(ZEND_TYPE_NAME(child_info->type), child_info->ce); if (zend_string_equals_ci(parent_name, child_name)) { return 1; - } else { - /* Check for class aliases */ - zend_class_entry *parent_type_ce = ZEND_TYPE_IS_CE(parent_type) - ? ZEND_TYPE_CE(parent_type) - : zend_lookup_class(parent_name); - zend_class_entry *child_type_ce = ZEND_TYPE_IS_CE(child_type) - ? ZEND_TYPE_CE(child_type) - : zend_lookup_class(child_name); - return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; } + + /* Check for class aliases */ + parent_type_ce = ZEND_TYPE_IS_CE(parent_info->type) + ? ZEND_TYPE_CE(parent_info->type) + : zend_lookup_class(parent_name); + child_type_ce = ZEND_TYPE_IS_CE(child_info->type) + ? ZEND_TYPE_CE(child_info->type) + : zend_lookup_class(child_name); + return parent_type_ce && child_type_ce && parent_type_ce == child_type_ce; } static void do_inherit_property(zend_property_info *parent_info, zend_string *key, zend_class_entry *ce) /* {{{ */ @@ -736,10 +744,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type) && !(parent_info->flags & ZEND_ACC_PRIVATE))) { if (ZEND_TYPE_IS_CLASS(parent_info->type)) { - if (!ZEND_TYPE_IS_CLASS(child_info->type) || - ZEND_TYPE_ALLOW_NULL(child_info->type) != ZEND_TYPE_ALLOW_NULL(parent_info->type) || - !class_types_compatible(parent_info->type, parent_info->ce, child_info->type, child_info->ce) - ) { + if (!property_types_compatible(parent_info, child_info)) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), @@ -1659,7 +1664,9 @@ static void zend_do_traits_property_binding(zend_class_entry *ce) /* {{{ */ not_compatible = 1; if ((coliding_prop->flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) - == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC))) { + == (flags & (ZEND_ACC_PPP_MASK | ZEND_ACC_STATIC)) && + property_types_compatible(property_info, coliding_prop) + ) { /* the flags are identical, thus, the properties may be compatible */ zval *op1, *op2; zval op1_tmp, op2_tmp; From 398027bdbf598b7a38914cfd7a3166a94fe93171 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 11:59:06 +0000 Subject: [PATCH 292/369] Fix write_property handlers and add zend_std_get_property_with_info --- Zend/tests/type_declarations/typed_properties_061.phpt | 2 ++ Zend/tests/type_declarations/typed_properties_075.phpt | 2 ++ Zend/zend_API.c | 5 ++--- Zend/zend_closures.c | 3 ++- Zend/zend_execute.c | 2 +- Zend/zend_object_handlers.c | 8 +++++++- Zend/zend_object_handlers.h | 3 ++- ext/com_dotnet/com_handlers.c | 3 ++- ext/com_dotnet/com_saproxy.c | 2 +- ext/pdo/pdo_stmt.c | 5 +++-- ext/reflection/php_reflection.c | 5 ++--- 11 files changed, 26 insertions(+), 14 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_061.phpt b/Zend/tests/type_declarations/typed_properties_061.phpt index a12d2c76eaa7a..647543c6d6dfd 100644 --- a/Zend/tests/type_declarations/typed_properties_061.phpt +++ b/Zend/tests/type_declarations/typed_properties_061.phpt @@ -1,5 +1,7 @@ --TEST-- Typed property on overloaded by-ref property +--SKIPIF-- + --FILE-- --FILE-- properties_info, property_name); @@ -1549,6 +1549,12 @@ ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *p } /* }}} */ +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type) /* {{{ */ +{ + zend_property_info *prop_info; + return zend_std_get_static_property_with_info(ce, property_name, type, &prop_info); +} + ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name) /* {{{ */ { zend_throw_error(NULL, "Attempt to unset static property %s::$%s", ZSTR_VAL(ce->name), ZSTR_VAL(property_name)); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index 23b51b364b357..58458bd3b9831 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -175,7 +175,8 @@ extern const ZEND_API zend_object_handlers std_object_handlers; ((fbc)->common.prototype ? (fbc)->common.prototype->common.scope : (fbc)->common.scope) ZEND_API zend_function *zend_std_get_static_method(zend_class_entry *ce, zend_string *function_name_strval, const zval *key); -ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info); +ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend_string *property_name, int type, struct _zend_property_info **prop_info); +ZEND_API zval *zend_std_get_static_property(zend_class_entry *ce, zend_string *property_name, int type); ZEND_API ZEND_COLD zend_bool zend_std_unset_static_property(zend_class_entry *ce, zend_string *property_name); ZEND_API zend_function *zend_std_get_constructor(zend_object *object); ZEND_API struct _zend_property_info *zend_get_property_info(zend_class_entry *ce, zend_string *member, int silent); diff --git a/ext/com_dotnet/com_handlers.c b/ext/com_dotnet/com_handlers.c index 28814de09d9d3..35d94117e587f 100644 --- a/ext/com_dotnet/com_handlers.c +++ b/ext/com_dotnet/com_handlers.c @@ -60,7 +60,7 @@ static zval *com_property_read(zval *object, zval *member, int type, void **cahc return rv; } -static void com_property_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *com_property_write(zval *object, zval *member, zval *value, void **cache_slot) { php_com_dotnet_object *obj; VARIANT v; @@ -78,6 +78,7 @@ static void com_property_write(zval *object, zval *member, zval *value, void **c } else { php_com_throw_exception(E_INVALIDARG, "this variant has no properties"); } + return value; } static zval *com_read_dimension(zval *object, zval *offset, int type, zval *rv) diff --git a/ext/com_dotnet/com_saproxy.c b/ext/com_dotnet/com_saproxy.c index 81bbb63ca85ea..4600048ec3a2b 100644 --- a/ext/com_dotnet/com_saproxy.c +++ b/ext/com_dotnet/com_saproxy.c @@ -71,7 +71,7 @@ static inline void clone_indices(php_com_saproxy *dest, php_com_saproxy *src, in } } -static zval *saproxy_property_read(zval *object, zval *member, int type, void **cahce_slot, zval *rv) +static zval *saproxy_property_read(zval *object, zval *member, int type, void **cache_slot, zval *rv) { ZVAL_NULL(rv); diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index a6b2bedc0bd91..f13203343e8de 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2189,7 +2189,7 @@ const zend_function_entry pdo_dbstmt_functions[] = { }; /* {{{ overloaded handlers for PDOStatement class */ -static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *dbstmt_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { pdo_stmt_t *stmt = Z_PDO_STMT_P(object); @@ -2197,8 +2197,9 @@ static void dbstmt_prop_write(zval *object, zval *member, zval *value, void **ca if (strcmp(Z_STRVAL_P(member), "queryString") == 0) { pdo_raise_impl_error(stmt->dbh, stmt, "HY000", "property queryString is read only"); + return value; } else { - zend_std_write_property(object, member, value, cache_slot); + return zend_std_write_property(object, member, value, cache_slot); } } diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 9350d1a174c4b..a4db99182e8de 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3890,7 +3890,6 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) { reflection_object *intern; zend_class_entry *ce; - zend_property_info *prop_info; zend_string *name; zval *prop, *def_value = NULL; @@ -3903,7 +3902,7 @@ ZEND_METHOD(reflection_class, getStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - prop = zend_std_get_static_property(ce, name, BP_VAR_IS, &prop_info); + prop = zend_std_get_static_property(ce, name, BP_VAR_IS); if (!prop) { if (def_value) { ZVAL_COPY(return_value, def_value); @@ -3937,7 +3936,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) if (UNEXPECTED(zend_update_class_constants(ce) != SUCCESS)) { return; } - variable_ptr = zend_std_get_static_property(ce, name, BP_VAR_W, &prop_info); + variable_ptr = zend_std_get_static_property_with_info(ce, name, BP_VAR_W, &prop_info); if (!variable_ptr) { zend_clear_exception(); zend_throw_exception_ex(reflection_exception_ptr, 0, From e7b86fb60e39eca09d6c92fb7c9884aefb1881e4 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 12:03:23 +0000 Subject: [PATCH 293/369] Remove *tmp arg from zend_verify_property_type() --- .../typed_properties_023.phpt | 2 + Zend/zend_API.c | 23 +- Zend/zend_execute.c | 108 +- Zend/zend_execute.h | 2 +- Zend/zend_object_handlers.c | 16 +- Zend/zend_vm_def.h | 55 +- Zend/zend_vm_execute.h | 1878 +++++++++++------ ext/reflection/php_reflection.c | 2 +- ext/standard/var_unserializer.c | 69 +- ext/standard/var_unserializer.re | 5 +- 10 files changed, 1346 insertions(+), 814 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index e6ab663b2b367..320a7bc8b590d 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -30,6 +30,7 @@ Foo::$i = ref(); var_dump(Foo::$i); Foo::$s = ref(); var_dump(Foo::$s); +var_dump(ref()); ?> --EXPECTF-- string(1) "x" @@ -41,3 +42,4 @@ string(1) "3" int(4) int(5) string(1) "5" +int(5) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 58e75620e4a36..6e5016b9fe558 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1174,21 +1174,20 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ ZVAL_DEREF(val); if (Z_TYPE_P(val) == IS_CONSTANT_AST) { if (prop_info->type) { - zval tmp, tmp2, *v; + zval tmp; ZVAL_COPY(&tmp, val); if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - v = zend_verify_property_type(prop_info, &tmp, &tmp2, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!v)) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, &tmp); class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; } zval_ptr_dtor(val); - ZVAL_COPY_VALUE(val, v); + ZVAL_COPY_VALUE(val, &tmp); } else if (UNEXPECTED(zval_update_constant_ex(val, ce) != SUCCESS)) { return FAILURE; } @@ -1246,14 +1245,14 @@ ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properti zval *slot = OBJ_PROP(object, property_info->offset); if (UNEXPECTED(property_info->type)) { - zval tmp, *val; + zval tmp; - val = zend_verify_property_type(property_info, prop, &tmp, 0); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(property_info, prop); + ZVAL_COPY_VALUE(&tmp, prop); + if (UNEXPECTED(!zend_verify_property_type(property_info, &tmp, 0))) { + zend_verify_property_type_error(property_info, &tmp); continue; } - ZVAL_COPY_VALUE(slot, val); + ZVAL_COPY_VALUE(slot, &tmp); } else { ZVAL_COPY_VALUE(slot, prop); } @@ -4115,13 +4114,13 @@ ZEND_API int zend_update_static_property_ex(zend_class_entry *scope, zend_string Z_TRY_ADDREF_P(value); if (prop_info->type) { - zval *val = zend_verify_property_type(prop_info, value, &tmp, /* strict */ 0); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, /* strict */ 0))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); return FAILURE; } - value = val; + value = &tmp; } zend_assign_to_variable(property, value, IS_VAR, /* strict */ 0); diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9b7a6bb2d20ef..b8a9399d20fa4 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -822,7 +822,7 @@ static int is_null_constant(zend_class_entry *scope, zval *default_value) return 0; } -static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret) +static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *arg) { switch (type_hint) { case _IS_BOOL: { @@ -832,7 +832,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_BOOL(ret, dest); + ZVAL_BOOL(arg, dest); return 1; } case IS_LONG: { @@ -842,7 +842,7 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_LONG(ret, dest); + ZVAL_LONG(arg, dest); return 1; } case IS_DOUBLE: { @@ -852,34 +852,21 @@ static zend_bool zend_verify_weak_scalar_type_hint(zend_uchar type_hint, zval *a return 0; } zval_ptr_dtor(arg); - ZVAL_DOUBLE(ret, dest); + ZVAL_DOUBLE(arg, dest); return 1; } case IS_STRING: { zend_string *dest; - if (arg != ret) { - ZVAL_COPY(ret, arg); - /* on success "ret" is converted to IS_STRING */ - if (!zend_parse_arg_str_weak(ret, &dest)) { - zval_ptr_dtor(ret); - return 0; - } - zval_ptr_dtor(arg); - return 1; - } - /* on success "ret" is converted to IS_STRING */ - if (!zend_parse_arg_str_weak(ret, &dest)) { - return 0; - } - return 1; + /* on success "arg" is converted to IS_STRING */ + return zend_parse_arg_str_weak(arg, &dest); } default: return 0; } } -static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zval *ret, zend_bool strict) +static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, zend_bool strict) { if (UNEXPECTED(strict)) { /* SSTH Exception: IS_LONG may be accepted as IS_DOUBLE (converted) */ @@ -890,7 +877,7 @@ static zend_bool zend_verify_scalar_type_hint(zend_uchar type_hint, zval *arg, z /* NULL may be accepted only by nullable hints (this is already checked) */ return 0; } - return zend_verify_weak_scalar_type_hint(type_hint, arg, ret); + return zend_verify_weak_scalar_type_hint(type_hint, arg); } ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_info *info, zval *property) @@ -946,52 +933,49 @@ ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info) { return 1; } -static zend_always_inline zval* i_zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) +static zend_always_inline zend_bool i_zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { if (ZEND_TYPE_IS_CLASS(info->type)) { if (UNEXPECTED(Z_TYPE_P(property) != IS_OBJECT)) { if (EXPECTED(Z_TYPE_P(property) == IS_NULL) && EXPECTED(ZEND_TYPE_ALLOW_NULL(info->type))) { - return property; + return 1; } - return NULL; + return 0; } if (UNEXPECTED(!ZEND_TYPE_IS_CE(info->type)) && UNEXPECTED(!zend_load_property_class_type(info))) { - return NULL; + return 0; } if (EXPECTED(instanceof_function(Z_OBJCE_P(property), ZEND_TYPE_CE(info->type)))) { - return property; + return 1; } - return NULL; + return 0; } if (EXPECTED(ZEND_TYPE_CODE(info->type) == Z_TYPE_P(property))) { - return property; + return 1; } else if (EXPECTED(Z_TYPE_P(property) == IS_NULL)) { - return EXPECTED(ZEND_TYPE_ALLOW_NULL(info->type)) ? property : NULL; + return ZEND_TYPE_ALLOW_NULL(info->type); } else if (EXPECTED(ZEND_TYPE_CODE(info->type) == IS_CALLABLE)) { if (Z_TYPE_P(property) == IS_OBJECT) { - return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)) ? - property : NULL; + return instanceof_function(zend_ce_closure, Z_OBJCE_P(property)); } else { - return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL) ? - property : NULL; + return zend_is_callable(property, IS_CALLABLE_CHECK_SILENT, NULL); } } else if (ZEND_TYPE_CODE(info->type) == _IS_BOOL && EXPECTED(Z_TYPE_P(property) == IS_FALSE || Z_TYPE_P(property) == IS_TRUE)) { - return property; + return 1; } else if (ZEND_TYPE_CODE(info->type) == IS_ITERABLE) { - return zend_is_iterable(property) ? property : NULL; + return zend_is_iterable(property); } else { - return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, tmp, strict) ? - tmp : NULL; + return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(info->type), property, strict); } } -zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict) +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict) { - return i_zend_verify_property_type(info, property, tmp, strict); + return i_zend_verify_property_type(info, property, strict); } static zend_always_inline zend_bool zend_check_type( @@ -1045,7 +1029,7 @@ static zend_always_inline zend_bool zend_check_type( } else if (ref && ZEND_REF_HAS_TYPE_SOURCES(ref)) { return 0; /* we cannot have conversions for typed refs */ } else { - return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg, arg, + return zend_verify_scalar_type_hint(ZEND_TYPE_CODE(type), arg, is_return_type ? ZEND_RET_USES_STRICT_TYPES() : ZEND_ARG_USES_STRICT_TYPES()); } @@ -1569,17 +1553,12 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { fast_long_decrement_function(prop); } - if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop); - if (inc) { - ZVAL_LONG(prop, ZEND_LONG_MAX); - } else { - ZVAL_LONG(prop, ZEND_LONG_MIN); - } + if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG) && UNEXPECTED(prop_info) && UNEXPECTED(!zend_verify_property_type(prop_info, prop, EX_USES_STRICT_TYPES()))) { + zend_verify_property_type_error(prop_info, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); } } } else { @@ -1601,7 +1580,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -1634,17 +1613,12 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ fast_long_decrement_function(prop); } if (UNEXPECTED(Z_TYPE_P(prop) != IS_LONG)) { - if (UNEXPECTED(prop_info)) { - zval tmp, *val; - - val = zend_verify_property_type(prop_info, prop, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { - zend_verify_property_type_error(prop_info, prop); - if (inc) { - ZVAL_LONG(prop, ZEND_LONG_MAX); - } else { - ZVAL_LONG(prop, ZEND_LONG_MIN); - } + if (UNEXPECTED(prop_info) && UNEXPECTED(!zend_verify_property_type(prop_info, prop, EX_USES_STRICT_TYPES()))) { + zend_verify_property_type_error(prop_info, prop); + if (inc) { + ZVAL_LONG(prop, ZEND_LONG_MAX); + } else { + ZVAL_LONG(prop, ZEND_LONG_MIN); } } } @@ -1669,7 +1643,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -2849,7 +2823,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_refer } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv, zv))) { + if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv))) { zend_throw_ref_type_error_zval(prop, zv); return 0; } @@ -2881,13 +2855,13 @@ ZEND_API zend_bool zend_verify_prop_assignable_by_ref(zend_property_info *prop_i zend_throw_ref_type_error_type(ref_prop, prop_info, val); return 0; } - if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_type), val, val)) { + if (zend_verify_weak_scalar_type_hint(ZEND_TYPE_CODE(prop_type), val)) { return 1; } } } else { ZVAL_DEREF(val); - if (i_zend_verify_property_type(prop_info, val, val, strict)) { + if (i_zend_verify_property_type(prop_info, val, strict)) { return 1; } } diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index cf1e93caa08eb..f8ac4260220d6 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -488,7 +488,7 @@ static zend_always_inline zend_property_info* zend_object_fetch_property_type_in return NULL; } -zval* zend_verify_property_type(zend_property_info *info, zval *property, zval *tmp, zend_bool strict); +zend_bool zend_verify_property_type(zend_property_info *info, zval *property, zend_bool strict); ZEND_COLD void zend_verify_property_type_error(zend_property_info *info, zval *property); #define ZEND_REF_ADD_TYPE_SOURCE(ref, source) \ diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 75242b9d074df..95ac78d4067c3 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -786,19 +786,19 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot); - zval tmp, *val; + zval tmp; Z_TRY_ADDREF_P(value); if (UNEXPECTED(prop_info)) { - val = zend_verify_property_type(prop_info, value, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); value = &EG(error_zval); goto exit; } - value = val; + value = &tmp; } found: @@ -857,16 +857,16 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { zend_property_info *prop_info; - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(member), cache_slot))) { - val = zend_verify_property_type(prop_info, value, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); goto exit; } - value = val; + value = &tmp; } ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 1c4fe0f668f40..8b09909443d3c 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -854,7 +854,7 @@ ZEND_VM_C_LABEL(assign_op_object): zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -920,7 +920,7 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -2315,11 +2315,11 @@ ZEND_VM_C_LABEL(assign_object): property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); FREE_OP_DATA(); FREE_OP2(); @@ -2327,10 +2327,10 @@ ZEND_VM_C_LABEL(assign_object): HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (OP_DATA_TYPE == IS_CONST && val == value) { + if (OP_DATA_TYPE == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } ZEND_VM_C_LABEL(fast_assign_obj): @@ -2419,9 +2419,12 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -2434,30 +2437,42 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(prop_info->type)) { +#if defined(ZEND_VM_SPEC) && (OP_DATA_TYPE & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if !defined(ZEND_VM_SPEC) || (OP_DATA_TYPE & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - FREE_OP_DATA(); + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 35bc295c41576..afab073cda9e6 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4600,7 +4600,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -5124,9 +5124,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5139,30 +5142,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5176,9 +5191,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5191,30 +5209,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5228,9 +5258,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5243,30 +5276,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -5280,9 +5325,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -5295,30 +5343,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -7178,7 +7238,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -8543,9 +8603,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8558,30 +8621,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8595,9 +8670,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8610,30 +8688,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8647,9 +8737,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8662,30 +8755,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -8699,9 +8804,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -8714,30 +8822,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9049,7 +9169,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -9417,9 +9537,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9432,30 +9555,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9469,9 +9604,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9484,30 +9622,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9521,9 +9671,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9536,30 +9689,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -9573,9 +9738,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -9588,30 +9756,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -14904,9 +15084,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -14919,30 +15102,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -14956,9 +15151,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -14971,30 +15169,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -15008,9 +15218,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -15023,30 +15236,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -15060,9 +15285,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -15075,30 +15303,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17264,9 +17504,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17279,30 +17522,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17316,9 +17571,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17331,30 +17589,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17368,9 +17638,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17383,30 +17656,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17420,9 +17705,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17435,30 +17723,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17882,9 +18182,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17897,30 +18200,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17934,9 +18249,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -17949,30 +18267,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -17986,9 +18316,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -18001,30 +18334,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -18038,9 +18383,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -18053,30 +18401,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -20253,7 +20613,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -20819,7 +21179,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -21518,7 +21878,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -24268,7 +24628,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -24334,7 +24694,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -25240,11 +25600,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -25252,10 +25612,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25381,11 +25741,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -25393,10 +25753,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25522,11 +25882,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -25534,10 +25894,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -25663,11 +26023,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -25675,10 +26035,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -27111,7 +27471,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -27177,7 +27537,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -28088,11 +28448,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -28100,10 +28460,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28229,11 +28589,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -28241,10 +28601,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28370,11 +28730,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -28382,10 +28742,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -28511,11 +28871,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -28523,10 +28883,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -30137,7 +30497,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -31634,7 +31994,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -32453,11 +32813,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -32465,10 +32825,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32594,11 +32954,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -32606,10 +32966,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32735,11 +33095,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -32747,10 +33107,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -32876,11 +33236,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -32888,10 +33248,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -34554,7 +34914,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -35132,11 +35492,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -35144,10 +35504,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35273,11 +35633,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35285,10 +35645,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35414,11 +35774,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -35426,10 +35786,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -35555,11 +35915,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -35567,10 +35927,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -36600,7 +36960,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -37182,11 +37542,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37194,10 +37554,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37323,11 +37683,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37335,10 +37695,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37464,11 +37824,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -37476,10 +37836,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -37605,11 +37965,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -37617,10 +37977,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -39278,7 +39638,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -39856,11 +40216,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -39868,10 +40228,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -39997,11 +40357,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40009,10 +40369,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -40138,11 +40498,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -40150,10 +40510,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -40279,11 +40639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -40291,10 +40651,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -43658,7 +44018,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -43724,7 +44084,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -44993,11 +45353,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -45005,10 +45365,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45134,11 +45494,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45146,10 +45506,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45275,11 +45635,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -45287,10 +45647,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45416,11 +45776,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -45428,10 +45788,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -45520,9 +45880,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45535,30 +45898,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45572,9 +45947,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45587,30 +45965,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45624,9 +46014,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45639,30 +46032,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -45676,9 +46081,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -45691,30 +46099,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -48294,7 +48714,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -48360,7 +48780,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -49522,11 +49942,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49534,10 +49954,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49663,11 +50083,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49675,10 +50095,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49804,11 +50224,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); zval_ptr_dtor_nogc(free_op2); @@ -49816,10 +50236,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -49945,11 +50365,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op2); @@ -49957,10 +50377,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -51641,9 +52061,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51656,30 +52079,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51693,9 +52128,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51708,30 +52146,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51745,9 +52195,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51760,30 +52213,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -51797,9 +52262,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -51812,30 +52280,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -52301,7 +52781,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h zval z_copy; binary_op(&z_copy, prop, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -52910,9 +53390,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CONST & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -52925,30 +53408,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CONST & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CONST & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_CONST & IS_TMP_VAR) + value = &tmp; - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -52962,9 +53457,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -52977,30 +53475,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_TMP_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; +#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) + value = &tmp; - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } - - if (ref && GC_DELREF(ref) == 0) { + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53014,9 +53524,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE zend_free_op free_op_data; - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_VAR & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -53029,30 +53542,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_VAR & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_VAR & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_VAR & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -53066,9 +53591,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU { USE_OPLINE - zval *prop, *val, *value, tmp; + zval *prop, *value; zend_reference *ref = NULL; zend_property_info *prop_info; +#if 0 || !(IS_CV & IS_TMP_VAR) + zval tmp; +#endif SAVE_OPLINE(); @@ -53081,30 +53609,42 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { +#if 1 && (IS_CV & IS_TMP_VAR) + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { +#else +#if 0 || (IS_CV & (IS_CV | IS_VAR)) if (Z_ISREF_P(value)) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } - - val = i_zend_verify_property_type(prop_info, value, ((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) ? &tmp : value, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { +#endif + if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { +#endif zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } UNDEF_RESULT(); HANDLE_EXCEPTION(); } - value = val; - - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1)) && val != &tmp) { - Z_TRY_ADDREF_P(val); - } +#if 0 || !(IS_CV & IS_TMP_VAR) + value = &tmp; - if (ref && GC_DELREF(ref) == 0) { + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } - } +#endif - value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { + value = zend_assign_to_variable(prop, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); @@ -55031,7 +55571,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP zval z_copy; binary_op(&z_copy, zptr, value); - if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, &z_copy, EX_USES_STRICT_TYPES()) != NULL)) { + if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(zptr); ZVAL_COPY_VALUE(zptr, &z_copy); } else { @@ -56099,11 +56639,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -56111,10 +56651,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CONST == IS_CONST && val == value) { + if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56240,11 +56780,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56252,10 +56792,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_TMP_VAR == IS_CONST && val == value) { + if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56381,11 +56921,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); zval_ptr_dtor_nogc(free_op_data); @@ -56393,10 +56933,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_VAR == IS_CONST && val == value) { + if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: @@ -56522,11 +57062,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ property_val = OBJ_PROP(zobj, prop_offset); if (Z_TYPE_P(property_val) != IS_UNDEF) { zend_property_info *prop_info = (zend_property_info*) CACHED_PTR_EX(cache_slot + 2); - zval tmp, *val; + zval tmp; if (UNEXPECTED(prop_info != NULL)) { - val = i_zend_verify_property_type(prop_info, value, &tmp, EX_USES_STRICT_TYPES()); - if (UNEXPECTED(!val)) { + ZVAL_COPY_VALUE(&tmp, value); + if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); @@ -56534,10 +57074,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ HANDLE_EXCEPTION(); } /* will remain valid, thus no need to check prop_info in future here */ - if (IS_CV == IS_CONST && val == value) { + if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } - value = val; + value = &tmp; } fast_assign_obj: diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index a4db99182e8de..595fd1d9a2c2e 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -3953,7 +3953,7 @@ ZEND_METHOD(reflection_class, setStaticPropertyValue) } } - if (prop_info->type && !zend_verify_property_type(prop_info, value, value, 0)) { + if (prop_info->type && !zend_verify_property_type(prop_info, value, 0)) { zend_verify_property_type_error(prop_info, value); return; } diff --git a/ext/standard/var_unserializer.c b/ext/standard/var_unserializer.c index cedb0782db333..97413ff79808a 100644 --- a/ext/standard/var_unserializer.c +++ b/ext/standard/var_unserializer.c @@ -546,11 +546,12 @@ static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTab } if (UNEXPECTED(info)) { - data = zend_verify_property_type(info, data, &tmp, 1); - if (UNEXPECTED(!data)) { + ZVAL_COPY_VALUE(&tmp, data); + if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); return 0; } + data = &tmp; ZVAL_COPY(old_data, data); } @@ -721,7 +722,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) start = cursor; -#line 725 "ext/standard/var_unserializer.c" +#line 726 "ext/standard/var_unserializer.c" { YYCTYPE yych; static const unsigned char yybm[] = { @@ -779,9 +780,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) yy2: ++YYCURSOR; yy3: -#line 1124 "ext/standard/var_unserializer.re" +#line 1125 "ext/standard/var_unserializer.re" { return 0; } -#line 785 "ext/standard/var_unserializer.c" +#line 786 "ext/standard/var_unserializer.c" yy4: yych = *(YYMARKER = ++YYCURSOR); if (yych == ':') goto yy17; @@ -828,13 +829,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy3; yy15: ++YYCURSOR; -#line 1118 "ext/standard/var_unserializer.re" +#line 1119 "ext/standard/var_unserializer.re" { /* this is the case where we have less data than planned */ php_error_docref(NULL, E_NOTICE, "Unexpected end of serialized data"); return 0; /* not sure if it should be 0 or 1 here? */ } -#line 838 "ext/standard/var_unserializer.c" +#line 839 "ext/standard/var_unserializer.c" yy17: yych = *++YYCURSOR; if (yybm[0+yych] & 128) { @@ -845,13 +846,13 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy3; yy19: ++YYCURSOR; -#line 779 "ext/standard/var_unserializer.re" +#line 780 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_NULL(rval); return 1; } -#line 855 "ext/standard/var_unserializer.c" +#line 856 "ext/standard/var_unserializer.c" yy21: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1055,7 +1056,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy57: ++YYCURSOR; -#line 729 "ext/standard/var_unserializer.re" +#line 730 "ext/standard/var_unserializer.re" { zend_long id; @@ -1080,7 +1081,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1084 "ext/standard/var_unserializer.c" +#line 1085 "ext/standard/var_unserializer.c" yy59: yych = *++YYCURSOR; if (yych == '"') goto yy80; @@ -1091,22 +1092,22 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy61: ++YYCURSOR; -#line 785 "ext/standard/var_unserializer.re" +#line 786 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_FALSE(rval); return 1; } -#line 1101 "ext/standard/var_unserializer.c" +#line 1102 "ext/standard/var_unserializer.c" yy63: ++YYCURSOR; -#line 791 "ext/standard/var_unserializer.re" +#line 792 "ext/standard/var_unserializer.re" { *p = YYCURSOR; ZVAL_TRUE(rval); return 1; } -#line 1110 "ext/standard/var_unserializer.c" +#line 1111 "ext/standard/var_unserializer.c" yy65: ++YYCURSOR; if ((YYLIMIT - YYCURSOR) < 3) YYFILL(3); @@ -1126,7 +1127,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } yy67: ++YYCURSOR; -#line 839 "ext/standard/var_unserializer.re" +#line 840 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 use_double: @@ -1135,7 +1136,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_DOUBLE(rval, zend_strtod((const char *)start + 2, NULL)); return 1; } -#line 1139 "ext/standard/var_unserializer.c" +#line 1140 "ext/standard/var_unserializer.c" yy69: yych = *++YYCURSOR; if (yych <= ',') { @@ -1157,7 +1158,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy72: ++YYCURSOR; -#line 797 "ext/standard/var_unserializer.re" +#line 798 "ext/standard/var_unserializer.re" { #if SIZEOF_ZEND_LONG == 4 int digits = YYCURSOR - start - 3; @@ -1183,14 +1184,14 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_LONG(rval, parse_iv(start + 2)); return 1; } -#line 1187 "ext/standard/var_unserializer.c" +#line 1188 "ext/standard/var_unserializer.c" yy74: yych = *++YYCURSOR; if (yych == '"') goto yy88; goto yy18; yy75: ++YYCURSOR; -#line 754 "ext/standard/var_unserializer.re" +#line 755 "ext/standard/var_unserializer.re" { zend_long id; @@ -1215,14 +1216,14 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1219 "ext/standard/var_unserializer.c" +#line 1220 "ext/standard/var_unserializer.c" yy77: yych = *++YYCURSOR; if (yych == '"') goto yy90; goto yy18; yy78: ++YYCURSOR; -#line 966 "ext/standard/var_unserializer.re" +#line 967 "ext/standard/var_unserializer.re" { size_t len, len2, len3, maxlen; zend_long elements; @@ -1374,10 +1375,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1378 "ext/standard/var_unserializer.c" +#line 1379 "ext/standard/var_unserializer.c" yy80: ++YYCURSOR; -#line 888 "ext/standard/var_unserializer.re" +#line 889 "ext/standard/var_unserializer.re" { size_t len, maxlen; zend_string *str; @@ -1411,10 +1412,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) ZVAL_STR(rval, str); return 1; } -#line 1415 "ext/standard/var_unserializer.c" +#line 1416 "ext/standard/var_unserializer.c" yy82: ++YYCURSOR; -#line 922 "ext/standard/var_unserializer.re" +#line 923 "ext/standard/var_unserializer.re" { zend_long elements = parse_iv(start + 2); /* use iv() not uiv() in order to check data range */ @@ -1447,7 +1448,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return finish_nested_data(UNSERIALIZE_PASSTHRU); } -#line 1451 "ext/standard/var_unserializer.c" +#line 1452 "ext/standard/var_unserializer.c" yy84: yych = *++YYCURSOR; if (yych <= '/') goto yy18; @@ -1466,7 +1467,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) goto yy18; yy88: ++YYCURSOR; -#line 955 "ext/standard/var_unserializer.re" +#line 956 "ext/standard/var_unserializer.re" { zend_long elements; if (!var_hash) return 0; @@ -1477,10 +1478,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return object_common2(UNSERIALIZE_PASSTHRU, elements); } -#line 1481 "ext/standard/var_unserializer.c" +#line 1482 "ext/standard/var_unserializer.c" yy90: ++YYCURSOR; -#line 848 "ext/standard/var_unserializer.re" +#line 849 "ext/standard/var_unserializer.re" { size_t len, maxlen; char *str; @@ -1520,10 +1521,10 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) } return 1; } -#line 1524 "ext/standard/var_unserializer.c" +#line 1525 "ext/standard/var_unserializer.c" yy92: ++YYCURSOR; -#line 823 "ext/standard/var_unserializer.re" +#line 824 "ext/standard/var_unserializer.re" { *p = YYCURSOR; @@ -1539,9 +1540,9 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 1; } -#line 1543 "ext/standard/var_unserializer.c" +#line 1544 "ext/standard/var_unserializer.c" } -#line 1126 "ext/standard/var_unserializer.re" +#line 1127 "ext/standard/var_unserializer.re" return 0; diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 9bd82367defe0..c050c2d36c3da 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -550,11 +550,12 @@ string_key: } if (UNEXPECTED(info)) { - data = zend_verify_property_type(info, data, &tmp, 1); - if (UNEXPECTED(!data)) { + ZVAL_COPY_VALUE(&tmp, data); + if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); return 0; } + data = &tmp; ZVAL_COPY(old_data, data); } From 92302a80abf0e3f12048f387e32b77a90af95493 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 21 Jul 2018 13:42:55 +0000 Subject: [PATCH 294/369] Remove useless separations/copies --- Zend/zend_execute.h | 2 +- Zend/zend_vm_def.h | 5 ----- Zend/zend_vm_execute.h | 45 ------------------------------------------ 3 files changed, 1 insertion(+), 51 deletions(-) diff --git a/Zend/zend_execute.h b/Zend/zend_execute.h index f8ac4260220d6..49bbf416e45c2 100644 --- a/Zend/zend_execute.h +++ b/Zend/zend_execute.h @@ -67,7 +67,7 @@ static zend_always_inline zend_type zend_get_prop_info_ref_type(zend_property_in if (!EG(exception)) { zend_throw_error(NULL, "Class %s must be loaded when used by reference for property type", ZSTR_VAL(ZEND_TYPE_NAME(prop_info->type))); } - return 0x3FC; + return ZEND_TYPE_CODE(_IS_ERROR); } return prop_info->type; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 8b09909443d3c..ab8b2cf290d51 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -842,7 +842,6 @@ ZEND_VM_C_LABEL(assign_op_object): is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -904,7 +903,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); @@ -913,7 +911,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_static_prop_helper, CONST|TMP|VAR|CV, UNUSE is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -1082,7 +1079,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -1092,7 +1088,6 @@ ZEND_VM_HELPER(zend_binary_assign_op_simple_helper, VAR|CV, CONST|TMPVAR|CV, bin zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index afab073cda9e6..cdbb727df3598 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4584,7 +4584,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -4593,7 +4592,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -7222,7 +7220,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -7231,7 +7228,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -9153,7 +9149,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -9162,7 +9157,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -20597,7 +20591,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -20606,7 +20599,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -21163,7 +21155,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -21172,7 +21163,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -21862,7 +21852,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -21871,7 +21860,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -24616,7 +24604,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -24678,7 +24665,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -24687,7 +24673,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -24855,7 +24840,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -24865,7 +24849,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -27459,7 +27442,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -27521,7 +27503,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -27530,7 +27511,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -27699,7 +27679,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -27709,7 +27688,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -30481,7 +30459,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -30490,7 +30467,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -31982,7 +31958,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -32162,7 +32137,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -32172,7 +32146,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -34902,7 +34875,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -36948,7 +36920,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -39626,7 +39597,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -44006,7 +43976,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -44068,7 +44037,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -44077,7 +44045,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -44245,7 +44212,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -44255,7 +44221,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -48702,7 +48667,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -48764,7 +48728,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -48773,7 +48736,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -48942,7 +48904,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -48952,7 +48913,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } @@ -52765,7 +52725,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h } ZVAL_DEREF(prop); - SEPARATE_ZVAL_NOREF(prop); value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); @@ -52774,7 +52733,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_static_prop_h is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); prop = Z_REFVAL_P(prop); } - SEPARATE_ZVAL_NOREF(prop); if (UNEXPECTED(prop_info->type || is_typed_ref)) { /* special case for typed properties */ @@ -55559,7 +55517,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref); zptr = Z_REFVAL_P(zptr); } - SEPARATE_ZVAL_NOREF(zptr); if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); @@ -55739,7 +55696,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval old; ZVAL_COPY_VALUE(&old, var_ptr); - zval_opt_copy_ctor(var_ptr); binary_op(var_ptr, var_ptr, value); if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { @@ -55749,7 +55705,6 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_simple_helper zval_ptr_dtor(&old); } } else { - SEPARATE_ZVAL_NOREF(var_ptr); binary_op(var_ptr, var_ptr, value); } From ffbf025067dae598ea1c2e9fd0a42f4f4349011f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 31 Jul 2018 19:21:09 +0200 Subject: [PATCH 295/369] handle by ref mysqli/PDO statement result binding --- ext/mysqli/mysqli_api.c | 28 +++----- ext/mysqlnd/mysqlnd_ps.c | 130 +++++----------------------------- ext/mysqlnd/mysqlnd_structs.h | 1 - ext/pdo/pdo_stmt.c | 3 +- 4 files changed, 32 insertions(+), 130 deletions(-) diff --git a/ext/mysqli/mysqli_api.c b/ext/mysqli/mysqli_api.c index 2bcbe2846ebe4..f8d71b8bbabd1 100644 --- a/ext/mysqli/mysqli_api.c +++ b/ext/mysqli/mysqli_api.c @@ -969,17 +969,11 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) zval *result; /* it must be a reference, isn't it? */ if (Z_ISREF(stmt->result.vars[i])) { - result = Z_REFVAL(stmt->result.vars[i]); + result = stmt->result.vars[i]; } else { - result = &stmt->result.vars[i]; + continue; // but be safe ... } - /* - QQ: Isn't it quite better to call zval_dtor(). What if the user has - assigned a resource, or an array to the bound variable? We are going - to leak probably. zval_dtor() will handle also Unicode/Non-unicode mode. - */ /* Even if the string is of length zero there is one byte alloced so efree() in all cases */ - zval_ptr_dtor(result); if (!stmt->result.is_null[i]) { switch (stmt->result.buf[i].type) { case IS_LONG: @@ -1000,16 +994,16 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) } while (--j > 0); tmp[10]= '\0'; /* unsigned int > INT_MAX is 10 digits - ALWAYS */ - ZVAL_STRINGL(result, tmp, 10); + ZEND_TRY_ASSIGN_STRINGL(result, tmp, 10); efree(tmp); break; } #endif } if (stmt->stmt->fields[i].flags & UNSIGNED_FLAG) { - ZVAL_LONG(result, *(unsigned int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(unsigned int *)stmt->result.buf[i].val); } else { - ZVAL_LONG(result, *(int *)stmt->result.buf[i].val); + ZEND_TRY_ASSIGN_LONG(result, *(int *)stmt->result.buf[i].val); } break; case IS_DOUBLE: @@ -1026,7 +1020,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) dval = *((double *)stmt->result.buf[i].val); } - ZVAL_DOUBLE(result, dval); + ZEND_TRY_ASSIGN_DOUBLE(result, dval); break; } case IS_STRING: @@ -1067,20 +1061,20 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) * use MYSQLI_LL_SPEC. */ snprintf(tmp, sizeof(tmp), (stmt->stmt->fields[i].flags & UNSIGNED_FLAG)? MYSQLI_LLU_SPEC : MYSQLI_LL_SPEC, llval); - ZVAL_STRING(result, tmp); + ZEND_TRY_ASSIGN_STRING(result, tmp); } else { - ZVAL_LONG(result, llval); + ZEND_TRY_ASSIGN_LONG(result, llval); } } else { #if defined(MYSQL_DATA_TRUNCATED) && MYSQL_VERSION_ID > 50002 if (ret == MYSQL_DATA_TRUNCATED && *(stmt->stmt->bind[i].error) != 0) { /* result was truncated */ - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->stmt->bind[i].buffer_length); } else { #else { #endif - ZVAL_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); + ZEND_TRY_ASSIGN_STRINGL(result, stmt->result.buf[i].val, stmt->result.buf[i].output_len); } } break; @@ -1088,7 +1082,7 @@ void mysqli_stmt_fetch_libmysql(INTERNAL_FUNCTION_PARAMETERS) break; } } else { - ZVAL_NULL(result); + ZEND_TRY_ASSIGN_NULL(result); } } } else { diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index f3fab43f0c075..ed872ca900402 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -641,39 +641,6 @@ MYSQLND_METHOD(mysqlnd_stmt, send_execute)(MYSQLND_STMT * const s, const enum_my UPSERT_STATUS_SET_AFFECTED_ROWS_TO_ERROR(conn->upsert_status); if (stmt->result && stmt->state >= MYSQLND_STMT_PREPARED && stmt->field_count) { - /* - We don need to copy the data from the buffers which we will clean. - Because it has already been copied. See - #ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - */ -#ifdef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - if (stmt->result_bind && - stmt->result_zvals_separated_once == TRUE && - stmt->state >= MYSQLND_STMT_USER_FETCHING) - { - /* - We need to copy the data from the buffers which we will clean. - The bound variables point to them only if the user has started - to fetch data (MYSQLND_STMT_USER_FETCHING). - We need to check 'result_zvals_separated_once' or we will leak - in the following scenario - prepare("select 1 from dual"); - execute(); - fetch(); <-- no binding, but that's not a problem - bind_result(); - execute(); <-- here we will leak because we separate without need - */ - unsigned int i; - for (i = 0; i < stmt->field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - Z_TRY_ADDREF_P(result); - } - } - } -#endif - s->m->flush(s); /* @@ -794,32 +761,12 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsign } for (i = 0; i < result->field_count; i++) { - zval *result = &stmt->result_bind[i].zv; - - ZVAL_DEREF(result); - /* Clean what we copied last time */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif /* copy the type */ - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); - if (Z_TYPE(current_row[i]) != IS_NULL) { - /* - Copy the value. - Pre-condition is that the zvals in the result_bind buffer - have been ZVAL_NULL()-ed or to another simple type - (int, double, bool but not string). Because of the reference - counting the user can't delete the strings the variables point to. - */ - - ZVAL_COPY_VALUE(result, ¤t_row[i]); -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - Z_TRY_ADDREF_P(result); -#endif - } else { - ZVAL_NULL(result); - } + Z_TRY_ADDREF(current_row[i]); + zend_try_assign_ex(resultzv, ¤t_row[i], 0); } } } @@ -899,28 +846,20 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi } for (i = 0; i < field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); /* stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif - if (!Z_ISNULL_P(data)) { - if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ - meta->fields[i].max_length = Z_STRLEN_P(data); - } - ZVAL_COPY_VALUE(result, data); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } else { - ZVAL_NULL(result); + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ + meta->fields[i].max_length = Z_STRLEN_P(data); } + zend_try_assign_ex(resultzv, data, 0); + /* copied data, thus also the ownership. Thus null data */ + ZVAL_NULL(data); } } MYSQLND_INC_CONN_STATISTIC(conn->stats, STAT_ROWS_FETCHED_FROM_CLIENT_PS_UNBUF); @@ -1084,33 +1023,25 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { + zval *resultzv = &stmt->result_bind[i].zv; + if (stmt->result_bind[i].bound == TRUE && Z_ISUNDEF_P(resultzv)) { zval *data = &result->unbuf->last_row_data[i]; - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); /* stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ -#ifndef WE_DONT_COPY_IN_BUFFERED_AND_UNBUFFERED_BECAUSEOF_IS_REF - zval_ptr_dtor(result); -#endif DBG_INF_FMT("i=%u bound_var=%p type=%u refc=%u", i, &stmt->result_bind[i].zv, Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? Z_REFCOUNT(stmt->result_bind[i].zv) : 0); - if (!Z_ISNULL_P(data)) { - if ((Z_TYPE_P(data) == IS_STRING) && - (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { - meta->fields[i].max_length = Z_STRLEN_P(data); - } - ZVAL_COPY_VALUE(result, data); - /* copied data, thus also the ownership. Thus null data */ - ZVAL_NULL(data); - } else { - ZVAL_NULL(result); + if ((Z_TYPE_P(data) == IS_STRING) && + (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { + meta->fields[i].max_length = Z_STRLEN_P(data); } + zend_try_assign_ex(resultzv, data, 0); + /* copied data, thus also the ownership. Thus null data */ + ZVAL_NULL(data); } } } else { @@ -1188,28 +1119,6 @@ MYSQLND_METHOD(mysqlnd_stmt, fetch)(MYSQLND_STMT * const s, zend_bool * const fe SET_EMPTY_ERROR(stmt->error_info); SET_EMPTY_ERROR(conn->error_info); - DBG_INF_FMT("result_bind=%p separated_once=%u", &stmt->result_bind, stmt->result_zvals_separated_once); - /* - The user might have not bound any variables for result. - Do the binding once she does it. - */ - if (stmt->result_bind && !stmt->result_zvals_separated_once) { - unsigned int i; - /* - mysqlnd_stmt_store_result() has been called free the bind - variables to prevent leaking of their previous content. - */ - for (i = 0; i < stmt->result->field_count; i++) { - if (stmt->result_bind[i].bound == TRUE) { - zval *result = &stmt->result_bind[i].zv; - ZVAL_DEREF(result); - zval_ptr_dtor(result); - ZVAL_NULL(result); - } - } - stmt->result_zvals_separated_once = TRUE; - } - ret = stmt->result->m.fetch_row(stmt->result, (void*)s, 0, fetched_anything); DBG_RETURN(ret); } @@ -1605,7 +1514,6 @@ MYSQLND_METHOD(mysqlnd_stmt, bind_result)(MYSQLND_STMT * const s, } mysqlnd_stmt_separate_result_bind(s); - stmt->result_zvals_separated_once = FALSE; stmt->result_bind = result_bind; for (i = 0; i < stmt->field_count; i++) { /* Prevent from freeing */ diff --git a/ext/mysqlnd/mysqlnd_structs.h b/ext/mysqlnd/mysqlnd_structs.h index 858b6620089cd..525b0eeda10ed 100644 --- a/ext/mysqlnd/mysqlnd_structs.h +++ b/ext/mysqlnd/mysqlnd_structs.h @@ -1259,7 +1259,6 @@ struct st_mysqlnd_stmt_data unsigned char send_types_to_server; MYSQLND_PARAM_BIND *param_bind; MYSQLND_RESULT_BIND *result_bind; - zend_bool result_zvals_separated_once; MYSQLND_UPSERT_STATUS * upsert_status; MYSQLND_UPSERT_STATUS upsert_status_impl; diff --git a/ext/pdo/pdo_stmt.c b/ext/pdo/pdo_stmt.c index f13203343e8de..c0d7cfee22309 100644 --- a/ext/pdo/pdo_stmt.c +++ b/ext/pdo/pdo_stmt.c @@ -2542,9 +2542,10 @@ static zval *row_dim_read(zval *object, zval *member, int type, zval *rv) return row_prop_read(object, member, type, NULL, rv); } -static void row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) +static zval *row_prop_write(zval *object, zval *member, zval *value, void **cache_slot) { php_error_docref(NULL, E_WARNING, "This PDORow is not from a writable result set"); + return value; } static void row_dim_write(zval *object, zval *member, zval *value) From 5e2ebdcb48a027e6537507e1ec5175ab6c8f2c34 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 10:52:17 +0200 Subject: [PATCH 296/369] Fix string length updates --- ext/mysqlnd/mysqlnd_ps.c | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index ed872ca900402..56ee51ab950c9 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -854,10 +854,11 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi stmt->result_bind[i].zv has been already destructed in result->unbuf->m.free_last_data() */ - if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ - meta->fields[i].max_length = Z_STRLEN_P(data); + if (zend_try_assign_ex(resultzv, data, 0) == SUCCESS) { + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ + meta->fields[i].max_length = Z_STRLEN_P(data); + } } - zend_try_assign_ex(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } @@ -1024,7 +1025,7 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned /* If no result bind, do nothing. We consumed the data */ for (i = 0; i < field_count; i++) { zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; /* @@ -1035,11 +1036,11 @@ mysqlnd_fetch_stmt_row_cursor(MYSQLND_RES * result, void * param, const unsigned Z_TYPE_P(data), Z_REFCOUNTED(stmt->result_bind[i].zv)? Z_REFCOUNT(stmt->result_bind[i].zv) : 0); - if ((Z_TYPE_P(data) == IS_STRING) && - (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { - meta->fields[i].max_length = Z_STRLEN_P(data); + if (zend_try_assign_ex(resultzv, data, 0) == SUCCESS) { + if ((Z_TYPE_P(data) == IS_STRING) && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))) { + meta->fields[i].max_length = Z_STRLEN_P(data); + } } - zend_try_assign_ex(resultzv, data, 0); /* copied data, thus also the ownership. Thus null data */ ZVAL_NULL(data); } From ae3e7881d6c81a6bf68b96fc60ab13a9f1d1da18 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 12:55:05 +0200 Subject: [PATCH 297/369] Fix a last function to use zend_try_assign() --- ext/xmlrpc/xmlrpc-epi-php.c | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index ba7925a88d511..3d0c5e05e0aca 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -1375,15 +1375,19 @@ PHP_FUNCTION(xmlrpc_set_type) size_t type_len; XMLRPC_VALUE_TYPE vtype; - if (zend_parse_parameters(ZEND_NUM_ARGS(), "z/s", &arg, &type, &type_len) == FAILURE) { + if (zend_parse_parameters(ZEND_NUM_ARGS(), "zs", &arg, &type, &type_len) == FAILURE) { return; } vtype = xmlrpc_str_as_type(type); if (vtype != xmlrpc_none) { - if (set_zval_xmlrpc_type(arg, vtype) == SUCCESS) { + zval tmp; + ZVAL_COPY(&tmp, Z_REFVAL_P(arg)); + if (set_zval_xmlrpc_type(tmp, vtype) == SUCCESS) { + zend_try_assign(arg, &tmp); RETURN_TRUE; } + Z_TRY_DELREF(tmp); } else { zend_error(E_WARNING,"invalid type '%s' passed to xmlrpc_set_type()", type); } From 872084b21dd7f06b3e597f1eb24a3ef35b12e0b7 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Wed, 15 Aug 2018 13:23:12 +0200 Subject: [PATCH 298/369] Fix non-string key usage with typed properties --- Zend/zend_execute.c | 4 +- Zend/zend_vm_def.h | 16 +++- Zend/zend_vm_execute.h | 180 +++++++++++++++++++++++++++--------- ext/xmlrpc/xmlrpc-epi-php.c | 2 +- 4 files changed, 151 insertions(+), 51 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c879002225415..22da31d06d265 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2465,7 +2465,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (prop_op_type == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(prop_ptr), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(prop_ptr, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index daa7dd1a13048..4333f6409f7c9 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -844,7 +844,9 @@ ZEND_VM_C_LABEL(assign_op_object): if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -1238,7 +1240,9 @@ ZEND_VM_C_LABEL(pre_incdec_object): if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -1305,7 +1309,9 @@ ZEND_VM_C_LABEL(post_incdec_object): if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -2737,7 +2743,9 @@ ZEND_VM_HANDLER(199, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C if (OP2_TYPE == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 4061a2fc3977f..5290c53f16b9d 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -24625,7 +24625,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -25299,7 +25301,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -25365,7 +25369,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -26725,7 +26731,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -26821,7 +26829,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -27543,7 +27553,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -28219,7 +28231,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -28286,7 +28300,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -29592,7 +29608,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -29688,7 +29706,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -32219,7 +32239,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -32742,7 +32764,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -32808,7 +32832,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -34216,7 +34242,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -34312,7 +34340,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -35216,7 +35246,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -35391,7 +35423,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -35457,7 +35491,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -36388,7 +36424,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -36483,7 +36521,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -37239,7 +37279,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -37414,7 +37456,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -37481,7 +37525,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -38415,7 +38461,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -38510,7 +38558,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -39916,7 +39966,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -40091,7 +40143,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -40157,7 +40211,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -41088,7 +41144,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -41183,7 +41241,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -44295,7 +44355,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -44969,7 +45031,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -45035,7 +45099,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CONST == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -47003,7 +47069,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -47098,7 +47166,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O if (IS_CONST == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -49043,7 +49113,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -49719,7 +49791,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -49786,7 +49860,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -51319,7 +51395,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -51414,7 +51492,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -56029,7 +56109,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info || is_typed_ref)) { /* special case for typed properties */ @@ -56552,7 +56634,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_pre_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); } @@ -56618,7 +56702,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP if (IS_CV == IS_CONST) { prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), prop_name, NULL); + zend_tmp_string_release(tmp_str); } zend_post_incdec_property_zval(zptr, prop_info, inc OPLINE_CC EXECUTE_DATA_CC); @@ -58252,7 +58338,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { @@ -58347,7 +58435,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D if (IS_CV == IS_CONST) { prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); } else { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), Z_STR_P(property), NULL); + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { diff --git a/ext/xmlrpc/xmlrpc-epi-php.c b/ext/xmlrpc/xmlrpc-epi-php.c index 3d0c5e05e0aca..fd02b3162fe0c 100644 --- a/ext/xmlrpc/xmlrpc-epi-php.c +++ b/ext/xmlrpc/xmlrpc-epi-php.c @@ -1383,7 +1383,7 @@ PHP_FUNCTION(xmlrpc_set_type) if (vtype != xmlrpc_none) { zval tmp; ZVAL_COPY(&tmp, Z_REFVAL_P(arg)); - if (set_zval_xmlrpc_type(tmp, vtype) == SUCCESS) { + if (set_zval_xmlrpc_type(&tmp, vtype) == SUCCESS) { zend_try_assign(arg, &tmp); RETURN_TRUE; } From 0d579d0b1afd2c77351f51b1b57ee2be9133ad4c Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 22 Sep 2018 12:57:14 +0200 Subject: [PATCH 299/369] Add test for typed properties with integer keys --- .../typed_properties_086.phpt | 27 +++++++++++++++++++ 1 file changed, 27 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_086.phpt diff --git a/Zend/tests/type_declarations/typed_properties_086.phpt b/Zend/tests/type_declarations/typed_properties_086.phpt new file mode 100644 index 0000000000000..c58eb7898efe1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_086.phpt @@ -0,0 +1,27 @@ +--TEST-- +Test typed properties with integer keys +--FILE-- +$x = 2; +$t->$x--; + +var_dump($t); + +?> +--EXPECT-- +object(T)#1 (1) { + ["i"]=> + uninitialized(int) + ["1"]=> + int(1) +} From 5ba37d8866c46fa64856021ccd838e9a492c9f7c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 13:06:13 +0200 Subject: [PATCH 300/369] Remove unnecessary EXPECTFs --- Zend/tests/type_declarations/typed_properties_009.phpt | 2 +- Zend/tests/type_declarations/typed_properties_010.phpt | 2 +- Zend/tests/type_declarations/typed_properties_011.phpt | 2 +- Zend/tests/type_declarations/typed_properties_018.phpt | 7 +------ Zend/tests/type_declarations/typed_properties_023.phpt | 2 +- Zend/tests/type_declarations/typed_properties_027.phpt | 9 +-------- Zend/tests/type_declarations/typed_properties_032.phpt | 2 +- Zend/tests/type_declarations/typed_properties_034.phpt | 2 +- Zend/tests/type_declarations/typed_properties_036.phpt | 2 +- Zend/tests/type_declarations/typed_properties_041.phpt | 9 +-------- Zend/tests/type_declarations/typed_properties_075.phpt | 2 +- 11 files changed, 11 insertions(+), 30 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_009.phpt b/Zend/tests/type_declarations/typed_properties_009.phpt index 83ccfcf515e4c..24013b4118069 100644 --- a/Zend/tests/type_declarations/typed_properties_009.phpt +++ b/Zend/tests/type_declarations/typed_properties_009.phpt @@ -18,6 +18,6 @@ unset($foo->bar); var_dump($foo->bar); ?> ---EXPECTF-- +--EXPECT-- string(3) "bar" int(0) diff --git a/Zend/tests/type_declarations/typed_properties_010.phpt b/Zend/tests/type_declarations/typed_properties_010.phpt index 8b5cc049825d0..fd7d367fea3af 100644 --- a/Zend/tests/type_declarations/typed_properties_010.phpt +++ b/Zend/tests/type_declarations/typed_properties_010.phpt @@ -13,5 +13,5 @@ $cb = function(int &$bar) { $foo = new Foo(); $cb($foo->bar); ?> ---EXPECTF-- +--EXPECT-- int(1) diff --git a/Zend/tests/type_declarations/typed_properties_011.phpt b/Zend/tests/type_declarations/typed_properties_011.phpt index 074327ff26a87..706a332750545 100644 --- a/Zend/tests/type_declarations/typed_properties_011.phpt +++ b/Zend/tests/type_declarations/typed_properties_011.phpt @@ -11,7 +11,7 @@ $foo = new Foo(); $array = [&$foo->bar]; var_dump($array); ?> ---EXPECTF-- +--EXPECT-- array(1) { [0]=> &int(1) diff --git a/Zend/tests/type_declarations/typed_properties_018.phpt b/Zend/tests/type_declarations/typed_properties_018.phpt index 54fd38dc91648..097b39b232bf1 100644 --- a/Zend/tests/type_declarations/typed_properties_018.phpt +++ b/Zend/tests/type_declarations/typed_properties_018.phpt @@ -13,10 +13,5 @@ $prop = $reflector->getProperty("qux"); var_dump((string) $prop->getType()); ?> ---EXPECTF-- +--EXPECT-- string(3) "int" - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index 320a7bc8b590d..0251d335acdcd 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -32,7 +32,7 @@ Foo::$s = ref(); var_dump(Foo::$s); var_dump(ref()); ?> ---EXPECTF-- +--EXPECT-- string(1) "x" int(1) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_027.phpt b/Zend/tests/type_declarations/typed_properties_027.phpt index 03ce2f15893e5..861769932cb85 100644 --- a/Zend/tests/type_declarations/typed_properties_027.phpt +++ b/Zend/tests/type_declarations/typed_properties_027.phpt @@ -12,12 +12,5 @@ $foo->bar = 10; var_dump($foo->bar); ?> ---EXPECTF-- +--EXPECT-- float(10) - - - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_032.phpt b/Zend/tests/type_declarations/typed_properties_032.phpt index 017e18eceeff5..f3ceeb5cd919a 100644 --- a/Zend/tests/type_declarations/typed_properties_032.phpt +++ b/Zend/tests/type_declarations/typed_properties_032.phpt @@ -11,5 +11,5 @@ $foo = new class { }; var_dump($foo->method()); ---EXPECTF-- +--EXPECT-- int(15) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index d0ecd6d32285d..9fd14d6ec27b1 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -36,7 +36,7 @@ try { var_dump($foo); ?> ---EXPECTF-- +--EXPECT-- int(42) Typed property class@anonymous::$baz must be int, null used int(1) diff --git a/Zend/tests/type_declarations/typed_properties_036.phpt b/Zend/tests/type_declarations/typed_properties_036.phpt index e98c8817a6963..edb87a38e07a0 100644 --- a/Zend/tests/type_declarations/typed_properties_036.phpt +++ b/Zend/tests/type_declarations/typed_properties_036.phpt @@ -10,6 +10,6 @@ foreach ($foo as $key => $bar) { var_dump($key, $bar); } ?> ---EXPECTF-- +--EXPECT-- string(3) "bar" int(10) diff --git a/Zend/tests/type_declarations/typed_properties_041.phpt b/Zend/tests/type_declarations/typed_properties_041.phpt index 8e8c856ee3099..76dbfd8f5d9a7 100644 --- a/Zend/tests/type_declarations/typed_properties_041.phpt +++ b/Zend/tests/type_declarations/typed_properties_041.phpt @@ -12,12 +12,5 @@ $foo->bar = "10"; var_dump($foo->bar); ?> ---EXPECTF-- +--EXPECT-- int(10) - - - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_075.phpt b/Zend/tests/type_declarations/typed_properties_075.phpt index 568b72ea42902..b015234b60354 100644 --- a/Zend/tests/type_declarations/typed_properties_075.phpt +++ b/Zend/tests/type_declarations/typed_properties_075.phpt @@ -42,7 +42,7 @@ try { var_dump(Foo::$bar); ?> ---EXPECTF-- +--EXPECT-- string(48) "Typed property Foo::$bar must be int, float used" int(9223372036854775807) string(48) "Typed property Foo::$bar must be int, float used" From aa9a8dda7c44c0e5a79339c8b2956b411ebd08bb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 13:07:46 +0200 Subject: [PATCH 301/369] One more EXPECTF case --- Zend/tests/type_declarations/typed_properties_069.phpt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt index 946c316296d06..fa1f60ce84614 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -21,7 +21,7 @@ try { var_dump(nonNumericStringRef()); ?> ---EXPECTF-- +--EXPECT-- Typed property Foo::$i must be int, string used Typed static property Foo::$i must not be accessed before initialization string(1) "x" From 8e0380b7bb427b2df322ce4333a05fab9fd45663 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 17:18:02 +0200 Subject: [PATCH 302/369] Use seen_prop when reporting weak type error Doesn't really matter (just a different "equivalent" property used for the report), but that's what was intended here... --- Zend/zend_execute.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 31b7d8c50e99f..2e6f299f2f4e0 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2817,7 +2817,7 @@ static zend_always_inline zend_bool i_zend_verify_ref_assignable_zval(zend_refer } ZEND_REF_FOREACH_TYPE_SOURCES_END(); if (UNEXPECTED(needs_coercion && !zend_verify_weak_scalar_type_hint(seen_type, zv))) { - zend_throw_ref_type_error_zval(prop, zv); + zend_throw_ref_type_error_zval(seen_prop, zv); return 0; } From f1a25229c9980d26db021dfa16c9026af495c0e0 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 22 Sep 2018 17:51:39 +0200 Subject: [PATCH 303/369] Add test for settype() on typed reference Apparently I did not git add this file. --- .../settype_typed_property.phpt | 28 +++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 ext/standard/tests/general_functions/settype_typed_property.phpt diff --git a/ext/standard/tests/general_functions/settype_typed_property.phpt b/ext/standard/tests/general_functions/settype_typed_property.phpt new file mode 100644 index 0000000000000..a987a41670778 --- /dev/null +++ b/ext/standard/tests/general_functions/settype_typed_property.phpt @@ -0,0 +1,28 @@ +--TEST-- +Using settype() on a typed property +--FILE-- +x = 42; +settype($test->x, 'string'); +// Same as $test->x = (string) $test->x. +// Leaves value unchanged due to coercion +var_dump($test->x); + +try { + settype($test->x, 'array'); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test->x); + +?> +--EXPECT-- +int(42) +Cannot assign array to reference held by property Test->x of type int +int(42) From 8df6714194d337baced64ef9dbc8393594fd2eae Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:05:33 +0200 Subject: [PATCH 304/369] Minor test improvements Remove some duplicate tests, unnecessary catches, fix typos, etc. --- .../typed_properties_023.phpt | 1 - .../typed_properties_024.phpt | 4 +- .../typed_properties_025.phpt | 4 +- .../typed_properties_042.phpt | 4 -- .../typed_properties_043.phpt | 24 -------- .../typed_properties_047.phpt | 40 ++++--------- .../typed_properties_048.phpt | 60 ------------------- .../typed_properties_058.phpt | 8 +-- .../tests/type_declarations/types_in_ast.phpt | 2 +- 9 files changed, 18 insertions(+), 129 deletions(-) delete mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt delete mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index 0251d335acdcd..e48ae3c073e0b 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -20,7 +20,6 @@ var_dump(Foo::$i); Foo::$s = Foo::$i++; var_dump(Foo::$s, Foo::$i); $a = 3; -$b = "3"; Foo::$s = $a; var_dump(Foo::$s); Foo::$i = "4"; diff --git a/Zend/tests/type_declarations/typed_properties_024.phpt b/Zend/tests/type_declarations/typed_properties_024.phpt index d38fe249534b2..6f23b0bb26013 100644 --- a/Zend/tests/type_declarations/typed_properties_024.phpt +++ b/Zend/tests/type_declarations/typed_properties_024.phpt @@ -6,7 +6,9 @@ class Foo { private int $thing; } -class Bar extends Foo {} +class Bar extends Foo { + public string $thing; // No conflict +} echo "ok"; ?> diff --git a/Zend/tests/type_declarations/typed_properties_025.phpt b/Zend/tests/type_declarations/typed_properties_025.phpt index 70156de35b8f6..3dd244a7de867 100644 --- a/Zend/tests/type_declarations/typed_properties_025.phpt +++ b/Zend/tests/type_declarations/typed_properties_025.phpt @@ -3,8 +3,8 @@ Test typed properties type must preceed first declaration in group --FILE-- --EXPECTF-- diff --git a/Zend/tests/type_declarations/typed_properties_042.phpt b/Zend/tests/type_declarations/typed_properties_042.phpt index 0d1f45943aac5..ecb3df3c11dc0 100644 --- a/Zend/tests/type_declarations/typed_properties_042.phpt +++ b/Zend/tests/type_declarations/typed_properties_042.phpt @@ -1,9 +1,5 @@ --TEST-- Proper source duplication on assignment to typed property ---INI-- -opcache.enable=1 -opcache.enable_cli=1 -opcache.protect_memory=1 --FILE-- bar = "5"; - var_dump($foo->bar); -} -?> ---EXPECT-- -int(5) -int(5) -int(5) -int(5) -int(5) diff --git a/Zend/tests/type_declarations/typed_properties_047.phpt b/Zend/tests/type_declarations/typed_properties_047.phpt index 9267f53047ae5..7f1e573cd3a13 100644 --- a/Zend/tests/type_declarations/typed_properties_047.phpt +++ b/Zend/tests/type_declarations/typed_properties_047.phpt @@ -5,38 +5,18 @@ Nullable typed property class Foo { public ?int $foo = null; } + $x = new Foo(); var_dump($x); -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} +var_dump($x->foo); + +$x->foo = 5; +var_dump($x->foo); + +$x->foo = null; +var_dump($x->foo); + +unset($x->foo); try { var_dump($x->foo); } catch (Throwable $e) { diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt deleted file mode 100644 index 9267f53047ae5..0000000000000 --- a/Zend/tests/type_declarations/typed_properties_048.phpt +++ /dev/null @@ -1,60 +0,0 @@ ---TEST-- -Nullable typed property ---FILE-- -foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = 5; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = null; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - unset($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - var_dump($x->foo); -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -try { - $x->foo = "ops"; -} catch (Throwable $e) { - echo $e->getMessage()."\n"; -} -?> ---EXPECTF-- -object(Foo)#1 (1) { - ["foo"]=> - NULL -} -NULL -int(5) -NULL -Typed property Foo::$foo must not be accessed before initialization -Typed property Foo::$foo must be int or null, string used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 007fbd3d0b5d1..09a21435c4f0a 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -14,12 +14,8 @@ class B { public string $foo = FOO; } -try { - $o = new A(); - var_dump($o->foo); -} catch (Throwable $e) { - echo $e->getMessage() . "\n"; -} +$o = new A(); +var_dump($o->foo); for ($i = 0; $i < 2; $i++) { try { diff --git a/Zend/tests/type_declarations/types_in_ast.phpt b/Zend/tests/type_declarations/types_in_ast.phpt index 61268fdf91f33..54619c23b7128 100644 --- a/Zend/tests/type_declarations/types_in_ast.phpt +++ b/Zend/tests/type_declarations/types_in_ast.phpt @@ -1,5 +1,5 @@ --TEST-- -AST pretty-peinter +AST pretty-printer --INI-- zend.assertions=1 assert.exception=0 From 96ea906847238fcbf02639726e6bb4823fc0df9a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:07:15 +0200 Subject: [PATCH 305/369] Drop redundant "Typed" prefix from callable/void error --- Zend/tests/type_declarations/typed_properties_017.phpt | 2 +- Zend/tests/type_declarations/typed_properties_053.phpt | 2 +- Zend/tests/type_declarations/typed_properties_054.phpt | 2 +- Zend/zend_compile.c | 2 +- 4 files changed, 4 insertions(+), 4 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_017.phpt b/Zend/tests/type_declarations/typed_properties_017.phpt index 16de52ea12e83..3e501d3688bd2 100644 --- a/Zend/tests/type_declarations/typed_properties_017.phpt +++ b/Zend/tests/type_declarations/typed_properties_017.phpt @@ -9,4 +9,4 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Typed property Foo::$int cannot have type void in %s on line 3 +Fatal error: Property Foo::$int cannot have type void in %s on line 3 diff --git a/Zend/tests/type_declarations/typed_properties_053.phpt b/Zend/tests/type_declarations/typed_properties_053.phpt index e9635cd448e62..1da42bcbd9705 100644 --- a/Zend/tests/type_declarations/typed_properties_053.phpt +++ b/Zend/tests/type_declarations/typed_properties_053.phpt @@ -9,4 +9,4 @@ $obj = new A; var_dump($obj); ?> --EXPECTF-- -Fatal error: Typed property A::$a cannot have type callable in %s on line %d +Fatal error: Property A::$a cannot have type callable in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_054.phpt b/Zend/tests/type_declarations/typed_properties_054.phpt index ffdde768de177..38de9815edff5 100644 --- a/Zend/tests/type_declarations/typed_properties_054.phpt +++ b/Zend/tests/type_declarations/typed_properties_054.phpt @@ -9,4 +9,4 @@ $obj = new A; var_dump($obj); ?> --EXPECTF-- -Fatal error: Typed property A::$a cannot have type callable in %s on line %d +Fatal error: Property A::$a cannot have type callable in %s on line %d diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 88fbcf062a2c6..053bdbc409650 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6069,7 +6069,7 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { zend_error_noreturn(E_COMPILE_ERROR, - "Typed property %s::$%s cannot have type %s", + "Property %s::$%s cannot have type %s", ZSTR_VAL(ce->name), ZSTR_VAL(name), zend_get_type_by_const(optional_type)); From 494585f0ed8acd7c59ceaae7b79364542f8c0377 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 15:59:40 +0200 Subject: [PATCH 306/369] Restore old zend_binary_assign_op_obj_dim code Remove the special treatment of references. --- .../typed_properties_065.phpt | 20 ++++++++-------- Zend/zend_execute.c | 24 ++++--------------- 2 files changed, 14 insertions(+), 30 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index 78276a9d9a10d..7e3c61bc638ae 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -8,7 +8,7 @@ $a = new class implements ArrayAccess { function offsetExists($o) { return 1; } function &offsetGet($o) { return $this->foo; } - function offsetSet($o, $v) { print "offsetSet() must not be called"; } + function offsetSet($o, $v) { print "offsetSet($v)\n"; } function offsetUnset($o) { print "offsetUnset() ?!?"; } }; @@ -18,9 +18,7 @@ var_dump($a->foo); $a[0] .= "1"; var_dump($a->foo); -try { - $a[0] .= "e50"; -} catch (Error $e) { echo $e->getMessage(), "\n"; } +$a[0] .= "e50"; var_dump($a->foo); $a[0]--; @@ -43,12 +41,14 @@ echo gettype($a->foo),"\n"; ?> --EXPECT-- -int(2) -int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int -int(21) -int(20) -int(19) +offsetSet(2) +int(1) +offsetSet(11) +int(1) +offsetSet(1e50) +int(1) +int(0) +int(-1) Cannot assign float to reference held by property class@anonymous->foo of type int integer Cannot assign float to reference held by property class@anonymous->foo of type int diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2e6f299f2f4e0..4b5510eb11a8a 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1248,31 +1248,15 @@ static zend_never_inline void zend_binary_assign_op_obj_dim(zval *object, zval * } ZVAL_COPY_VALUE(z, value); } - if (UNEXPECTED(Z_ISREF_P(z))) { - zend_reference *ref = Z_REF_P(z); - zval *refval = Z_REFVAL_P(z); - binary_op(&res, refval, value); - if (ZEND_REF_HAS_TYPE_SOURCES(ref) && !zend_verify_ref_assignable_zval(ref, &res, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data)))) { - zval_ptr_dtor(&res); - if (z == &rv) { - zval_ptr_dtor(&rv); - } - return; - } - zval_ptr_dtor(refval); - ZVAL_COPY(refval, &res); - } else { - binary_op(&res, z, value); - Z_OBJ_HT_P(object)->write_dimension(object, property, &res); - } + binary_op(&res, Z_ISREF_P(z) ? Z_REFVAL_P(z) : z, value); + Z_OBJ_HT_P(object)->write_dimension(object, property, &res); if (z == &rv) { zval_ptr_dtor(&rv); } if (retval) { - ZVAL_COPY_VALUE(retval, &res); - } else { - zval_ptr_dtor(&res); + ZVAL_COPY(retval, &res); } + zval_ptr_dtor(&res); } else { zend_use_object_as_array(); if (retval) { From e8cf0050b27abbcfaab541c4119baaec1963cd9f Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 23 Sep 2018 17:42:01 +0200 Subject: [PATCH 307/369] Revert some unnecessary changes --- Zend/zend_API.c | 11 ++++++++--- 1 file changed, 8 insertions(+), 3 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index df525d8807e6e..2cc3bd709db83 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -795,6 +795,12 @@ static const char *zend_parse_arg_impl(int arg_num, zval *arg, va_list *va, cons zend_parse_arg_zval_deref(real_arg, p, check_null); } break; + + case 'Z': + /* 'Z' iz not supported anymore and should be replaced with 'z' */ + ZEND_ASSERT(c != 'Z'); + default: + return "unknown"; } *spec = spec_walk; @@ -878,12 +884,12 @@ static int zend_parse_va_args(int num_args, const char *type_spec, va_list *va, case 's': case 'b': case 'r': case 'a': case 'o': case 'O': + case 'z': case 'Z': case 'C': case 'h': case 'f': case 'A': case 'H': case 'p': case 'S': case 'P': - case 'L': case 't': - case 'z': + case 'L': max_num_args++; break; @@ -1144,7 +1150,6 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (class_type->parent) { if (UNEXPECTED(zend_update_class_constants(class_type->parent) != SUCCESS)) { - class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; return FAILURE; } } From c44eba9c6ad492dd59bda5c8ca2850cced16fadc Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:05:11 +0200 Subject: [PATCH 308/369] Change zend_declare_typed_property to accept zend_type Also cleanup zend_compile_assign_ref --- Zend/zend_API.c | 14 +++------ Zend/zend_API.h | 2 +- Zend/zend_compile.c | 65 ++++++++++++++++++----------------------- Zend/zend_compile.h | 4 +-- Zend/zend_inheritance.c | 9 +----- 5 files changed, 37 insertions(+), 57 deletions(-) diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 2cc3bd709db83..8c896b8905ca6 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -3692,11 +3692,11 @@ static inline zend_string *zval_make_interned_string(zval *zv) /* {{{ */ return Z_STR_P(zv); } -ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar optional_type, zend_string *optional_type_name, zend_bool allow_null) /* {{{ */ +ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type) /* {{{ */ { zend_property_info *property_info, *property_info_ptr; - if (optional_type && (access_type & ZEND_ACC_STATIC) == 0) { + if (ZEND_TYPE_IS_SET(type) && (access_type & ZEND_ACC_STATIC) == 0) { ce->ce_flags |= ZEND_ACC_HAS_TYPE_HINTS; } @@ -3771,13 +3771,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->flags = access_type; property_info->doc_comment = doc_comment; property_info->ce = ce; - if (optional_type_name) { - property_info->type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(optional_type_name), allow_null); - } else if (optional_type) { - property_info->type = ZEND_TYPE_ENCODE(optional_type, allow_null); - } else { - property_info->type = 0; - } + property_info->type = type; zend_hash_update_ptr(&ce->properties_info, name, property_info); @@ -3787,7 +3781,7 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment) /* {{{ */ { - return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0, NULL, 0); + return zend_declare_typed_property(ce, name, property, access_type, doc_comment, 0); } /* }}} */ diff --git a/Zend/zend_API.h b/Zend/zend_API.h index cee1359c72606..227470dad9ab0 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -313,7 +313,7 @@ ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_nam ZEND_API const char *zend_get_module_version(const char *module_name); ZEND_API int zend_get_module_started(const char *module_name); -ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_uchar type, zend_string *type_name, zend_bool allow_null); +ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment, zend_type type); ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment); ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 053bdbc409650..3a0b36b985c8b 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2604,7 +2604,7 @@ static zend_op *zend_compile_prop(znode *result, zend_ast *ast, uint32_t type, i { uint32_t offset = zend_delayed_compile_begin(); zend_op *opline = zend_delayed_compile_prop(result, ast, type); - if (by_ref && (type == BP_VAR_W || type == BP_VAR_FUNC_ARG)) { /* shared with cache_slot */ + if (by_ref) { /* shared with cache_slot */ opline->extended_value |= ZEND_FETCH_REF; } return zend_delayed_compile_end(offset); @@ -2967,7 +2967,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ast *target_ast = ast->child[0]; zend_ast *source_ast = ast->child[1]; - znode target_node, source_node; + znode source_node; zend_op *opline; uint32_t offset; @@ -2977,7 +2977,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(target_ast); offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1); + zend_delayed_compile_var(result, target_ast, BP_VAR_W, 1); zend_compile_var(&source_node, source_ast, BP_VAR_W, 1); if ((target_ast->kind != ZEND_AST_VAR @@ -2992,23 +2992,20 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_emit_op(&source_node, ZEND_MAKE_REF, &source_node, NULL); } - zend_delayed_compile_end(offset); + opline = zend_delayed_compile_end(offset); if (source_node.op_type != IS_VAR && zend_is_call(source_ast)) { zend_error_noreturn(E_COMPILE_ERROR, "Cannot use result of built-in function in write context"); } - opline = &CG(active_op_array)->opcodes[CG(active_op_array)->last - 1]; - if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_OBJ_W) { + if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; - zend_make_var_result(result, opline); zend_emit_op_data(&source_node); - } else if (target_node.op_type == IS_VAR && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { + } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; - zend_make_var_result(result, opline); zend_emit_op_data(&source_node); } else { - opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); + opline = zend_emit_op(result, ZEND_ASSIGN_REF, result, &source_node); opline->extended_value = 0; } @@ -6027,9 +6024,8 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast)); zend_string *doc_comment = NULL; zval value_zv; - zend_uchar optional_type = 0; zend_bool allow_null = 0; - zend_string *optional_type_name = NULL; + zend_type type = 0; if (type_ast) { if (type_ast->attr & ZEND_TYPE_NULLABLE) { @@ -6038,19 +6034,19 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ } if (type_ast->kind == ZEND_AST_TYPE) { - optional_type = type_ast->attr; + type = ZEND_TYPE_ENCODE(type_ast->attr, allow_null); } else { zend_string *class_name = zend_ast_get_str(type_ast); - zend_uchar type = zend_lookup_builtin_type_by_name(class_name); + zend_uchar typeinfo = zend_lookup_builtin_type_by_name(class_name); - if (type != 0) { + if (typeinfo != 0) { if (type_ast->attr != ZEND_NAME_NOT_FQ) { zend_error_noreturn(E_COMPILE_ERROR, "Scalar type declaration '%s' must be unqualified", ZSTR_VAL(zend_string_tolower(class_name))); } - optional_type = type; + type = ZEND_TYPE_ENCODE(typeinfo, allow_null); } else { uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); @@ -6062,17 +6058,16 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ zend_string_addref(class_name); } - optional_type = IS_OBJECT; - optional_type_name = class_name; + type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(class_name), allow_null); } } - if (optional_type == IS_VOID || optional_type == IS_CALLABLE) { + if (ZEND_TYPE_CODE(type) == IS_VOID || ZEND_TYPE_CODE(type) == IS_CALLABLE) { zend_error_noreturn(E_COMPILE_ERROR, "Property %s::$%s cannot have type %s", ZSTR_VAL(ce->name), ZSTR_VAL(name), - zend_get_type_by_const(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } } @@ -6095,46 +6090,44 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ if (value_ast) { zend_const_expr_to_zval(&value_zv, value_ast); - if (optional_type && !Z_CONSTANT(value_zv)) { + if (ZEND_TYPE_IS_SET(type) && !Z_CONSTANT(value_zv)) { if (Z_TYPE(value_zv) == IS_NULL) { - if (!allow_null) { - const char *name = optional_type_name - ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + if (!ZEND_TYPE_ALLOW_NULL(type)) { + const char *name = ZEND_TYPE_IS_CLASS(type) + ? ZSTR_VAL(ZEND_TYPE_NAME(type)) : zend_get_type_by_const(ZEND_TYPE_CODE(type)); zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type %s may not be null. " "Use the nullable type ?%s to allow null default value", name, name); } - } else if (optional_type_name || optional_type == IS_OBJECT) { - const char *name = optional_type_name - ? ZSTR_VAL(optional_type_name) : zend_get_type_by_const(optional_type); + } else if (ZEND_TYPE_IS_CLASS(type)) { zend_error_noreturn(E_COMPILE_ERROR, - "Property of type %s may not have default value", name); - } else if (optional_type == IS_ARRAY || optional_type == IS_ITERABLE) { + "Property of type %s may not have default value", ZSTR_VAL(ZEND_TYPE_NAME(type))); + } else if (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE) { if (Z_TYPE(value_zv) != IS_ARRAY) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type %s can only be an array", - zend_get_type_by_const(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } - } else if (optional_type == IS_DOUBLE) { + } else if (ZEND_TYPE_CODE(type) == IS_DOUBLE) { if (Z_TYPE(value_zv) != IS_DOUBLE && Z_TYPE(value_zv) != IS_LONG) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type float can only be float or int"); } - } else if (!ZEND_SAME_FAKE_TYPE(optional_type, Z_TYPE(value_zv))) { + } else if (!ZEND_SAME_FAKE_TYPE(ZEND_TYPE_CODE(type), Z_TYPE(value_zv))) { zend_error_noreturn(E_COMPILE_ERROR, "Default value for property of type %s can only be %s", - zend_get_type_by_const(optional_type), - zend_get_type_by_const(optional_type)); + zend_get_type_by_const(ZEND_TYPE_CODE(type)), + zend_get_type_by_const(ZEND_TYPE_CODE(type))); } } - } else if (!optional_type) { + } else if (!ZEND_TYPE_IS_SET(type)) { ZVAL_NULL(&value_zv); } else { ZVAL_UNDEF(&value_zv); } - zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, optional_type, optional_type_name, allow_null); + zend_declare_typed_property(ce, name, &value_zv, flags, doc_comment, type); } } /* }}} */ diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0d65397cd9244..f21257a6ece69 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,7 +220,7 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* Class Flags (unused: 16...) | | | */ +/* Class Flags (unused: 14...) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -252,7 +252,7 @@ typedef struct _zend_oparray_context { /* | | | */ /* Class has magic methods __get/__set/__unset/ | | | */ /* __isset that use guards | | | */ -#define ZEND_ACC_USE_GUARDS (1 << 15) /* X | | | */ +#define ZEND_ACC_USE_GUARDS (1 << 13) /* X | | | */ /* | | | */ /* Function Flags (unused: 25...30) | | | */ /* ============== | | | */ diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index 410239659344b..aff109ba15a19 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -1783,14 +1783,7 @@ static void zend_do_traits_property_binding(zend_class_entry *ce, zend_class_ent Z_TRY_ADDREF_P(prop_value); doc_comment = property_info->doc_comment ? zend_string_copy(property_info->doc_comment) : NULL; - if (property_info->type) { - zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, - ZEND_TYPE_IS_CODE(property_info->type) ? ZEND_TYPE_CODE(property_info->type) : 0, - ZEND_TYPE_IS_CLASS(property_info->type) ? ZEND_TYPE_IS_CE(property_info->type) ? ZEND_TYPE_CE(property_info->type)->name : ZEND_TYPE_NAME(property_info->type) : NULL, - ZEND_TYPE_ALLOW_NULL(property_info->type)); - } else { - zend_declare_property_ex(ce, prop_name, prop_value, flags, doc_comment); - } + zend_declare_typed_property(ce, prop_name, prop_value, flags, doc_comment, property_info->type); zend_string_release_ex(prop_name, 0); } ZEND_HASH_FOREACH_END(); } From 7424833a44f349f8c01d2c54588a45079228e9ce Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:20:11 +0200 Subject: [PATCH 309/369] Fix parent private property type affecting child class --- .../typed_properties_048.phpt | 17 +++++++++++ Zend/zend_inheritance.c | 28 +++++++------------ 2 files changed, 27 insertions(+), 18 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_048.phpt diff --git a/Zend/tests/type_declarations/typed_properties_048.phpt b/Zend/tests/type_declarations/typed_properties_048.phpt new file mode 100644 index 0000000000000..8a06c55f23605 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_048.phpt @@ -0,0 +1,17 @@ +--TEST-- +Parent private property types must be ignored +--FILE-- +prop; })->call(new B)); + +?> +--EXPECT-- +int(2) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index aff109ba15a19..dd0e79bb38d92 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -743,34 +743,26 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke ZVAL_UNDEF(&ce->default_properties_table[child_num]); child_info->offset = parent_info->offset; } - } - if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type) && !(parent_info->flags & ZEND_ACC_PRIVATE))) { - if (ZEND_TYPE_IS_CLASS(parent_info->type)) { - if (!property_types_compatible(parent_info, child_info)) { + if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) { + if (ZEND_TYPE_IS_CLASS(parent_info->type) ? !property_types_compatible(parent_info, child_info) : parent_info->type != child_info->type) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), ZSTR_VAL(key), ZEND_TYPE_ALLOW_NULL(parent_info->type) ? "?" : "", - ZSTR_VAL(ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce)), + ZEND_TYPE_IS_CLASS(parent_info->type) + ? ZSTR_VAL(ZEND_TYPE_IS_CE(parent_info->type) ? ZEND_TYPE_CE(parent_info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(parent_info->type), parent_info->ce)) + : zend_get_type_by_const(ZEND_TYPE_CODE(parent_info->type)), ZSTR_VAL(ce->parent->name)); } - } else if (parent_info->type != child_info->type) { + } else if (UNEXPECTED(ZEND_TYPE_IS_SET(child_info->type) && !ZEND_TYPE_IS_SET(parent_info->type))) { zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must be %s%s (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - ZEND_TYPE_ALLOW_NULL(parent_info->type) ? "?" : "", - zend_get_type_by_const(ZEND_TYPE_CODE(parent_info->type)), - ZSTR_VAL(ce->parent->name)); + "Type of %s::$%s must not be defined (as in class %s)", + ZSTR_VAL(ce->name), + ZSTR_VAL(key), + ZSTR_VAL(ce->parent->name)); } - } else if (UNEXPECTED(ZEND_TYPE_IS_SET(child_info->type) && !ZEND_TYPE_IS_SET(parent_info->type))) { - zend_error_noreturn(E_COMPILE_ERROR, - "Type of %s::$%s must not be defined (as in class %s)", - ZSTR_VAL(ce->name), - ZSTR_VAL(key), - ZSTR_VAL(ce->parent->name)); } } else { if (UNEXPECTED(ce->type & ZEND_INTERNAL_CLASS)) { From aa769fb021b00f9d0fc76c00598b5a59ff785da0 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 06:31:11 +0200 Subject: [PATCH 310/369] Remove redundant ISUNDEF checks in mysqlnd --- ext/mysqlnd/mysqlnd_ps.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/mysqlnd/mysqlnd_ps.c b/ext/mysqlnd/mysqlnd_ps.c index 46df8d2dfc371..764dfcf523fd7 100644 --- a/ext/mysqlnd/mysqlnd_ps.c +++ b/ext/mysqlnd/mysqlnd_ps.c @@ -763,7 +763,7 @@ mysqlnd_stmt_fetch_row_buffered(MYSQLND_RES * result, void * param, const unsign for (i = 0; i < result->field_count; i++) { /* copy the type */ zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { DBG_INF_FMT("i=%u type=%u", i, Z_TYPE(current_row[i])); Z_TRY_ADDREF(current_row[i]); zend_try_assign_ex(resultzv, ¤t_row[i], 0); @@ -847,7 +847,7 @@ mysqlnd_stmt_fetch_row_unbuffered(MYSQLND_RES * result, void * param, const unsi for (i = 0; i < field_count; i++) { zval *resultzv = &stmt->result_bind[i].zv; - if (stmt->result_bind[i].bound == TRUE && !Z_ISUNDEF_P(resultzv)) { + if (stmt->result_bind[i].bound == TRUE) { zval *data = &result->unbuf->last_row_data[i]; if (Z_TYPE_P(data) == IS_STRING && (meta->fields[i].max_length < (zend_ulong) Z_STRLEN_P(data))){ From eff6b111df5b6f5a7240e67c1ae1332881e73499 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 24 Sep 2018 18:14:54 +0200 Subject: [PATCH 311/369] Handle NULL result in assign_ref --- Zend/zend_compile.c | 12 +++++++++--- 1 file changed, 9 insertions(+), 3 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 3a0b36b985c8b..9471a5aae83a9 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2967,7 +2967,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ast *target_ast = ast->child[0]; zend_ast *source_ast = ast->child[1]; - znode source_node; + znode target_node, source_node; zend_op *opline; uint32_t offset; @@ -2977,7 +2977,7 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ zend_ensure_writable_variable(target_ast); offset = zend_delayed_compile_begin(); - zend_delayed_compile_var(result, target_ast, BP_VAR_W, 1); + zend_delayed_compile_var(&target_node, target_ast, BP_VAR_W, 1); zend_compile_var(&source_node, source_ast, BP_VAR_W, 1); if ((target_ast->kind != ZEND_AST_VAR @@ -3001,11 +3001,17 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; zend_emit_op_data(&source_node); + if (result != NULL) { + *result = target_node; + } } else { - opline = zend_emit_op(result, ZEND_ASSIGN_REF, result, &source_node); + opline = zend_emit_op(result, ZEND_ASSIGN_REF, &target_node, &source_node); opline->extended_value = 0; } From 1147467e498dde03d79852336ba9f4f16c9b9645 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 24 Sep 2018 18:36:25 +0200 Subject: [PATCH 312/369] Fix DateInterval write_property handler --- ext/date/php_date.c | 2 -- .../tests/DateInterval_write_property_return.phpt | 14 ++++++++++++++ 2 files changed, 14 insertions(+), 2 deletions(-) create mode 100644 ext/date/tests/DateInterval_write_property_return.phpt diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 98a1ed8ddb595..6a452e9157081 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -4232,7 +4232,6 @@ zval *date_interval_write_property(zval *object, zval *member, zval *value, void #define SET_VALUE_FROM_STRUCT(n,m) \ if (strcmp(Z_STRVAL_P(member), m) == 0) { \ obj->diff->n = zval_get_long(value); \ - ZVAL_LONG(value, obj->diff->n); \ break; \ } @@ -4245,7 +4244,6 @@ zval *date_interval_write_property(zval *object, zval *member, zval *value, void SET_VALUE_FROM_STRUCT(s, "s"); if (strcmp(Z_STRVAL_P(member), "f") == 0) { obj->diff->us = zval_get_double(value) * 1000000; - ZVAL_LONG(value, obj->diff->us); break; } SET_VALUE_FROM_STRUCT(invert, "invert"); diff --git a/ext/date/tests/DateInterval_write_property_return.phpt b/ext/date/tests/DateInterval_write_property_return.phpt new file mode 100644 index 0000000000000..9c2c5c9137bad --- /dev/null +++ b/ext/date/tests/DateInterval_write_property_return.phpt @@ -0,0 +1,14 @@ +--TEST-- +Test that return value handling for DateInterval property writes do not corrupt RHS +--FILE-- +f = $f); +var_dump($f); + +?> +--EXPECT-- +float(0.5) +float(0.5) From 236a72f1e66f48910326ea466a3547a097d4b580 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 21:47:22 +0200 Subject: [PATCH 313/369] Cleanup tests and improve a few error messages --- .../typed_properties_003.phpt | 2 +- .../typed_properties_033.phpt | 2 +- .../typed_properties_034.phpt | 2 +- .../typed_properties_037.phpt | 2 +- .../typed_properties_038.phpt | 8 +- .../typed_properties_044.phpt | 4 +- .../typed_properties_045.phpt | 4 +- .../typed_properties_055.phpt | 4 +- .../typed_properties_062.phpt | 8 +- .../typed_properties_063.phpt | 8 +- .../typed_properties_064.phpt | 8 +- .../typed_properties_065.phpt | 4 +- .../typed_properties_068.phpt | 41 ++---- .../typed_properties_078.phpt | 4 +- .../typed_properties_081.phpt | 2 +- .../typed_properties_083.phpt | 8 +- Zend/zend_execute.c | 31 +++-- Zend/zend_vm_def.h | 4 +- Zend/zend_vm_execute.h | 128 +++++++++++++----- 19 files changed, 165 insertions(+), 109 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_003.phpt b/Zend/tests/type_declarations/typed_properties_003.phpt index c96a464680fa4..3d7293fb41da6 100644 --- a/Zend/tests/type_declarations/typed_properties_003.phpt +++ b/Zend/tests/type_declarations/typed_properties_003.phpt @@ -9,7 +9,7 @@ $thing = new class() { $var = &$thing->int; ?> --EXPECTF-- -Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property by reference in %s:%d +Fatal error: Uncaught Error: Cannot access uninitialized non-nullable property class@anonymous::$int by reference in %s:%d Stack trace: #0 {main} thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index a58c37fd22cb6..153e0515be198 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -25,7 +25,7 @@ try { var_dump($foo); ?> --EXPECTF-- -Cannot assign float to reference held by property class@anonymous->qux of type int +Cannot assign float to reference held by property class@anonymous::$qux of type int object(class@anonymous)#1 (4) { ["foo"]=> int(2) diff --git a/Zend/tests/type_declarations/typed_properties_034.phpt b/Zend/tests/type_declarations/typed_properties_034.phpt index 9fd14d6ec27b1..c3885af39f8d4 100644 --- a/Zend/tests/type_declarations/typed_properties_034.phpt +++ b/Zend/tests/type_declarations/typed_properties_034.phpt @@ -42,7 +42,7 @@ Typed property class@anonymous::$baz must be int, null used int(1) int(10) int(10) -Cannot assign null to reference held by property class@anonymous->baz of type int +Cannot assign null to reference held by property class@anonymous::$baz of type int object(class@anonymous)#1 (2) { ["bar"]=> &int(10) diff --git a/Zend/tests/type_declarations/typed_properties_037.phpt b/Zend/tests/type_declarations/typed_properties_037.phpt index ed0869af30aa4..1d4862ef0a72f 100644 --- a/Zend/tests/type_declarations/typed_properties_037.phpt +++ b/Zend/tests/type_declarations/typed_properties_037.phpt @@ -8,7 +8,7 @@ $foo = new class { var_dump($foo); --EXPECTF-- -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(10) ["qux"]=> diff --git a/Zend/tests/type_declarations/typed_properties_038.phpt b/Zend/tests/type_declarations/typed_properties_038.phpt index 49e0fa93af7ea..af8b39cb66422 100644 --- a/Zend/tests/type_declarations/typed_properties_038.phpt +++ b/Zend/tests/type_declarations/typed_properties_038.phpt @@ -40,22 +40,22 @@ try { var_dump($foo); --EXPECTF-- string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } string(60) "Typed property class@anonymous::$bar must be int, float used" -object(class@anonymous)#%d (%d) { +object(class@anonymous)#%d (1) { ["bar"]=> int(%d) } diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index f2632ef09e489..39e324edb64c9 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -43,7 +43,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference held by property class@anonymous->bar of type ?int -Cannot assign float to reference held by property class@anonymous->bar of type ?int +Cannot assign float to reference held by property class@anonymous::$bar of type ?int +Cannot assign float to reference held by property class@anonymous::$bar of type ?int int(-9223372036854775808) int(-9223372036854775808) diff --git a/Zend/tests/type_declarations/typed_properties_045.phpt b/Zend/tests/type_declarations/typed_properties_045.phpt index 96733563e6371..3343ec8bb9249 100644 --- a/Zend/tests/type_declarations/typed_properties_045.phpt +++ b/Zend/tests/type_declarations/typed_properties_045.phpt @@ -24,7 +24,7 @@ foreach ($foo = new Foo as $k => &$val) { --EXPECT-- int(0) int(20) -Cannot assign array to reference held by property Foo->bar of type int +Cannot assign array to reference held by property Foo::$bar of type int float(0.5) float(20) -Cannot assign array to reference held by property Foo->baz of type float +Cannot assign array to reference held by property Foo::$baz of type float diff --git a/Zend/tests/type_declarations/typed_properties_055.phpt b/Zend/tests/type_declarations/typed_properties_055.phpt index a648d97b63ae6..31d687254c46d 100644 --- a/Zend/tests/type_declarations/typed_properties_055.phpt +++ b/Zend/tests/type_declarations/typed_properties_055.phpt @@ -1,5 +1,5 @@ --TEST-- -Default values of callable properties +Test assign to typed property taken by reference --FILE-- a->bar); int(1) int(2) -Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A->bar of type int in %s:%d +Fatal error: Uncaught TypeError: Cannot assign string to reference held by property A::$bar of type int in %s:%d Stack trace: #0 %s(%d): {closure}(2) #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index f91e9ab758d7a..adfc462f8dace 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -52,14 +52,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index 76567d2d7892a..f5b4a16584fb3 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index ae1dbc6deb33b..0e06fee88174f 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -51,14 +51,14 @@ var_dump($a->foo); --EXPECT-- int(2) int(21) -Cannot assign string to reference held by property class@anonymous->foo of type int +Cannot assign string to reference held by property class@anonymous::$foo of type int int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign array to reference held by property class@anonymous->foo of type int +Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) int(1) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index 7e3c61bc638ae..ea8ba8fd67522 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -49,7 +49,7 @@ offsetSet(1e50) int(1) int(0) int(-1) -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer -Cannot assign float to reference held by property class@anonymous->foo of type int +Cannot assign float to reference held by property class@anonymous::$foo of type int integer diff --git a/Zend/tests/type_declarations/typed_properties_068.phpt b/Zend/tests/type_declarations/typed_properties_068.phpt index 508e079a94fbd..7ed58d2a00893 100644 --- a/Zend/tests/type_declarations/typed_properties_068.phpt +++ b/Zend/tests/type_declarations/typed_properties_068.phpt @@ -2,25 +2,10 @@ Test typed static property by ref --FILE-- getMessage()."\n"; } var_dump($i, Foo::$i); -Foo::$s = &intRef(); -var_dump(Foo::$s, intRef()); +Foo::$s = &ref(5); +var_dump(Foo::$s, ref()); -Foo::$i = &stringRef(); -var_dump(Foo::$i, stringRef()); +Foo::$i = &ref("0"); +var_dump(Foo::$i, ref()); try { - Foo::$i = &nonNumericStringRef(); + Foo::$i = &ref("x"); } catch (TypeError $e) { print $e->getMessage()."\n"; } -var_dump(Foo::$i, nonNumericStringRef()); +var_dump(Foo::$i, ref()); try { Foo::$i = &Foo::$s; @@ -88,9 +73,9 @@ Typed property Foo::$i must be int, null used int(4) int(4) string(1) "5" -int(5) +string(1) "5" +int(0) int(0) -string(1) "0" Typed property Foo::$i must be int, string used int(0) string(1) "x" diff --git a/Zend/tests/type_declarations/typed_properties_078.phpt b/Zend/tests/type_declarations/typed_properties_078.phpt index 52c1ffccbe55b..6645970dd4121 100644 --- a/Zend/tests/type_declarations/typed_properties_078.phpt +++ b/Zend/tests/type_declarations/typed_properties_078.phpt @@ -52,8 +52,8 @@ array(1) { [0]=> int(1) } -string(91) "Cannot assign ArrayIterator to reference held by property class@anonymous->a of type ?array" +string(92) "Cannot assign ArrayIterator to reference held by property class@anonymous::$a of type ?array" bool(false) -string(89) "Cannot assign array to reference held by property class@anonymous->t of type ?Traversable" +string(90) "Cannot assign array to reference held by property class@anonymous::$t of type ?Traversable" bool(false) bool(true) diff --git a/Zend/tests/type_declarations/typed_properties_081.phpt b/Zend/tests/type_declarations/typed_properties_081.phpt index 23b1abf825d89..1198244e831e1 100644 --- a/Zend/tests/type_declarations/typed_properties_081.phpt +++ b/Zend/tests/type_declarations/typed_properties_081.phpt @@ -18,6 +18,6 @@ var_dump($test2->x); ?> --EXPECT-- -Cannot assign string to reference held by property Test->x of type int +Cannot assign string to reference held by property Test::$x of type int int(42) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index bcf304404486e..b4f70287103c6 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,19 +54,19 @@ array(1) { [0]=> int(1) } -string(71) "Cannot write an array to a null property which does not allow for array" +string(79) "Cannot write an array to a null property Foo::$p which does not allow for array" string(65) "Typed property Foo::$p must not be accessed before initialization" array(1) { ["bar"]=> int(2) } -string(71) "Cannot write an array to a null property which does not allow for array" +string(79) "Cannot write an array to a null property Foo::$s which does not allow for array" string(72) "Typed static property Foo::$s must not be accessed before initialization" array(1) { [0]=> int(3) } -string(81) "Cannot write an array to a null or false reference which does not allow for array" +string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" NULL -string(81) "Cannot write an array to a null or false reference which does not allow for array" +string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" NULL diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 4b5510eb11a8a..5bb366448fdf5 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2109,7 +2109,9 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); } else { array_init(container); goto fetch_from_array; @@ -2456,14 +2458,18 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property %s::$%s which does not allow for array", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } return; } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { - zend_throw_error(NULL, "Cannot access uninitialized non-nullable property by reference"); + zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); return; @@ -2626,13 +2632,17 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Cannot write an array to a null property which does not allow for array"); + "Cannot write an array to a null property %s::$%s which does not allow for array", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { - zend_throw_error(NULL, "Cannot access uninitialized property by reference"); + zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", + ZSTR_VAL(property_info->ce->name), + ZSTR_VAL(property_info->name)); return FAILURE; } ZVAL_NEW_REF(ref, ref); @@ -2675,15 +2685,13 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); zend_throw_exception_ex( zend_ce_type_error, 0, - "Reference with value of type %s held by property %s%s%s of type %s%s is not compatible with property %s%s%s of type %s%s", + "Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), - (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", prop_name1, ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", prop_name2, ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) @@ -2693,10 +2701,9 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { zend_throw_exception_ex( zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s%s%s of type %s%s", + "Cannot assign %s to reference held by property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop->ce->name), - (prop->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop->name), ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) @@ -2707,15 +2714,13 @@ ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( zend_property_info *prop1, zend_property_info *prop2, zval *zv) { zend_throw_exception_ex( zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s%s%s of type %s%s and property %s%s%s of type %s%s, as this would result in an inconsistent type conversion", + "Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), - (prop1->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - (prop2->flags & ZEND_ACC_STATIC) ? "::$" : "->", ZSTR_VAL(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 7a086663ef263..0b14d4a09ef76 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2573,7 +2573,9 @@ ZEND_VM_C_LABEL(try_assign_dim_array): zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index ef73f1630d1f0..087c8013900b3 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26088,7 +26088,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26209,7 +26211,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26330,7 +26334,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26450,7 +26456,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29021,7 +29029,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29142,7 +29152,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29263,7 +29275,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29383,7 +29397,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31001,7 +31017,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31122,7 +31140,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31243,7 +31263,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31363,7 +31385,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33551,7 +33575,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33672,7 +33698,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33793,7 +33821,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33913,7 +33943,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46405,7 +46437,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -46526,7 +46560,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46647,7 +46683,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46767,7 +46805,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -50735,7 +50775,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50856,7 +50898,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50977,7 +51021,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51097,7 +51143,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54006,7 +54054,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -54127,7 +54177,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54248,7 +54300,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54368,7 +54422,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -57624,7 +57680,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); @@ -57745,7 +57803,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57866,7 +57926,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57986,7 +58048,9 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference which does not allow for array"); + "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name)); From f697a7b243a04c979845d3174851afa552158e91 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 24 Sep 2018 22:20:15 +0200 Subject: [PATCH 314/369] Fix two more tests in ext/standard --- ext/standard/tests/array/extract_typed_ref.phpt | 2 +- .../tests/general_functions/settype_typed_property.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/standard/tests/array/extract_typed_ref.phpt b/ext/standard/tests/array/extract_typed_ref.phpt index 8eac12945f487..8b697d5ccb244 100644 --- a/ext/standard/tests/array/extract_typed_ref.phpt +++ b/ext/standard/tests/array/extract_typed_ref.phpt @@ -18,6 +18,6 @@ var_dump($test->i, $test->s); ?> --EXPECT-- -Cannot assign string to reference held by property Test->i of type int +Cannot assign string to reference held by property Test::$i of type int int(0) string(0) "" diff --git a/ext/standard/tests/general_functions/settype_typed_property.phpt b/ext/standard/tests/general_functions/settype_typed_property.phpt index a987a41670778..a206a4ba41b23 100644 --- a/ext/standard/tests/general_functions/settype_typed_property.phpt +++ b/ext/standard/tests/general_functions/settype_typed_property.phpt @@ -24,5 +24,5 @@ var_dump($test->x); ?> --EXPECT-- int(42) -Cannot assign array to reference held by property Test->x of type int +Cannot assign array to reference held by property Test::$x of type int int(42) From f2d72b92850f7b7f2931731403a52778a0bc1b0b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 12:09:56 +0200 Subject: [PATCH 315/369] Evaluate expressions involving constants in property initializers according to strict_types of the class containing file This ensures consistency with function default values, while not introducing a disparity between compile and run-time evaluation of initializers (i.e. preventing ordering dependent outcomes). --- .../typed_properties_043.phpt | 33 +++++++++++++++++++ .../typed_properties_058.phpt | 4 ++- Zend/zend_API.c | 3 +- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 9 ++--- 5 files changed, 43 insertions(+), 8 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt new file mode 100644 index 0000000000000..9593d588644dc --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,33 @@ +--TEST-- +Constants in default values of properties with weak types +--FILE-- +foo, $o->float); + +for ($i = 0; $i < 2; $i++) { + try { + $o = new B(); + var_dump($o->foo); + } catch (Throwable $e) { + echo $e->getMessage() . "\n"; + } +} +?> +--EXPECT-- +string(7) "5.0E+20" +float(5.0E+20) +Typed property B::$foo must be int, float used +Typed property B::$foo must be int, float used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index 09a21435c4f0a..f202b1aeeca32 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -8,6 +8,7 @@ define("FOO", 5); class A { public int $foo = FOO; + public float $float = FOO; } class B { @@ -15,7 +16,7 @@ class B { } $o = new A(); -var_dump($o->foo); +var_dump($o->foo, $o->float); for ($i = 0; $i < 2; $i++) { try { @@ -28,6 +29,7 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) +float(5) Typed property B::$foo must be string, int used Typed property B::$foo must be string, int used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 8c896b8905ca6..8bd9630c9bbe7 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1180,9 +1180,8 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, (ce->ce_flags & ZEND_ACC_STRICT_TYPES) != 0))) { zend_verify_property_type_error(prop_info, &tmp); - class_type->ce_flags &= ~ZEND_ACC_CONSTANTS_UPDATED; zval_ptr_dtor(&tmp); return FAILURE; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 9471a5aae83a9..d00274b65cdda 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6386,7 +6386,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ ce->name = name; zend_initialize_class_data(ce, 1); - ce->ce_flags |= decl->flags; + ce->ce_flags |= decl->flags | (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES); ce->info.user.filename = zend_get_compiled_filename(); ce->info.user.line_start = decl->start_lineno; ce->info.user.line_end = decl->end_lineno; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f21257a6ece69..1409ad11eecc8 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,7 +220,11 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* Class Flags (unused: 14...) | | | */ +/* op_array uses strict mode types | | | */ +/* | | | */ +#define ZEND_ACC_STRICT_TYPES (1 << 31) /* X | X | | */ +/* | | | */ +/* Class Flags (unused: 14..30) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -304,9 +308,6 @@ typedef struct _zend_oparray_context { /* | | | */ /* internal function is allocated at arena (int only) | | | */ #define ZEND_ACC_ARENA_ALLOCATED (1 << 24) /* | X | | */ -/* | | | */ -/* op_array uses strict mode types | | | */ -#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */ #define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) From c78d5f6d1ec7cf8f382bcfa5b0a91a884bd2c457 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 13:28:57 +0200 Subject: [PATCH 316/369] Make visibility a property of the prop_group AST node --- Zend/zend_ast.c | 3 +-- Zend/zend_compile.c | 5 ++--- Zend/zend_language_parser.y | 4 ++-- 3 files changed, 5 insertions(+), 7 deletions(-) diff --git a/Zend/zend_ast.c b/Zend/zend_ast.c index 16f5b46dc12b7..d71aa3daa54ce 100644 --- a/Zend/zend_ast.c +++ b/Zend/zend_ast.c @@ -1419,8 +1419,6 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio zend_ast *type_ast = ast->child[0]; zend_ast *prop_ast = ast->child[1]; - ast = prop_ast; - if (ast->attr & ZEND_ACC_PUBLIC) { smart_str_appends(str, "public "); } else if (ast->attr & ZEND_ACC_PROTECTED) { @@ -1441,6 +1439,7 @@ static ZEND_COLD void zend_ast_export_ex(smart_str *str, zend_ast *ast, int prio smart_str_appendc(str, ' '); } + ast = prop_ast; goto simple_list; } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d00274b65cdda..af1e01e4763db 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6007,10 +6007,9 @@ void zend_compile_func_decl(znode *result, zend_ast *ast, zend_bool toplevel) /* } /* }}} */ -void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast) /* {{{ */ +void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags) /* {{{ */ { zend_ast_list *list = zend_ast_get_list(ast); - uint32_t flags = list->attr; zend_class_entry *ce = CG(active_class_entry); uint32_t i, children = list->children; @@ -6143,7 +6142,7 @@ void zend_compile_prop_group(zend_ast *list) /* {{{ */ zend_ast *type_ast = list->child[0]; zend_ast *prop_ast = list->child[1]; - zend_compile_prop_decl(prop_ast, type_ast); + zend_compile_prop_decl(prop_ast, type_ast, list->attr); } /* }}} */ void zend_compile_class_const_decl(zend_ast *ast) /* {{{ */ diff --git a/Zend/zend_language_parser.y b/Zend/zend_language_parser.y index f78f3011afc84..7ec0ca1126056 100644 --- a/Zend/zend_language_parser.y +++ b/Zend/zend_language_parser.y @@ -717,8 +717,8 @@ class_statement_list: class_statement: variable_modifiers optional_type property_list ';' - { $3->attr = $1; - $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3); } + { $$ = zend_ast_create(ZEND_AST_PROP_GROUP, $2, $3); + $$->attr = $1; } | method_modifiers T_CONST class_const_list ';' { $$ = $3; $$->attr = $1; } | T_USE name_list trait_adaptations From ce68539840f133094b56e468f7a0b1ce55a446fd Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Tue, 25 Sep 2018 13:34:15 +0200 Subject: [PATCH 317/369] Enforce strict types for property initializer evaluation Revert "Evaluate expressions involving constants in property initializers according to strict_types of the class containing file" This reverts commit f2d72b92850f7b7f2931731403a52778a0bc1b0b. --- .../typed_properties_043.phpt | 33 ------------------- .../typed_properties_058.phpt | 4 +-- Zend/zend_API.c | 2 +- Zend/zend_compile.c | 2 +- Zend/zend_compile.h | 9 +++-- 5 files changed, 7 insertions(+), 43 deletions(-) delete mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt deleted file mode 100644 index 9593d588644dc..0000000000000 --- a/Zend/tests/type_declarations/typed_properties_043.phpt +++ /dev/null @@ -1,33 +0,0 @@ ---TEST-- -Constants in default values of properties with weak types ---FILE-- -foo, $o->float); - -for ($i = 0; $i < 2; $i++) { - try { - $o = new B(); - var_dump($o->foo); - } catch (Throwable $e) { - echo $e->getMessage() . "\n"; - } -} -?> ---EXPECT-- -string(7) "5.0E+20" -float(5.0E+20) -Typed property B::$foo must be int, float used -Typed property B::$foo must be int, float used diff --git a/Zend/tests/type_declarations/typed_properties_058.phpt b/Zend/tests/type_declarations/typed_properties_058.phpt index f202b1aeeca32..09a21435c4f0a 100644 --- a/Zend/tests/type_declarations/typed_properties_058.phpt +++ b/Zend/tests/type_declarations/typed_properties_058.phpt @@ -8,7 +8,6 @@ define("FOO", 5); class A { public int $foo = FOO; - public float $float = FOO; } class B { @@ -16,7 +15,7 @@ class B { } $o = new A(); -var_dump($o->foo, $o->float); +var_dump($o->foo); for ($i = 0; $i < 2; $i++) { try { @@ -29,7 +28,6 @@ for ($i = 0; $i < 2; $i++) { ?> --EXPECT-- int(5) -float(5) Typed property B::$foo must be string, int used Typed property B::$foo must be string, int used diff --git a/Zend/zend_API.c b/Zend/zend_API.c index 8bd9630c9bbe7..b3f97bf94a9e2 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -1180,7 +1180,7 @@ ZEND_API int zend_update_class_constants(zend_class_entry *class_type) /* {{{ */ if (UNEXPECTED(zval_update_constant_ex(&tmp, ce) != SUCCESS)) { return FAILURE; } - if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, (ce->ce_flags & ZEND_ACC_STRICT_TYPES) != 0))) { + if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, 1 /* property initializers must always be evaluated with strict types */))) { zend_verify_property_type_error(prop_info, &tmp); zval_ptr_dtor(&tmp); return FAILURE; diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index af1e01e4763db..47ca355495cac 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6385,7 +6385,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ ce->name = name; zend_initialize_class_data(ce, 1); - ce->ce_flags |= decl->flags | (CG(active_op_array)->fn_flags & ZEND_ACC_STRICT_TYPES); + ce->ce_flags |= decl->flags; ce->info.user.filename = zend_get_compiled_filename(); ce->info.user.line_start = decl->start_lineno; ce->info.user.line_end = decl->end_lineno; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 1409ad11eecc8..f21257a6ece69 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -220,11 +220,7 @@ typedef struct _zend_oparray_context { /* Function has typed arguments / class has typed props | | | */ #define ZEND_ACC_HAS_TYPE_HINTS (1 << 7) /* X | X | | */ /* | | | */ -/* op_array uses strict mode types | | | */ -/* | | | */ -#define ZEND_ACC_STRICT_TYPES (1 << 31) /* X | X | | */ -/* | | | */ -/* Class Flags (unused: 14..30) | | | */ +/* Class Flags (unused: 14...) | | | */ /* =========== | | | */ /* | | | */ /* Special class types | | | */ @@ -308,6 +304,9 @@ typedef struct _zend_oparray_context { /* | | | */ /* internal function is allocated at arena (int only) | | | */ #define ZEND_ACC_ARENA_ALLOCATED (1 << 24) /* | X | | */ +/* | | | */ +/* op_array uses strict mode types | | | */ +#define ZEND_ACC_STRICT_TYPES (1 << 31) /* | X | | */ #define ZEND_ACC_PPP_MASK (ZEND_ACC_PUBLIC | ZEND_ACC_PROTECTED | ZEND_ACC_PRIVATE) From 68abea69dcf6d857a4096bf3cec2e2f82e29e84c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 11:14:23 +0200 Subject: [PATCH 318/369] Remove REF flag from ASSIGN_(OBJ|STATIC_PROP)_REF This flag is not used and clashes with RETURNS_FUNCTION. --- Zend/zend_compile.c | 2 ++ 1 file changed, 2 insertions(+) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 47ca355495cac..bd62d79a2d088 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -3000,12 +3000,14 @@ void zend_compile_assign_ref(znode *result, zend_ast *ast) /* {{{ */ if (opline && opline->opcode == ZEND_FETCH_OBJ_W) { opline->opcode = ZEND_ASSIGN_OBJ_REF; + opline->extended_value &= ~ZEND_FETCH_REF; zend_emit_op_data(&source_node); if (result != NULL) { *result = target_node; } } else if (opline && opline->opcode == ZEND_FETCH_STATIC_PROP_W) { opline->opcode = ZEND_ASSIGN_STATIC_PROP_REF; + opline->extended_value &= ~ZEND_FETCH_REF; zend_emit_op_data(&source_node); if (result != NULL) { *result = target_node; From e1508f2a75de124287331309111d31a10b176774 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 12:25:06 +0200 Subject: [PATCH 319/369] Add a missing ASSIGN_STATIC_PROP_REF case --- ext/opcache/Optimizer/zend_optimizer.c | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 8779565432f8f..b25c4bca99740 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -335,6 +335,7 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, break; } case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_FETCH_STATIC_PROP_R: case ZEND_FETCH_STATIC_PROP_W: case ZEND_FETCH_STATIC_PROP_RW: From fe4f9f377ae6999d370adfab25037767d5f77806 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 16:06:17 +0200 Subject: [PATCH 320/369] Don't return pointer to stack memory Normalize to variable_ptr rather than value to make lifetime requirement more obvious. We can't return "value" directly if it had to be coerced. --- Zend/zend_object_handlers.c | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 35814601a3dd6..4259ceebbf1d2 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -807,7 +807,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, EG(current_execute_data) && ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { zend_verify_property_type_error(prop_info, value); Z_TRY_DELREF_P(value); - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } value = &tmp; @@ -831,7 +831,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } } } else if (UNEXPECTED(EG(exception))) { - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } @@ -845,13 +845,14 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_std_call_setter(zobj, name, value); (*guard) &= ~IN_SET; OBJ_RELEASE(zobj); + variable_ptr = value; } else if (EXPECTED(!IS_WRONG_PROPERTY_OFFSET(property_offset))) { goto write_std_property; } else { /* Trigger the correct error */ zend_get_property_offset(zobj->ce, name, 0, NULL); ZEND_ASSERT(EG(exception)); - value = &EG(error_zval); + variable_ptr = &EG(error_zval); goto exit; } } else { @@ -881,18 +882,19 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } value = &tmp; } - ZVAL_COPY_VALUE(OBJ_PROP(zobj, property_offset), value); + variable_ptr = OBJ_PROP(zobj, property_offset); + ZVAL_COPY_VALUE(variable_ptr, value); } else { if (!zobj->properties) { rebuild_object_properties(zobj); } - zend_hash_add_new(zobj->properties, name, value); + variable_ptr = zend_hash_add_new(zobj->properties, name, value); } } exit: zend_tmp_string_release(tmp_name); - return value; + return variable_ptr; } /* }}} */ From ccf448193f5b93b0a891e79a29baa6f43990533e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 27 Sep 2018 16:10:35 +0200 Subject: [PATCH 321/369] Initialize return value for one exception case --- Zend/zend_execute.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 476e6bb6babba..40d892e2f4c60 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2114,6 +2114,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); + ZVAL_ERROR(result); } else { array_init(container); goto fetch_from_array; From 313590d91462e859f3c7ee183d366fda8d5bb4cd Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:48:29 +0200 Subject: [PATCH 322/369] Correctly handle resolved types in reflection --- ext/reflection/php_reflection.c | 4 +++- ext/reflection/tests/ReflectionType_001.phpt | 9 +++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 8bca4cf243158..5c0d4c206d9a3 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -2875,8 +2875,10 @@ ZEND_METHOD(reflection_type, isBuiltin) /* {{{ reflection_type_name */ static zend_string *reflection_type_name(type_reference *param) { - if (ZEND_TYPE_IS_CLASS(param->type)) { + if (ZEND_TYPE_IS_NAME(param->type)) { return zend_string_copy(ZEND_TYPE_NAME(param->type)); + } else if (ZEND_TYPE_IS_CE(param->type)) { + return zend_string_copy(ZEND_TYPE_CE(param->type)->name); } else { char *name = zend_get_type_by_const(ZEND_TYPE_CODE(param->type)); return zend_string_init(name, strlen(name), 0); diff --git a/ext/reflection/tests/ReflectionType_001.phpt b/ext/reflection/tests/ReflectionType_001.phpt index bdffb19a92941..e47a9615ba56f 100644 --- a/ext/reflection/tests/ReflectionType_001.phpt +++ b/ext/reflection/tests/ReflectionType_001.phpt @@ -95,7 +95,11 @@ foreach ($reflector->getProperties() as $name => $property) { } else printf("public $%s;\n", $property->getName()); } -echo "** property types\n"; +echo "*** resolved property types\n"; +$obj = new PropTypeTest; +$obj->std = new stdClass; +$r = (new ReflectionProperty($obj, 'std'))->getType(); +var_dump($r->getName()); ?> --EXPECT-- *** functions @@ -216,4 +220,5 @@ public iterable $iterable; public stdClass $std; public OtherThing $other; public $mixed; -** property types +*** resolved property types +string(8) "stdClass" From 98b8e8ea4c058323bc834c1e7672dd31ad156527 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:50:52 +0200 Subject: [PATCH 323/369] Remove unused enum --- ext/reflection/php_reflection.c | 5 ----- 1 file changed, 5 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 5c0d4c206d9a3..8e5cc1555ed55 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -117,11 +117,6 @@ typedef struct _parameter_reference { zend_function *fptr; } parameter_reference; -typedef enum { - REF_INFO_ARG, - REF_INFO_PROP -} reflection_info_type_t; - /* Struct for type hints */ typedef struct _type_reference { zend_type type; From 6f9eac9c0ccc64ec6f3e2e4535c0546327220852 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 28 Sep 2018 22:53:10 +0200 Subject: [PATCH 324/369] Only lookup prop info for INDIRECT --- ext/standard/var.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/ext/standard/var.c b/ext/standard/var.c index c94b741a41e49..e5ccec48e25f2 100644 --- a/ext/standard/var.c +++ b/ext/standard/var.c @@ -175,10 +175,9 @@ PHPAPI void php_var_dump(zval *struc, int level) /* {{{ */ if (Z_TYPE_P(val) == IS_INDIRECT) { val = Z_INDIRECT_P(val); - } - - if (key) { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + if (key) { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + } } if (!Z_ISUNDEF_P(val) || prop_info) { @@ -367,10 +366,9 @@ PHPAPI void php_debug_zval_dump(zval *struc, int level) /* {{{ */ if (Z_TYPE_P(val) == IS_INDIRECT) { val = Z_INDIRECT_P(val); - } - - if (key) { - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + if (key) { + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(struc), key, NULL); + } } if (!Z_ISUNDEF_P(val) || prop_info) { From b8881f0f509232629b826cc4f3133b0764154519 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 29 Sep 2018 13:51:24 +0200 Subject: [PATCH 325/369] Fix usage of self typehint in static trait properties --- .../typed_properties_043.phpt | 28 +++++++++++++++++++ Zend/zend_execute.c | 5 ++++ 2 files changed, 33 insertions(+) create mode 100644 Zend/tests/type_declarations/typed_properties_043.phpt diff --git a/Zend/tests/type_declarations/typed_properties_043.phpt b/Zend/tests/type_declarations/typed_properties_043.phpt new file mode 100644 index 0000000000000..992feba025633 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_043.phpt @@ -0,0 +1,28 @@ +--TEST-- +Trying to assign to a static 'self' typed property on a trait must not fixate the type to the trait +--FILE-- +getMessage(), "\n"; +} + +class Foo { + use Test; +} + +Foo::$prop = new Foo; + +var_dump(Foo::$prop); + +?> +--EXPECT-- +Cannot write a value to a 'self' typed static property of a trait +object(Foo)#1 (0) { +} diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 40d892e2f4c60..9a5057e4b4a05 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -909,6 +909,11 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i ZEND_API zend_bool zend_load_property_class_type(zend_property_info *info) { if (zend_string_equals_literal_ci(ZEND_TYPE_NAME(info->type), "self")) { + if (UNEXPECTED((info->ce->ce_flags & ZEND_ACC_TRAIT) != 0)) { + zend_throw_error(NULL, "Cannot write a%s value to a 'self' typed static property of a trait", ZEND_TYPE_ALLOW_NULL(info->type) ? " non-null" : ""); + return 0; + } + zend_string_release(ZEND_TYPE_NAME(info->type)); info->type = ZEND_TYPE_ENCODE_CE(info->ce, ZEND_TYPE_ALLOW_NULL(info->type)); } else if (zend_string_equals_literal_ci(ZEND_TYPE_NAME(info->type), "parent")) { From de9a77f4ef344f0e3382e7d05282948ef97a3c2b Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sat, 29 Sep 2018 14:58:44 +0200 Subject: [PATCH 326/369] Fix typed unint static property taken by ref being undefined --- .../type_declarations/typed_properties_087.phpt | 15 +++++++++++++++ Zend/zend_execute.c | 5 ++++- 2 files changed, 19 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_087.phpt diff --git a/Zend/tests/type_declarations/typed_properties_087.phpt b/Zend/tests/type_declarations/typed_properties_087.phpt new file mode 100644 index 0000000000000..b981dfc166ba2 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_087.phpt @@ -0,0 +1,15 @@ +--TEST-- +Ensure null-initialization of nullable typed static property taken by reference +--FILE-- + +--EXPECT-- +NULL diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9a5057e4b4a05..a27a0fd5b7994 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2647,12 +2647,15 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(*retval) <= IS_NULL)) { + if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_info->name)); return FAILURE; } + if (UNEXPECTED(Z_ISUNDEF_P(ref))) { + ZVAL_NULL(ref); + } ZVAL_NEW_REF(ref, ref); if (property_info->type) { ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(ref), property_info); From 4ca499689bd4656e351d1766f666b3b57a538e3c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sat, 29 Sep 2018 16:18:52 +0200 Subject: [PATCH 327/369] Fix reflection after recent master changes --- ext/reflection/php_reflection.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index 9a12ca98084d1..c7e23aefc5237 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5550,7 +5550,7 @@ ZEND_METHOD(reflection_property, isInitialized) } if (ref->prop.flags & ZEND_ACC_STATIC) { - member_p = zend_read_static_property_ex(ref->ce, ref->unmangled_name, 1); + member_p = zend_read_static_property_ex(intern->ce, ref->unmangled_name, 1); if (member_p) { RETURN_BOOL(!Z_ISUNDEF_P(member_p)) } @@ -5567,7 +5567,7 @@ ZEND_METHOD(reflection_property, isInitialized) /* Returns from this function */ } - member_p = zend_read_property_ex(ref->ce, object, ref->unmangled_name, 1, &rv); + member_p = zend_read_property_ex(intern->ce, object, ref->unmangled_name, 1, &rv); RETVAL_BOOL(member_p != &EG(uninitialized_zval)); if (member_p == &rv) { zval_ptr_dtor(member_p); From 23b1d0a7c4f0b95e56a8331970051c9f9bc26552 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 18:52:43 +0200 Subject: [PATCH 328/369] Simplify code using compile_typename --- Zend/zend_compile.c | 35 +---------------------------------- 1 file changed, 1 insertion(+), 34 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 5e8ae9d2852d5..887ec865d78d4 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -6023,43 +6023,10 @@ void zend_compile_prop_decl(zend_ast *ast, zend_ast *type_ast, uint32_t flags) / zend_string *name = zval_make_interned_string(zend_ast_get_zval(name_ast)); zend_string *doc_comment = NULL; zval value_zv; - zend_bool allow_null = 0; zend_type type = 0; if (type_ast) { - if (type_ast->attr & ZEND_TYPE_NULLABLE) { - allow_null = 1; - type_ast->attr &= ~ZEND_TYPE_NULLABLE; - } - - if (type_ast->kind == ZEND_AST_TYPE) { - type = ZEND_TYPE_ENCODE(type_ast->attr, allow_null); - } else { - zend_string *class_name = zend_ast_get_str(type_ast); - zend_uchar typeinfo = zend_lookup_builtin_type_by_name(class_name); - - if (typeinfo != 0) { - if (type_ast->attr != ZEND_NAME_NOT_FQ) { - zend_error_noreturn(E_COMPILE_ERROR, - "Scalar type declaration '%s' must be unqualified", - ZSTR_VAL(zend_string_tolower(class_name))); - } - - type = ZEND_TYPE_ENCODE(typeinfo, allow_null); - } else { - uint32_t fetch_type = zend_get_class_fetch_type_ast(type_ast); - - if (fetch_type == ZEND_FETCH_CLASS_DEFAULT) { - class_name = zend_resolve_class_name_ast(type_ast); - zend_assert_valid_class_name(class_name); - } else { - zend_ensure_valid_class_fetch_type(fetch_type); - zend_string_addref(class_name); - } - - type = ZEND_TYPE_ENCODE_CLASS(zend_new_interned_string(class_name), allow_null); - } - } + type = zend_compile_typename(type_ast, 0); if (ZEND_TYPE_CODE(type) == IS_VOID || ZEND_TYPE_CODE(type) == IS_CALLABLE) { zend_error_noreturn(E_COMPILE_ERROR, From f1e09b3db2314ebed2ebfc3683bb8fa00d55f972 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 18:54:42 +0200 Subject: [PATCH 329/369] Fix tests for master changes --- .../tests/type_declarations/typed_properties_021.phpt | 11 ++++------- .../tests/type_declarations/typed_properties_022.phpt | 11 ++++------- 2 files changed, 8 insertions(+), 14 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_021.phpt b/Zend/tests/type_declarations/typed_properties_021.phpt index 79a5d70098e41..a9f82528d9260 100644 --- a/Zend/tests/type_declarations/typed_properties_021.phpt +++ b/Zend/tests/type_declarations/typed_properties_021.phpt @@ -9,10 +9,7 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Class 'BAR' not found in %s on line 6 - - - - - - +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d diff --git a/Zend/tests/type_declarations/typed_properties_022.phpt b/Zend/tests/type_declarations/typed_properties_022.phpt index 1aa23f301fdfd..7e947825c954b 100644 --- a/Zend/tests/type_declarations/typed_properties_022.phpt +++ b/Zend/tests/type_declarations/typed_properties_022.phpt @@ -9,10 +9,7 @@ class Foo { $foo = new Foo(); ?> --EXPECTF-- -Fatal error: Class 'BAR' not found in %s on line 6 - - - - - - +Fatal error: Uncaught Error: Class 'BAR' not found in %s:%d +Stack trace: +#0 {main} + thrown in %s on line %d From 02f3baa3d1faf2e15fa5207d3a1e132614c05e6a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Sun, 30 Sep 2018 19:41:14 +0200 Subject: [PATCH 330/369] Fix cache slot invalidation --- .../typed_properties_088.phpt | 30 +++++++++++++++++++ Zend/zend_object_handlers.c | 4 +-- 2 files changed, 31 insertions(+), 3 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_088.phpt diff --git a/Zend/tests/type_declarations/typed_properties_088.phpt b/Zend/tests/type_declarations/typed_properties_088.phpt new file mode 100644 index 0000000000000..b2f626d3dab89 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_088.phpt @@ -0,0 +1,30 @@ +--TEST-- +Check for correct invalidation of prop_info cache slots +--FILE-- +prop = "42"; + var_dump($obj); +} + +test(new A); +test(new B); + +?> +--EXPECT-- +object(A)#1 (1) { + ["prop"]=> + int(42) +} +object(B)#1 (1) { + ["prop"]=> + string(2) "42" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 4259ceebbf1d2..780111ad12ef7 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -453,9 +453,7 @@ static zend_always_inline uintptr_t zend_get_property_offset(zend_class_entry *c } if (cache_slot) { CACHE_POLYMORPHIC_PTR_EX(cache_slot, ce, (void*)(uintptr_t)property_info->offset); - if (property_info->type) { - CACHE_PTR_EX(cache_slot + 2, property_info); - } + CACHE_PTR_EX(cache_slot + 2, property_info->type ? property_info : NULL); } return property_info->offset; } From c38032a60ccdeb67a88e1dadf04650241b3b3e22 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 20:19:49 +0200 Subject: [PATCH 331/369] Prevent any incdec on integer boundaries with typed properties --- .../typed_properties_033.phpt | 2 +- .../typed_properties_044.phpt | 23 +++-- .../typed_properties_062.phpt | 20 ++++- .../typed_properties_063.phpt | 20 ++++- .../typed_properties_064.phpt | 20 ++++- .../typed_properties_065.phpt | 21 ++++- Zend/zend_execute.c | 61 ++++++++++++- Zend/zend_vm_def.h | 28 +++++- Zend/zend_vm_execute.h | 88 ++++++++++++++++--- 9 files changed, 249 insertions(+), 34 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_033.phpt b/Zend/tests/type_declarations/typed_properties_033.phpt index 153e0515be198..87e6aef26b6e0 100644 --- a/Zend/tests/type_declarations/typed_properties_033.phpt +++ b/Zend/tests/type_declarations/typed_properties_033.phpt @@ -18,7 +18,7 @@ $foo = new class { try { foreach ($foo->fetch() as &$prop) { - $prop++; + $prop += 1; } } catch (Error $e) { echo $e->getMessage(), "\n"; } diff --git a/Zend/tests/type_declarations/typed_properties_044.phpt b/Zend/tests/type_declarations/typed_properties_044.phpt index 39e324edb64c9..02a71a7b0b6bd 100644 --- a/Zend/tests/type_declarations/typed_properties_044.phpt +++ b/Zend/tests/type_declarations/typed_properties_044.phpt @@ -31,11 +31,20 @@ try { echo $e->getMessage() . "\n"; } -/* (1 << 63) - 1 overflows to float, which is exactly convertible back to (1 << 63) */ $bar = PHP_INT_MIN; -var_dump($bar--); -var_dump(--$bar); + +try { + var_dump($bar--); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} + +try { + var_dump(--$bar); +} catch (Throwable $e) { + echo $e->getMessage() . "\n"; +} ?> --EXPECT-- @@ -43,7 +52,7 @@ int(0) int(-2) int(-1) int(-1) -Cannot assign float to reference held by property class@anonymous::$bar of type ?int -Cannot assign float to reference held by property class@anonymous::$bar of type ?int -int(-9223372036854775808) -int(-9223372036854775808) +Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value +Cannot increment a reference held by property class@anonymous::$bar of type ?int past its maximal value +Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value +Cannot decrement a reference held by property class@anonymous::$bar of type ?int past its minimal value diff --git a/Zend/tests/type_declarations/typed_properties_062.phpt b/Zend/tests/type_declarations/typed_properties_062.phpt index adfc462f8dace..45f4682806f39 100644 --- a/Zend/tests/type_declarations/typed_properties_062.phpt +++ b/Zend/tests/type_declarations/typed_properties_062.phpt @@ -27,6 +27,18 @@ var_dump($a->foo); --$a->_; var_dump($a->foo); +$a->foo = PHP_INT_MIN; + +try { + $a->_--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$a->_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + $a->foo = PHP_INT_MAX; try { @@ -56,9 +68,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) diff --git a/Zend/tests/type_declarations/typed_properties_063.phpt b/Zend/tests/type_declarations/typed_properties_063.phpt index f5b4a16584fb3..bd4cccff22f34 100644 --- a/Zend/tests/type_declarations/typed_properties_063.phpt +++ b/Zend/tests/type_declarations/typed_properties_063.phpt @@ -26,6 +26,18 @@ var_dump($a->foo); --$_; var_dump($a->foo); +$a->foo = PHP_INT_MIN; + +try { + $_--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$_; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + $a->foo = PHP_INT_MAX; try { @@ -55,9 +67,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) diff --git a/Zend/tests/type_declarations/typed_properties_064.phpt b/Zend/tests/type_declarations/typed_properties_064.phpt index 0e06fee88174f..59e0552898a8d 100644 --- a/Zend/tests/type_declarations/typed_properties_064.phpt +++ b/Zend/tests/type_declarations/typed_properties_064.phpt @@ -26,6 +26,18 @@ var_dump($a->foo); --$_[0]; var_dump($a->foo); +$a->foo = PHP_INT_MIN; + +try { + $_[0]--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$_[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + $a->foo = PHP_INT_MAX; try { @@ -55,9 +67,13 @@ Cannot assign string to reference held by property class@anonymous::$foo of type int(21) int(20) int(19) -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value integer Cannot assign array to reference held by property class@anonymous::$foo of type int int(0) diff --git a/Zend/tests/type_declarations/typed_properties_065.phpt b/Zend/tests/type_declarations/typed_properties_065.phpt index ea8ba8fd67522..0eac6a488baf1 100644 --- a/Zend/tests/type_declarations/typed_properties_065.phpt +++ b/Zend/tests/type_declarations/typed_properties_065.phpt @@ -27,6 +27,18 @@ var_dump($a->foo); --$a[0]; var_dump($a->foo); +$a->foo = PHP_INT_MIN; + +try { + $a[0]--; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + +try { + --$a[0]; +} catch (Error $e) { echo $e->getMessage(), "\n"; } +echo gettype($a->foo),"\n"; + $a->foo = PHP_INT_MAX; try { @@ -49,7 +61,12 @@ offsetSet(1e50) int(1) int(0) int(-1) -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value integer -Cannot assign float to reference held by property class@anonymous::$foo of type int +Cannot decrement a reference held by property class@anonymous::$foo of type int past its minimal value integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer +Cannot increment a reference held by property class@anonymous::$foo of type int past its maximal value +integer + diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index a27a0fd5b7994..019505e1097ea 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -1532,6 +1532,33 @@ static zend_never_inline void zend_assign_to_string_offset(zval *str, zval *dim, } } +static zend_property_info *zend_ref_accepts_double(zend_reference *ref) +{ + zend_property_info *prop; + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (ZEND_TYPE_CODE(prop->type) != IS_DOUBLE) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference *ref, int inc) +{ + zend_property_info *error_prop; + if ((error_prop = zend_ref_accepts_double(ref))) { + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(error_prop->ce->name), + ZSTR_VAL(error_prop->name), + ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "", + inc ? "max" : "min"); + return 0; + } + return 1; +} + static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_info, int inc OPLINE_DC EXECUTE_DATA_DC) { if (EXPECTED(Z_TYPE_P(prop) == IS_LONG)) { @@ -1567,7 +1594,22 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (ref) { + if (zend_ref_verify_assign_incdec_double(ref, inc)) { + ZVAL_COPY_VALUE(&ref->val, &z_copy); + } + } else { + ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name), + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + inc ? "max" : "min"); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { @@ -1630,7 +1672,22 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } else { decrement_function(&z_copy); } - if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE(z_copy) == IS_DOUBLE) && Z_TYPE_P(prop) == IS_LONG) { + if (ref) { + if (zend_ref_verify_assign_incdec_double(ref, inc)) { + ZVAL_COPY_VALUE(&ref->val, &z_copy); + } + } else { + ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); + zend_throw_exception_ex(zend_ce_type_error, 0, + "Cannot %screment a property %s::$%s of type %sint past its %simal value", + inc ? "in" : "de", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(prop_info->name), + ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", + inc ? "max" : "min"); + } + } else if (EXPECTED(ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(prop); ZVAL_COPY_VALUE(prop, &z_copy); } else { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0b14d4a09ef76..51341c417e91f 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1430,7 +1430,13 @@ ZEND_VM_HANDLER(34, ZEND_PRE_INC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1492,7 +1498,13 @@ ZEND_VM_HANDLER(35, ZEND_PRE_DEC, VAR|CV, ANY, SPEC(RETVAL)) zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + FREE_OP1_VAR_PTR(); + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); FREE_OP1_VAR_PTR(); @@ -1547,7 +1559,11 @@ ZEND_VM_HANDLER(36, ZEND_POST_INC, VAR|CV, ANY) increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -1593,7 +1609,11 @@ ZEND_VM_HANDLER(37, ZEND_POST_DEC, VAR|CV, ANY) decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 087c8013900b3..a1f1a5559e17f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -22765,7 +22765,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22826,7 +22832,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22888,7 +22900,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_UNUSED zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -22950,7 +22968,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_VAR_RETVAL_USED_H zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -23005,7 +23029,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_VAR_HANDLER(ZEND increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -23051,7 +23079,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_VAR_HANDLER(ZEND decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -41826,7 +41858,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41886,7 +41924,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_INC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -41947,7 +41991,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_UNUSED_ zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -42008,7 +42058,13 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_PRE_DEC_SPEC_CV_RETVAL_USED_HA zval_opt_copy_ctor(var_ptr); decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE(old) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, &old); + + HANDLE_EXCEPTION(); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, &old); @@ -42062,7 +42118,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_INC_SPEC_CV_HANDLER(ZEND_ increment_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 1)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } @@ -42107,7 +42167,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_POST_DEC_SPEC_CV_HANDLER(ZEND_ decrement_function(var_ptr); - if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { + if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_DOUBLE) && Z_TYPE_P(EX_VAR(opline->result.var)) == IS_LONG) { + if (!zend_ref_verify_assign_incdec_double(ref, 0)) { + ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); + } + } else if (UNEXPECTED(!zend_verify_ref_assignable_zval(ref, var_ptr, EX_USES_STRICT_TYPES()))) { zval_ptr_dtor(var_ptr); ZVAL_COPY_VALUE(var_ptr, EX_VAR(opline->result.var)); } From 1d555b709ebce9529f1f5919b0031734a8da8aee Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 22:26:42 +0200 Subject: [PATCH 332/369] Fix leak when modifying typed property during assignment --- .../typed_properties_089.phpt | 38 +++++++++++++++++++ Zend/zend_object_handlers.c | 5 ++- 2 files changed, 42 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_089.phpt diff --git a/Zend/tests/type_declarations/typed_properties_089.phpt b/Zend/tests/type_declarations/typed_properties_089.phpt new file mode 100644 index 0000000000000..1d59b8d945a2a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_089.phpt @@ -0,0 +1,38 @@ +--TEST-- +Modification of typed property during assignment must not leak +--FILE-- +prop = "dont "; + $a->prop .= "leak "; + $a->prop .= "me!"; + return "test"; + } +} + +$a = new A; +$a->prop = new B; +var_dump($a); + +$a = new A; +$prop = &$a->prop; +$a->prop = new B; +var_dump($a); + +?> +--EXPECTF-- +object(A)#1 (1) { + ["prop"]=> + string(4) "test" +} +object(A)#%d (1) { + ["prop"]=> + &string(4) "test" +} diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 780111ad12ef7..cc3133067364f 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -871,6 +871,8 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zend_property_info *prop_info; zval tmp; + variable_ptr = OBJ_PROP(zobj, property_offset); + if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { ZVAL_COPY_VALUE(&tmp, value); if (UNEXPECTED(!zend_verify_property_type(prop_info, &tmp, ZEND_CALL_USES_STRICT_TYPES(EG(current_execute_data))))) { @@ -878,9 +880,10 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zval_ptr_dtor(value); goto exit; } + zval_ptr_dtor(variable_ptr); /* might have been updated via e.g. __toString() */ value = &tmp; } - variable_ptr = OBJ_PROP(zobj, property_offset); + ZVAL_COPY_VALUE(variable_ptr, value); } else { if (!zobj->properties) { From db13ac32db5a1925fba7bc40a6a36e8298cbb1c5 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 22:52:38 +0200 Subject: [PATCH 333/369] Use zend_type_error() instead of zend_throw_exception_ex() --- Zend/zend_closures.c | 4 +- Zend/zend_execute.c | 71 +++++++++++---------------- Zend/zend_object_handlers.c | 19 +++----- Zend/zend_vm_def.h | 3 +- Zend/zend_vm_execute.h | 96 +++++++++++++------------------------ 5 files changed, 68 insertions(+), 125 deletions(-) diff --git a/Zend/zend_closures.c b/Zend/zend_closures.c index 05071bc775903..e2df9e43431c1 100644 --- a/Zend/zend_closures.c +++ b/Zend/zend_closures.c @@ -319,10 +319,10 @@ ZEND_METHOD(Closure, fromCallable) if (success == FAILURE || error) { if (error) { - zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable: %s", error); + zend_type_error("Failed to create closure from callable: %s", error); efree(error); } else { - zend_throw_exception_ex(zend_ce_type_error, 0, "Failed to create closure from callable"); + zend_type_error("Failed to create closure from callable"); } } } diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 019505e1097ea..45611fbf97a65 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -885,25 +885,23 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i } if (ZEND_TYPE_IS_CLASS(info->type)) { - zend_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be an instance of %s%s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), - ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + zend_type_error("Typed property %s::$%s must be an instance of %s%s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), + ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), + ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); } else { - zend_throw_exception_ex(zend_ce_type_error, info->type, - "Typed property %s::$%s must be %s%s, %s used", - ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), - zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), - ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + zend_type_error("Typed property %s::$%s must be %s%s, %s used", + ZSTR_VAL(info->ce->name), + ZSTR_VAL(info->name), + zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), + ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", + Z_TYPE_P(property) == IS_OBJECT ? + ZSTR_VAL(Z_OBJCE_P(property)->name) : + zend_get_type_by_const(Z_TYPE_P(property))); } } @@ -1547,8 +1545,7 @@ static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference * { zend_property_info *error_prop; if ((error_prop = zend_ref_accepts_double(ref))) { - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name), @@ -1601,8 +1598,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i } } else { ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name), @@ -1679,8 +1675,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ } } else { ZEND_ASSERT(ZEND_TYPE_CODE(prop_info->type) == IS_LONG); - zend_throw_exception_ex(zend_ce_type_error, 0, - "Cannot %screment a property %s::$%s of type %sint past its %simal value", + zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name), @@ -2172,8 +2167,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); ZVAL_ERROR(result); @@ -2522,8 +2516,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Cannot write an array to a null property %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(prop_info->name)); ZVAL_UNDEF(ptr); @@ -2678,9 +2671,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { const char *class_name, *prop_name; zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_throw_exception_ex(zend_ce_type_error, - ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", + zend_type_error("Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), prop_name); return FAILURE; @@ -2696,8 +2687,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Cannot write an array to a null property %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_info->name)); return FAILURE; @@ -2751,9 +2741,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 const char *class_name1, *class_name2, *prop_name1, *prop_name2; zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", + zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), prop_name1, @@ -2767,9 +2755,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1 } ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s::$%s of type %s%s", + zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop->ce->name), ZSTR_VAL(prop->name), @@ -2778,11 +2764,8 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, ); } -ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error( - zend_property_info *prop1, zend_property_info *prop2, zval *zv) { - zend_throw_exception_ex( - zend_ce_type_error, 0, - "Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", +ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), ZSTR_VAL(prop1->name), diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index cc3133067364f..b7abc84c619ef 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -761,12 +761,9 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if ((type != BP_VAR_IS)) { if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { - if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(prop_info->type) || Z_TYPE_P(retval) == IS_UNDEF)) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(prop_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(prop_info->type), - "Typed property %s::$%s must not be accessed before initialization", - ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(name)); - } + zend_type_error("Typed property %s::$%s must not be accessed before initialization", + ZSTR_VAL(prop_info->ce->name), + ZSTR_VAL(name)); } else { zend_error(E_NOTICE,"Undefined property: %s::$%s", ZSTR_VAL(zobj->ce->name), ZSTR_VAL(name)); } @@ -784,7 +781,7 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, { zend_object *zobj; zend_string *name, *tmp_name; - zval *variable_ptr; + zval *variable_ptr, tmp; uintptr_t property_offset; zobj = Z_OBJ_P(object); @@ -796,7 +793,6 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, variable_ptr = OBJ_PROP(zobj, property_offset); if (Z_TYPE_P(variable_ptr) != IS_UNDEF) { zend_property_info *prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot); - zval tmp; Z_TRY_ADDREF_P(value); @@ -869,7 +865,6 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, } if (EXPECTED(IS_VALID_PROPERTY_OFFSET(property_offset))) { zend_property_info *prop_info; - zval tmp; variable_ptr = OBJ_PROP(zobj, property_offset); @@ -880,8 +875,8 @@ ZEND_API zval *zend_std_write_property(zval *object, zval *member, zval *value, zval_ptr_dtor(value); goto exit; } - zval_ptr_dtor(variable_ptr); /* might have been updated via e.g. __toString() */ value = &tmp; + goto found; /* might have been updated via e.g. __toString() */ } ZVAL_COPY_VALUE(variable_ptr, value); @@ -1489,9 +1484,7 @@ ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { - zend_throw_exception_ex(zend_ce_type_error, - ZEND_TYPE_IS_CLASS(property_info->type) ? IS_OBJECT : ZEND_TYPE_CODE(property_info->type), - "Typed static property %s::$%s must not be accessed before initialization", + zend_type_error("Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), ZSTR_VAL(property_name)); return NULL; diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 51341c417e91f..b168a1e3f3eb8 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2592,8 +2592,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); FREE_UNFETCHED_OP2(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index a1f1a5559e17f..6e2208d492c75 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26119,8 +26119,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26242,8 +26241,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26365,8 +26363,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -26487,8 +26484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -29060,8 +29056,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29183,8 +29178,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29306,8 +29300,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -29428,8 +29421,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -31048,8 +31040,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31171,8 +31162,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31294,8 +31284,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -31416,8 +31405,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33606,8 +33594,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33729,8 +33716,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33852,8 +33838,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -33974,8 +33959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46500,8 +46484,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46623,8 +46606,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46746,8 +46728,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -46868,8 +46849,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -50838,8 +50818,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50961,8 +50940,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -51084,8 +51062,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -51206,8 +51183,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54117,8 +54093,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54240,8 +54215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54363,8 +54337,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -54485,8 +54458,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57743,8 +57715,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57866,8 +57837,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -57989,8 +57959,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); @@ -58111,8 +58080,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_throw_exception_ex(zend_ce_type_error, ZEND_TYPE_IS_CLASS(error_prop->type) ? IS_OBJECT : ZEND_TYPE_CODE(error_prop->type), - "Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), ZSTR_VAL(error_prop->name)); From a119939723e6feb129f564c8cb38fa447b04ea32 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Sun, 30 Sep 2018 23:41:03 +0200 Subject: [PATCH 334/369] Fix unsetting shadowed typed properties holding a reference --- .../typed_properties_090.phpt | 25 +++++++++++++++++++ Zend/zend_object_handlers.c | 2 +- 2 files changed, 26 insertions(+), 1 deletion(-) create mode 100644 Zend/tests/type_declarations/typed_properties_090.phpt diff --git a/Zend/tests/type_declarations/typed_properties_090.phpt b/Zend/tests/type_declarations/typed_properties_090.phpt new file mode 100644 index 0000000000000..3b75aaa8433df --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_090.phpt @@ -0,0 +1,25 @@ +--TEST-- +Unsetting typed properties containing a reference must respect shadowing +--FILE-- +prop; + unset($this->prop); + $x = "foo"; + var_dump($x); + } +} +class B extends A { + private $prop; +} + +$b = new B; +$b->test(); + +?> +--EXPECT-- +string(3) "foo" diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index b7abc84c619ef..09103e79b8b2c 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1077,7 +1077,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_hash_find_ptr(&zobj->ce->properties_info, name); + zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); if (UNEXPECTED(prop_info->type)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } From f6209ee2cdd1d5de96d9729d772cfa511938eb0f Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Mon, 1 Oct 2018 16:44:29 +0200 Subject: [PATCH 335/369] Make all uninit access Error instead of TypeError & properly unmangle prop names --- .../typed_properties_002.phpt | 2 +- .../typed_properties_026.phpt | 2 +- .../typed_properties_069.phpt | 2 +- .../typed_properties_080.phpt | 6 +- .../typed_properties_083.phpt | 4 +- Zend/zend_compile.h | 6 ++ Zend/zend_execute.c | 47 ++++++-------- Zend/zend_object_handlers.c | 8 +-- Zend/zend_vm_def.h | 2 +- Zend/zend_vm_execute.h | 64 +++++++++---------- 10 files changed, 70 insertions(+), 73 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_002.phpt b/Zend/tests/type_declarations/typed_properties_002.phpt index facaee077e0b4..c4698d81e6027 100644 --- a/Zend/tests/type_declarations/typed_properties_002.phpt +++ b/Zend/tests/type_declarations/typed_properties_002.phpt @@ -9,7 +9,7 @@ $thing = new class() { var_dump($thing->int); ?> --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property class@anonymous::$int must not be accessed before initialization in %s:6 +Fatal error: Uncaught Error: Typed property class@anonymous::$int must not be accessed before initialization in %s:6 Stack trace: #0 {main} thrown in %s on line 6 diff --git a/Zend/tests/type_declarations/typed_properties_026.phpt b/Zend/tests/type_declarations/typed_properties_026.phpt index 250ea060508c3..d3b512f6f1849 100644 --- a/Zend/tests/type_declarations/typed_properties_026.phpt +++ b/Zend/tests/type_declarations/typed_properties_026.phpt @@ -16,7 +16,7 @@ class Baz{ var_dump((new Baz)->get()); --EXPECTF-- -Fatal error: Uncaught TypeError: Typed property Baz::$baz must not be accessed before initialization in %s:10 +Fatal error: Uncaught Error: Typed property Baz::$baz must not be accessed before initialization in %s:10 Stack trace: #0 %s(14): Baz->get() #1 {main} diff --git a/Zend/tests/type_declarations/typed_properties_069.phpt b/Zend/tests/type_declarations/typed_properties_069.phpt index fa1f60ce84614..fa71c07471e30 100644 --- a/Zend/tests/type_declarations/typed_properties_069.phpt +++ b/Zend/tests/type_declarations/typed_properties_069.phpt @@ -17,7 +17,7 @@ try { } catch (TypeError $e) { print $e->getMessage()."\n"; } try { var_dump(Foo::$i); -} catch (TypeError $e) { print $e->getMessage()."\n"; } +} catch (Error $e) { print $e->getMessage()."\n"; } var_dump(nonNumericStringRef()); ?> diff --git a/Zend/tests/type_declarations/typed_properties_080.phpt b/Zend/tests/type_declarations/typed_properties_080.phpt index 18f7a7cf3bd8b..ff4a2f33de671 100644 --- a/Zend/tests/type_declarations/typed_properties_080.phpt +++ b/Zend/tests/type_declarations/typed_properties_080.phpt @@ -11,17 +11,17 @@ class Test { static function run() { try { self::$a; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } try { self::$b; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } try { self::$c; - } catch (TypeError $e) { + } catch (Error $e) { echo $e->getMessage(), "\n"; } } diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index b4f70287103c6..638a72204a49a 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -20,7 +20,7 @@ try { } catch (TypeError $e) { var_dump($e->getMessage()); } try { // must be uninit var_dump($a->p); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (Error $e) { var_dump($e->getMessage()); } Foo::$a["bar"] = 2; var_dump(Foo::$a); @@ -30,7 +30,7 @@ try { } catch (TypeError $e) { var_dump($e->getMessage()); } try { // must be uninit var_dump(Foo::$s); -} catch (TypeError $e) { var_dump($e->getMessage()); } +} catch (Error $e) { var_dump($e->getMessage()); } Foo::$a = null; $ref = &Foo::$a; diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index f21257a6ece69..89f96100e456e 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -780,6 +780,12 @@ ZEND_API zend_string *zend_mangle_property_name(const char *src1, size_t src1_le zend_unmangle_property_name_ex(mangled_property, class_name, prop_name, NULL) ZEND_API int zend_unmangle_property_name_ex(const zend_string *name, const char **class_name, const char **prop_name, size_t *prop_len); +static zend_always_inline const char *zend_get_mangled_property_name(const zend_string *mangled_prop) { + const char *class_name, *prop_name; + zend_unmangle_property_name(mangled_prop, &class_name, &prop_name); + return prop_name; +} + #define ZEND_FUNCTION_DTOR zend_function_dtor #define ZEND_CLASS_DTOR destroy_zend_class diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 45611fbf97a65..8445ac32d4191 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -887,21 +887,17 @@ ZEND_COLD zend_never_inline void zend_verify_property_type_error(zend_property_i if (ZEND_TYPE_IS_CLASS(info->type)) { zend_type_error("Typed property %s::$%s must be an instance of %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), + zend_get_mangled_property_name(info->name), ZSTR_VAL(ZEND_TYPE_IS_CE(info->type) ? ZEND_TYPE_CE(info->type)->name : zend_resolve_property_type(ZEND_TYPE_NAME(info->type), info->ce)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } else { zend_type_error("Typed property %s::$%s must be %s%s, %s used", ZSTR_VAL(info->ce->name), - ZSTR_VAL(info->name), + zend_get_mangled_property_name(info->name), zend_get_type_by_const(ZEND_TYPE_CODE(info->type)), ZEND_TYPE_ALLOW_NULL(info->type) ? " or null" : "", - Z_TYPE_P(property) == IS_OBJECT ? - ZSTR_VAL(Z_OBJCE_P(property)->name) : - zend_get_type_by_const(Z_TYPE_P(property))); + Z_TYPE_P(property) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(property)->name) : zend_get_type_by_const(Z_TYPE_P(property))); } } @@ -1548,7 +1544,7 @@ static ZEND_COLD zend_bool zend_ref_verify_assign_incdec_double(zend_reference * zend_type_error("Cannot %screment a reference held by property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name), + zend_get_mangled_property_name(error_prop->name), ZEND_TYPE_ALLOW_NULL(error_prop->type) ? "?" : "", inc ? "max" : "min"); return 0; @@ -1601,7 +1597,7 @@ static void zend_pre_incdec_property_zval(zval *prop, zend_property_info *prop_i zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name), + zend_get_mangled_property_name(prop_info->name), ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", inc ? "max" : "min"); } @@ -1678,7 +1674,7 @@ static void zend_post_incdec_property_zval(zval *prop, zend_property_info *prop_ zend_type_error("Cannot %screment a property %s::$%s of type %sint past its %simal value", inc ? "in" : "de", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name), + zend_get_mangled_property_name(prop_info->name), ZEND_TYPE_ALLOW_NULL(prop_info->type) ? "?" : "", inc ? "max" : "min"); } @@ -2169,7 +2165,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); ZVAL_ERROR(result); } else { array_init(container); @@ -2518,7 +2514,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name)); + zend_get_mangled_property_name(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2527,7 +2523,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", ZSTR_VAL(prop_info->ce->name), - ZSTR_VAL(prop_info->name)); + zend_get_mangled_property_name(prop_info->name)); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); return; @@ -2669,11 +2665,9 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if ((fetch_type == BP_VAR_R || fetch_type == BP_VAR_RW) && UNEXPECTED(Z_TYPE_P(*retval) == IS_UNDEF) && UNEXPECTED(property_info->type != 0)) { - const char *class_name, *prop_name; - zend_unmangle_property_name_ex(property_info->name, &class_name, &prop_name, NULL); - zend_type_error("Typed static property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - prop_name); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } } else { @@ -2689,7 +2683,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { @@ -2697,7 +2691,7 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_info->name)); + zend_get_mangled_property_name(property_info->name)); return FAILURE; } if (UNEXPECTED(Z_ISUNDEF_P(ref))) { @@ -2738,17 +2732,14 @@ ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref } ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { - const char *class_name1, *class_name2, *prop_name1, *prop_name2; - zend_unmangle_property_name_ex(prop1->name, &class_name1, &prop_name1, NULL); - zend_unmangle_property_name_ex(prop2->name, &class_name2, &prop_name2, NULL); zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), - prop_name1, + zend_get_mangled_property_name(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - prop_name2, + zend_get_mangled_property_name(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); @@ -2758,7 +2749,7 @@ ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop->ce->name), - ZSTR_VAL(prop->name), + zend_get_mangled_property_name(prop->name), ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) ); @@ -2768,11 +2759,11 @@ ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), - ZSTR_VAL(prop1->name), + zend_get_mangled_property_name(prop1->name), ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), ZSTR_VAL(prop2->ce->name), - ZSTR_VAL(prop2->name), + zend_get_mangled_property_name(prop2->name), ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) ); diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 09103e79b8b2c..70ebac47d4221 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -761,7 +761,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void if ((type != BP_VAR_IS)) { if (UNEXPECTED(prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot))) { - zend_type_error("Typed property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed property %s::$%s must not be accessed before initialization", ZSTR_VAL(prop_info->ce->name), ZSTR_VAL(name)); } else { @@ -1078,7 +1078,7 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); - if (UNEXPECTED(prop_info->type)) { + if (UNEXPECTED(prop_info != NULL)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } } @@ -1484,9 +1484,9 @@ ZEND_API zval *zend_std_get_static_property_with_info(zend_class_entry *ce, zend if (UNEXPECTED((type == BP_VAR_R || type == BP_VAR_RW) && Z_TYPE_P(ret) == IS_UNDEF && property_info->type != 0)) { - zend_type_error("Typed static property %s::$%s must not be accessed before initialization", + zend_throw_error(NULL, "Typed static property %s::$%s must not be accessed before initialization", ZSTR_VAL(property_info->ce->name), - ZSTR_VAL(property_name)); + zend_get_mangled_property_name(property_name)); return NULL; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b168a1e3f3eb8..f0f03f455d1e1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2594,7 +2594,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6e2208d492c75..8540a7e028fcf 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26121,7 +26121,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26243,7 +26243,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26365,7 +26365,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26486,7 +26486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29058,7 +29058,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29180,7 +29180,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29302,7 +29302,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29423,7 +29423,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31042,7 +31042,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31164,7 +31164,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31286,7 +31286,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31407,7 +31407,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33596,7 +33596,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33718,7 +33718,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33840,7 +33840,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33961,7 +33961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46486,7 +46486,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -46608,7 +46608,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46730,7 +46730,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46851,7 +46851,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -50820,7 +50820,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50942,7 +50942,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51064,7 +51064,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51185,7 +51185,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -54095,7 +54095,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -54217,7 +54217,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54339,7 +54339,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54460,7 +54460,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -57717,7 +57717,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); @@ -57839,7 +57839,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57961,7 +57961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -58082,7 +58082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", ZSTR_VAL(error_prop->ce->name), - ZSTR_VAL(error_prop->name)); + zend_get_mangled_property_name(error_prop->name)); From d274d583d0ba7ce1c927eacedde4dfc213e7d4c7 Mon Sep 17 00:00:00 2001 From: Bob Weinand Date: Thu, 4 Oct 2018 10:50:27 +0200 Subject: [PATCH 336/369] Fix test --- Zend/zend_object_handlers.c | 2 +- ext/reflection/tests/ReflectionProperty_typed_static.phpt | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 957a7bd350f14..d4363a668fe91 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -744,7 +744,7 @@ ZEND_API zval *zend_std_read_property(zval *object, zval *member, int type, void } if (UNEXPECTED(ZEND_CLASS_HAS_TYPE_HINTS(zobj->ce) && - (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, cache_slot)))) { + (prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(object), name, IS_VALID_PROPERTY_OFFSET(property_offset) ? cache_slot : NULL)))) { zend_verify_prop_assignable_by_ref(prop_info, retval, (zobj->ce->__get->common.fn_flags & ZEND_ACC_STRICT_TYPES) != 0); } diff --git a/ext/reflection/tests/ReflectionProperty_typed_static.phpt b/ext/reflection/tests/ReflectionProperty_typed_static.phpt index cc69dd8230449..77f95d77ef08f 100644 --- a/ext/reflection/tests/ReflectionProperty_typed_static.phpt +++ b/ext/reflection/tests/ReflectionProperty_typed_static.phpt @@ -15,7 +15,7 @@ var_dump($rp->getValue()); $rp = new ReflectionProperty('Test', 'y'); try { var_dump($rp->getValue()); -} catch (TypeError $e) { +} catch (Error $e) { echo $e->getMessage(), "\n"; } From e231c31ebb5aa4f700fb4947a8481e4da175fadc Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 22 Nov 2018 17:12:18 +0100 Subject: [PATCH 337/369] Some opcache fixes Avoid writes into SHM memory. Some more work is needed for full support, e.g. we should try to resolve the types at least when preloading. --- ext/opcache/zend_accelerator_util_funcs.c | 8 ++++++++ ext/opcache/zend_persist.c | 20 +++++++++++++------- ext/opcache/zend_persist_calc.c | 20 +++++++++++++------- 3 files changed, 34 insertions(+), 14 deletions(-) diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index bf9eb08f7b6ba..309e02c47a34a 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -193,6 +193,14 @@ static void zend_hash_clone_prop_info(HashTable *ht) if (IN_ARENA(prop_info->ce)) { prop_info->ce = ARENA_REALLOC(prop_info->ce); } + + if (ZEND_TYPE_IS_CE(prop_info->type)) { + zend_class_entry *ce = ZEND_TYPE_CE(prop_info->type); + if (IN_ARENA(ce)) { + ce = ARENA_REALLOC(ce); + prop_info->type = ZEND_TYPE_ENCODE_CE(ce, ZEND_TYPE_ALLOW_NULL(prop_info->type)); + } + } } } } diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 99454d48a4f54..1dbe78abed156 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -747,13 +747,8 @@ static void zend_persist_property_info(zval *zv) } } - if (ZEND_TYPE_IS_CLASS(prop->type)) { - zend_string *class_name; - if (ZEND_TYPE_IS_CE(prop->type)) { - class_name = zend_string_copy(ZEND_TYPE_CE(prop->type)->name); - } else { - class_name = ZEND_TYPE_NAME(prop->type); - } + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); zend_accel_store_interned_string(class_name); prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); } @@ -797,6 +792,16 @@ static void zend_persist_class_constant(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -804,6 +809,7 @@ static void zend_persist_class_entry(zval *zv) if (ce->type == ZEND_USER_CLASS) { if ((ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) + && !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted) { ZCG(is_immutable_class) = 1; ce = Z_PTR_P(zv) = zend_shared_memdup_put(ce, sizeof(zend_class_entry)); diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 48c16ec8d3aa5..dbb204746fb5a 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -306,13 +306,8 @@ static void zend_persist_property_info_calc(zval *zv) zend_shared_alloc_register_xlat_entry(prop, prop); ADD_SIZE_EX(sizeof(zend_property_info)); ADD_INTERNED_STRING(prop->name, 0); - if (ZEND_TYPE_IS_CLASS(prop->type)) { - zend_string *class_name; - if (ZEND_TYPE_IS_CE(prop->type)) { - class_name = zend_string_copy(ZEND_TYPE_CE(prop->type)->name); - } else { - class_name = ZEND_TYPE_NAME(prop->type); - } + if (ZEND_TYPE_IS_NAME(prop->type)) { + zend_string *class_name = ZEND_TYPE_NAME(prop->type); ADD_INTERNED_STRING(class_name, 0); prop->type = ZEND_TYPE_ENCODE_CLASS(class_name, ZEND_TYPE_ALLOW_NULL(prop->type)); } @@ -336,6 +331,16 @@ static void zend_persist_class_constant_calc(zval *zv) } } +static zend_bool has_unresolved_property_types(zend_class_entry *ce) { + zend_property_info *prop; + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (ZEND_TYPE_IS_NAME(prop->type)) { + return 1; + } + } ZEND_HASH_FOREACH_END(); + return 0; +} + static void zend_persist_class_entry_calc(zval *zv) { zend_class_entry *ce = Z_PTR_P(zv); @@ -344,6 +349,7 @@ static void zend_persist_class_entry_calc(zval *zv) ZCG(is_immutable_class) = (ce->ce_flags & ZEND_ACC_LINKED) && (ce->ce_flags & ZEND_ACC_CONSTANTS_UPDATED) && + !has_unresolved_property_types(ce) && !ZCG(current_persistent_script)->corrupted; ADD_SIZE_EX(sizeof(zend_class_entry)); From 21e405ac3271e12a4a54ebec9f689c2349dbca2b Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Wed, 2 Jan 2019 15:34:46 +0100 Subject: [PATCH 338/369] Initialize unserialize_data refs --- ext/standard/var_unserializer.re | 1 + 1 file changed, 1 insertion(+) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index 1971126f9085a..ad80d4b1ce7fd 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -58,6 +58,7 @@ PHPAPI php_unserialize_data_t php_var_unserialize_init() { d->last = &d->entries; d->first_dtor = d->last_dtor = NULL; d->allowed_classes = NULL; + d->refs = NULL; d->entries.used_slots = 0; d->entries.next = NULL; if (!BG(serialize_lock)) { From 6a272242b57288c0aa2c7136e58a7c3d711bcd61 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 10:54:09 +0100 Subject: [PATCH 339/369] Check for type violations through implicit object init This is still missing handling for the reference case --- Zend/zend_compile.c | 6 +++- Zend/zend_compile.h | 6 +++- Zend/zend_execute.c | 67 +++++++++++++++++++++++++++++++++++------- Zend/zend_vm_def.h | 7 +++-- Zend/zend_vm_execute.h | 63 +++++++++++++++++++++++++++------------ 5 files changed, 117 insertions(+), 32 deletions(-) diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 31ae3793a6e1f..d27106cea0d57 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2582,7 +2582,11 @@ static zend_op *zend_delayed_compile_prop(znode *result, zend_ast *ast, uint32_t if (is_this_fetch(obj_ast)) { obj_node.op_type = IS_UNUSED; } else { - zend_delayed_compile_var(&obj_node, obj_ast, type, 0); + opline = zend_delayed_compile_var(&obj_node, obj_ast, type, 0); + if (opline && type == BP_VAR_W && (opline->opcode == ZEND_FETCH_STATIC_PROP_W || opline->opcode == ZEND_FETCH_OBJ_W)) { + opline->extended_value |= ZEND_FETCH_OBJ_WRITE; + } + zend_separate_if_call_and_write(&obj_node, obj_ast, type); } zend_compile_expr(&prop_node, prop_ast); diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index a8240846c0ec8..0c7333425b8ad 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -898,8 +898,12 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe +// TODO We only have 2 bits of flag space in the low bits, this won't work on +// 32-bit systems #define ZEND_FETCH_REF (1<<0) -#define ZEND_FETCH_DIM_WRITE (1<<1) +#define ZEND_FETCH_DIM_WRITE (1<<1) +#define ZEND_FETCH_OBJ_WRITE (1<<2) +#define ZEND_FETCH_OBJ_FLAGS (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_FETCH_OBJ_WRITE) #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 2f459ea62e6e2..69098b215a546 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2435,6 +2435,34 @@ static zend_never_inline uint32_t ZEND_FASTCALL zend_array_key_exists_slow(zval } } +static zend_always_inline zend_bool promotes_to_array(zval *val) { + return Z_TYPE_P(val) <= IS_FALSE + || (Z_ISREF_P(val) && Z_TYPE_P(Z_REFVAL_P(val)) <= IS_FALSE); +} + +static zend_always_inline zend_bool promotes_to_object(zval *val) { + ZVAL_DEREF(val); + return Z_TYPE_P(val) <= IS_FALSE + || (Z_TYPE_P(val) == IS_STRING && Z_STRLEN_P(val) == 0); +} + +static zend_always_inline zend_bool check_type_array_assignable(zend_type type) { + return ZEND_TYPE_IS_CODE(type) + && (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE); +} + +static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type type) { + if (ZEND_TYPE_IS_CLASS(type)) { + if (ZEND_TYPE_IS_CE(type)) { + return ZEND_TYPE_CE(type) == zend_standard_class_def; + } else { + return zend_string_equals_literal_ci(ZEND_TYPE_NAME(type), "stdclass"); + } + } else { + return ZEND_TYPE_CODE(type) == IS_OBJECT; + } +} + static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags OPLINE_DC) { zval *ptr; @@ -2466,10 +2494,13 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - if (flags - && (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) - && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) - || ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))))) { + // TODO IS_STRING check here looks wrong. + if (flags && + (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && + (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || + ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || + ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) + ) { zend_property_info *prop_info; if (prop_op_type == IS_CONST) { @@ -2480,8 +2511,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { - if ((flags & ZEND_FETCH_DIM_WRITE) && (Z_TYPE_P(ptr) <= IS_FALSE || (Z_ISREF_P(ptr) && Z_TYPE_P(Z_REFVAL_P(ptr)) == IS_NULL))) { - if (!zend_verify_type_assignable(prop_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { + if (!check_type_array_assignable(prop_info->type)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(prop_info->ce->name), zend_get_mangled_property_name(prop_info->name)); @@ -2490,6 +2521,16 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } return; } + if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { + if (!check_type_stdClass_assignable(prop_info->type)) { + zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + ZSTR_VAL(prop_info->ce->name), + zend_get_mangled_property_name(prop_info->name)); + ZVAL_UNDEF(ptr); + ZVAL_ERROR(result); + } + return; + } if (!ZEND_TYPE_ALLOW_NULL(prop_info->type) && Z_TYPE_P(ptr) == IS_NULL) { zend_throw_error(NULL, "Cannot access uninitialized non-nullable property %s::$%s by reference", ZSTR_VAL(prop_info->ce->name), @@ -2635,14 +2676,20 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) - && (Z_TYPE_P(*retval) <= IS_FALSE || (Z_ISREF_P(*retval) && Z_TYPE_P(Z_REFVAL_P(*retval)) == IS_NULL)) - && !zend_verify_type_assignable(property_info->type, IS_ARRAY)) { + if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) + && !check_type_array_assignable(property_info->type)) { zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", ZSTR_VAL(property_info->ce->name), zend_get_mangled_property_name(property_info->name)); return FAILURE; } + if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) + && !check_type_stdClass_assignable(property_info->type)) { + zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + ZSTR_VAL(property_info->ce->name), + zend_get_mangled_property_name(property_info->name)); + return FAILURE; + } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { @@ -2677,7 +2724,7 @@ static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable( } ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (ZEND_TYPE_IS_CLASS(prop->type) || (ZEND_TYPE_CODE(prop->type) != IS_ITERABLE && ZEND_TYPE_CODE(prop->type) != IS_ARRAY)) { + if (!check_type_array_assignable(prop->type)) { return prop; } } ZEND_REF_FOREACH_TYPE_SOURCES_END(); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 74b34b57e77c2..b07a664ae1e52 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1794,7 +1794,7 @@ ZEND_VM_HELPER(zend_fetch_static_prop_helper, CONST|TMPVAR|CV, UNUSED|CONST|VAR, SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -2101,7 +2101,10 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, FETCH property = GET_OP2_ZVAL_PTR(BP_VAR_R); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, OP1_TYPE, property, OP2_TYPE, + ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); FREE_OP2(); if (OP1_TYPE == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 6553cb8f1ef5f..24ebb18ec57af 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4652,7 +4652,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -8521,7 +8521,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -9438,7 +9438,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -14789,7 +14789,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -17492,7 +17492,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -18170,7 +18170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -25483,7 +25483,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CONST_HAN property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -28384,7 +28387,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_TMPVAR_HA property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -32888,7 +32894,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_VAR_CV_HANDLE property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_VAR, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_VAR, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_VAR == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -35540,7 +35549,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CONST_ property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -37529,7 +37541,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_TMPVAR property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -40165,7 +40180,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_UNUSED_CV_HAN property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_UNUSED, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_UNUSED, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_UNUSED == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -44982,7 +45000,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -45265,7 +45283,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CONST_HAND property = RT_CONSTANT(opline, opline->op2); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CONST, ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, IS_CONST, + ((IS_CONST == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -49848,7 +49869,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_TMPVAR_HAN property = _get_zval_ptr_var(opline->op2.var, &free_op2 EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, (IS_TMP_VAR|IS_VAR), + (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); zval_ptr_dtor_nogc(free_op2); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); @@ -52191,7 +52215,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -53469,7 +53493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_fetch_static_prop_helper_SPEC_ SAVE_OPLINE(); - if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE), type, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { + if (UNEXPECTED(zend_fetch_static_property_address(&prop, NULL, opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS, type, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC EXECUTE_DATA_CC) != SUCCESS)) { if (EG(exception)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); HANDLE_EXCEPTION(); @@ -56732,7 +56756,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_FETCH_OBJ_W_SPEC_CV_CV_HANDLER property = _get_zval_ptr_cv_BP_VAR_R(opline->op2.var EXECUTE_DATA_CC); result = EX_VAR(opline->result.var); - zend_fetch_property_address(result, container, IS_CV, property, IS_CV, ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)) : NULL), BP_VAR_W, opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE) OPLINE_CC); + zend_fetch_property_address( + result, container, IS_CV, property, IS_CV, + ((IS_CV == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) : NULL), + BP_VAR_W, opline->extended_value & ZEND_FETCH_OBJ_FLAGS OPLINE_CC); if (IS_CV == IS_VAR) { FREE_VAR_PTR_AND_EXTRACT_RESULT_IF_NECESSARY(free_op1, result); From 25a517c22eb96614a3d016fa97b224ed9900c1a6 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:02:50 +0100 Subject: [PATCH 340/369] Handle the reference case as well --- Zend/zend_execute.c | 140 ++++++---- Zend/zend_vm_def.h | 36 ++- Zend/zend_vm_execute.h | 567 ++++++++++++++++++----------------------- 3 files changed, 365 insertions(+), 378 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 69098b215a546..f1ec398644668 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -634,16 +634,20 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 1; } +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref); + /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_object *obj; + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); @@ -661,8 +665,23 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; + } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + ZSTR_VAL(error_prop->ce->name), + zend_get_mangled_property_name(error_prop->name)); + if (RETURN_VALUE_USED(opline)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } } + + zval_ptr_dtor_nogc(object); object_init(object); Z_ADDREF_P(object); obj = Z_OBJ_P(object); @@ -673,29 +692,47 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); } - return 0; + return NULL; } Z_DELREF_P(object); - return 1; + return object; } -static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) +static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval *object, zval *property OPLINE_DC) { - if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { - /* nothing to destroy */ - } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { - zval_ptr_dtor_nogc(object); - } else { + zval *ref = NULL; + if (Z_ISREF_P(object)) { + ref = object; + object = Z_REFVAL_P(object); + } + + if (UNEXPECTED(Z_TYPE_P(object) > IS_FALSE && + (Z_TYPE_P(object) != IS_STRING || Z_STRLEN_P(object) != 0))) { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name)); zend_tmp_string_release(tmp_property_name); } - return 0; + return NULL; + } + + if (ref) { + zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); + if (error_prop) { + zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + ZSTR_VAL(error_prop->ce->name), + zend_get_mangled_property_name(error_prop->name)); + if (RETURN_VALUE_USED(opline)) { + ZVAL_UNDEF(EX_VAR(opline->result.var)); + } + return NULL; + } } + + zval_ptr_dtor_nogc(object); object_init(object); - return 1; + return object; } static ZEND_COLD void zend_verify_type_error_common( @@ -2463,22 +2500,59 @@ static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type typ } } +/* Checks whether an array can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_array_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +/* Checks whether an stdClass can be assigned to the reference. Returns conflicting property if + * assignment is not possible, NULL otherwise. */ +static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref) { + zend_property_info *prop; + if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { + return NULL; + } + ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { + if (!check_type_stdClass_assignable(prop->type)) { + return prop; + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + return NULL; +} + +ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { + return i_zend_check_ref_array_assignable(ref); +} + static zend_always_inline void zend_fetch_property_address(zval *result, zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, void **cache_slot, int type, uint32_t flags OPLINE_DC) { zval *ptr; if (container_op_type != IS_UNUSED && UNEXPECTED(Z_TYPE_P(container) != IS_OBJECT)) { do { - if (Z_ISREF_P(container)) { + if (Z_ISREF_P(container) && Z_TYPE_P(Z_REFVAL_P(container)) == IS_OBJECT) { container = Z_REFVAL_P(container); - if (EXPECTED(Z_TYPE_P(container) == IS_OBJECT)) { - break; - } + break; } /* this should modify object only if it's empty */ - if (type == BP_VAR_UNSET || - UNEXPECTED(!make_real_object_rw(container, prop_ptr OPLINE_CC))) { + if (type == BP_VAR_UNSET) { + return; + } + + + container = make_real_object_rw(container, prop_ptr OPLINE_CC); + if (UNEXPECTED(!container)) { ZVAL_ERROR(result); return; } @@ -2715,26 +2789,6 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, return SUCCESS; } -/* Checks whether an array can be assigned to the reference. Returns conflicting property if - * assignment is not possible, NULL otherwise. */ -static zend_always_inline zend_property_info *i_zend_check_ref_array_assignable(zend_reference *ref) { - zend_property_info *prop; - if (!ZEND_REF_HAS_TYPE_SOURCES(ref)) { - return NULL; - } - - ZEND_REF_FOREACH_TYPE_SOURCES(ref, prop) { - if (!check_type_array_assignable(prop->type)) { - return prop; - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); - return NULL; -} - -ZEND_API zend_property_info *zend_check_ref_array_assignable(zend_reference *ref) { - return i_zend_check_ref_array_assignable(ref); -} - ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b07a664ae1e52..3913c67ea7f9d 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -821,13 +821,12 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_op_object); - } + ZEND_VM_C_GOTO(assign_op_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -1225,13 +1224,12 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(pre_incdec_object); - } + ZEND_VM_C_GOTO(pre_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -1295,13 +1293,12 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, do { if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(post_incdec_object); - } + ZEND_VM_C_GOTO(post_incdec_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -2314,13 +2311,12 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, CACHE value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - ZEND_VM_C_GOTO(assign_object); - } + ZEND_VM_C_GOTO(assign_object); } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { FREE_OP_DATA(); ZEND_VM_C_GOTO(exit_assign_obj); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 24ebb18ec57af..5e1ecf96994d0 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -24602,13 +24602,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25286,13 +25285,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25355,13 +25353,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -25592,13 +25589,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -25727,13 +25723,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25862,13 +25857,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25997,13 +25991,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -27502,13 +27495,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28188,13 +28180,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28258,13 +28249,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -28497,13 +28487,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -28632,13 +28621,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -28767,13 +28755,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -28902,13 +28889,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -32164,13 +32150,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -32697,13 +32682,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -32766,13 +32750,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -33003,13 +32986,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -33138,13 +33120,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33273,13 +33254,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33408,13 +33388,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_VAR != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35132,13 +35111,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35317,13 +35295,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35386,13 +35363,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -35725,13 +35701,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -35860,13 +35835,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35995,13 +35969,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -36130,13 +36103,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -37122,13 +37094,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37307,13 +37278,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37377,13 +37347,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -37717,13 +37686,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -37852,13 +37820,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -37987,13 +37954,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -38122,13 +38088,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -39763,13 +39728,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -39948,13 +39912,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -40017,13 +39980,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -40356,13 +40318,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -40491,13 +40452,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40626,13 +40586,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40761,13 +40720,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -44137,13 +44095,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -44821,13 +44778,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -44890,13 +44846,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -45459,13 +45414,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -45594,13 +45548,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -45729,13 +45682,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -45864,13 +45816,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -48833,13 +48784,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -49519,13 +49469,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -49589,13 +49538,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -50045,13 +49993,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -50180,13 +50127,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -50315,13 +50261,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -50450,13 +50395,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -55875,13 +55819,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_binary_assign_op_obj_helper_SP value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_op_object; - } + goto assign_op_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56408,13 +56351,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_pre_incdec_property_helper_SPE do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto pre_incdec_object; - } + goto pre_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56477,13 +56419,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL zend_post_incdec_property_helper_SP do { if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto post_incdec_object; - } + goto post_incdec_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { break; } } @@ -56932,13 +56873,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } @@ -57067,13 +57007,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -57202,13 +57141,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -57337,13 +57275,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (IS_CV != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { - if (Z_ISREF_P(object)) { + if (Z_ISREF_P(object) && Z_TYPE_P(Z_REFVAL_P(object)) == IS_OBJECT) { object = Z_REFVAL_P(object); - if (EXPECTED(Z_TYPE_P(object) == IS_OBJECT)) { - goto assign_object; - } + goto assign_object; } - if (UNEXPECTED(!make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC))) { + object = make_real_object(object, property OPLINE_CC EXECUTE_DATA_CC); + if (UNEXPECTED(!object)) { goto exit_assign_obj; } From cca6c1c20746e7bcb7ed78ad13d7285a02d65be9 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:08:27 +0100 Subject: [PATCH 341/369] Remove incorrect string check, add tests --- .../typed_properties_091.phpt | 166 ++++++++++++++++++ Zend/zend_execute.c | 2 - 2 files changed, 166 insertions(+), 2 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_091.phpt diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt new file mode 100644 index 0000000000000..cda0a8be85f1d --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -0,0 +1,166 @@ +--TEST-- +Automatic promotion of falsy to object +--FILE-- +prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$test->stdProp->wat = 123; +$test->objectProp->wat = 123; +var_dump($test); + +// Object properties via reference +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat = 123; +$objectProp->wat = 123; +var_dump($test); + +// Object properties via reference rw +$test = new Test; +$prop =& $test->prop; +$stdProp =& $test->stdProp; +$objectProp =& $test->objectProp; +try { + $prop->wat->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +$stdProp->wat->wat = 123; +$objectProp->wat->wat = 123; +var_dump($test); + +// Static properties +try { + Test::$staticProp->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +Test::$staticStdProp->wat = 123; +Test::$staticObjectProp->wat = 123; +var_dump(Test::$staticProp, Test::$staticStdProp, Test::$staticObjectProp); + +// Non-string property name +$test = new Test; +$propName = new class { + public function __toString() { + return 'prop'; + } +}; +try { + $test->$propName->wat = 123; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +?> +--EXPECTF-- +Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#1 (2) { + ["prop"]=> + uninitialized(?Test) + ["stdProp"]=> + object(stdClass)#3 (1) { + ["wat"]=> + int(123) + } + ["objectProp"]=> + object(stdClass)#4 (1) { + ["wat"]=> + int(123) + } +} +Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#5 (3) { + ["prop"]=> + &NULL + ["stdProp"]=> + &object(stdClass)#2 (1) { + ["wat"]=> + int(123) + } + ["objectProp"]=> + &object(stdClass)#4 (1) { + ["wat"]=> + int(123) + } +} +Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass + +Warning: Creating default object from empty value in %s on line %d + +Warning: Creating default object from empty value in %s on line %d +object(Test)#3 (3) { + ["prop"]=> + &NULL + ["stdProp"]=> + &object(stdClass)#1 (1) { + ["wat"]=> + object(stdClass)#2 (1) { + ["wat"]=> + int(123) + } + } + ["objectProp"]=> + &object(stdClass)#5 (1) { + ["wat"]=> + object(stdClass)#6 (1) { + ["wat"]=> + int(123) + } + } +} +Cannot write an stdClass to a null property Test::$staticProp which does not allow for stdClass + +Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 + +Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 59 +NULL +object(stdClass)#4 (1) { + ["wat"]=> + int(123) +} +object(stdClass)#8 (1) { + ["wat"]=> + int(123) +} +Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +object(Test)#9 (0) { + ["prop"]=> + uninitialized(?Test) + ["stdProp"]=> + uninitialized(?stdClass) + ["objectProp"]=> + uninitialized(?object) +} diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index f1ec398644668..b4f263b4bd80f 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2568,9 +2568,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (EXPECTED(Z_TYPE_P(ptr) != IS_UNDEF)) { return_indirect: ZVAL_INDIRECT(result, ptr); - // TODO IS_STRING check here looks wrong. if (flags && - (prop_op_type == IS_CONST || EXPECTED(Z_TYPE_P(prop_ptr) == IS_STRING)) && (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) From 373579c1a3bf5517af3acbb3c816976a02575a57 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:11:46 +0100 Subject: [PATCH 342/369] Check for no type in "type_assignable" functions --- Zend/zend_execute.c | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index b4f263b4bd80f..d62c293a7df83 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2484,11 +2484,17 @@ static zend_always_inline zend_bool promotes_to_object(zval *val) { } static zend_always_inline zend_bool check_type_array_assignable(zend_type type) { + if (!type) { + return 1; + } return ZEND_TYPE_IS_CODE(type) && (ZEND_TYPE_CODE(type) == IS_ARRAY || ZEND_TYPE_CODE(type) == IS_ITERABLE); } static zend_always_inline zend_bool check_type_stdClass_assignable(zend_type type) { + if (!type) { + return 1; + } if (ZEND_TYPE_IS_CLASS(type)) { if (ZEND_TYPE_IS_CE(type)) { return ZEND_TYPE_CE(type) == zend_standard_class_def; From 92cfec9e36a1b3edef6c162256ddf258a7e85584 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:39:19 +0100 Subject: [PATCH 343/369] Improve auto-initialization related error messages Also add a zend_format_type helper to unify type formatting. --- .../typed_properties_083.phpt | 8 +- .../typed_properties_091.phpt | 10 +- Zend/zend_execute.c | 86 +++++-- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 224 +++++++++++++----- 5 files changed, 236 insertions(+), 99 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index 638a72204a49a..91aed8b4b27eb 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,19 +54,19 @@ array(1) { [0]=> int(1) } -string(79) "Cannot write an array to a null property Foo::$p which does not allow for array" +string(72) "Cannot auto-initialize and array inside property Foo::$p of type ?string" string(65) "Typed property Foo::$p must not be accessed before initialization" array(1) { ["bar"]=> int(2) } -string(79) "Cannot write an array to a null property Foo::$s which does not allow for array" +string(71) "Cannot auto-initialize an array inside property Foo::$s of type ?string" string(72) "Typed static property Foo::$s must not be accessed before initialization" array(1) { [0]=> int(3) } -string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" +string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string" NULL -string(97) "Cannot write an array to a null or false reference held by Foo::$p which does not allow for array" +string(91) "Cannot auto-initialize an array inside a reference held by property Foo::$p of type ?string" NULL diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt index cda0a8be85f1d..47dc8b7f2460e 100644 --- a/Zend/tests/type_declarations/typed_properties_091.phpt +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -78,7 +78,7 @@ var_dump($test); ?> --EXPECTF-- -Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test Warning: Creating default object from empty value in %s on line %d @@ -97,7 +97,7 @@ object(Test)#1 (2) { int(123) } } -Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test Warning: Creating default object from empty value in %s on line %d @@ -116,7 +116,7 @@ object(Test)#5 (3) { int(123) } } -Cannot write an stdClass to a null or false reference held by Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside a reference held by property Test::$prop of type ?Test Warning: Creating default object from empty value in %s on line %d @@ -141,7 +141,7 @@ object(Test)#3 (3) { } } } -Cannot write an stdClass to a null property Test::$staticProp which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 @@ -155,7 +155,7 @@ object(stdClass)#8 (1) { ["wat"]=> int(123) } -Cannot write an stdClass to a null property Test::$prop which does not allow for stdClass +Cannot auto-initialize an stdClass inside property Test::$prop of type ?Test object(Test)#9 (0) { ["prop"]=> uninitialized(?Test) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index d62c293a7df83..affb6d1cb82bf 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -636,6 +636,20 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z static zend_always_inline zend_property_info *i_zend_check_ref_stdClass_assignable(zend_reference *ref); +static void zend_format_type(zend_type type, const char **part1, const char **part2) { + *part1 = ZEND_TYPE_ALLOW_NULL(type) ? "?" : ""; + if (ZEND_TYPE_IS_CLASS(type)) { + if (ZEND_TYPE_IS_CE(type)) { + *part2 = ZSTR_VAL(ZEND_TYPE_CE(type)->name); + } else { + *part2 = ZSTR_VAL(ZEND_TYPE_NAME(type)); + } + } else { + *part2 = zend_get_type_by_const(ZEND_TYPE_CODE(type)); + } +} + + /* this should modify object only if it's empty */ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { @@ -671,9 +685,12 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -720,9 +737,12 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - zend_type_error("Cannot write an stdClass to a null or false reference held by %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -2137,9 +2157,12 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); ZVAL_ERROR(result); } else { array_init(container); @@ -2591,9 +2614,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { - zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(prop_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize and array inside property %s::$%s of type %s%s", ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name)); + zend_get_mangled_property_name(prop_info->name), + prop_type1, prop_type2); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2601,9 +2627,12 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { - zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(prop_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name)); + zend_get_mangled_property_name(prop_info->name), + prop_type1, prop_type2); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2756,16 +2785,22 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { - zend_type_error("Cannot write an array to a null property %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(property_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside property %s::$%s of type %s%s", ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name)); + zend_get_mangled_property_name(property_info->name), + prop_type1, prop_type2); return FAILURE; } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { - zend_type_error("Cannot write an stdClass to a null property %s::$%s which does not allow for stdClass", + const char *prop_type1, *prop_type2; + zend_format_type(property_info->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name)); + zend_get_mangled_property_name(property_info->name), + prop_type1, prop_type2); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { @@ -2794,40 +2829,43 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } ZEND_API ZEND_COLD void zend_throw_ref_type_error_type(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2; + zend_format_type(prop1->type, &prop1_type1, &prop1_type2); + zend_format_type(prop2->type, &prop2_type1, &prop2_type2); zend_type_error("Reference with value of type %s held by property %s::$%s of type %s%s is not compatible with property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), zend_get_mangled_property_name(prop1->name), - ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + prop1_type1, prop1_type2, ZSTR_VAL(prop2->ce->name), zend_get_mangled_property_name(prop2->name), - ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + prop2_type1, prop2_type2 ); } ZEND_API ZEND_COLD void zend_throw_ref_type_error_zval(zend_property_info *prop, zval *zv) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop->ce->name), zend_get_mangled_property_name(prop->name), - ZEND_TYPE_ALLOW_NULL(prop->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop->type)) + prop_type1, prop_type2 ); } ZEND_API ZEND_COLD void zend_throw_conflicting_coercion_error(zend_property_info *prop1, zend_property_info *prop2, zval *zv) { + const char *prop1_type1, *prop1_type2, *prop2_type1, *prop2_type2; + zend_format_type(prop1->type, &prop1_type1, &prop1_type2); + zend_format_type(prop2->type, &prop2_type1, &prop2_type2); zend_type_error("Cannot assign %s to reference held by property %s::$%s of type %s%s and property %s::$%s of type %s%s, as this would result in an inconsistent type conversion", Z_TYPE_P(zv) == IS_OBJECT ? ZSTR_VAL(Z_OBJCE_P(zv)->name) : zend_get_type_by_const(Z_TYPE_P(zv)), ZSTR_VAL(prop1->ce->name), zend_get_mangled_property_name(prop1->name), - ZEND_TYPE_ALLOW_NULL(prop1->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop1->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop1->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop1->type)), + prop1_type1, prop1_type2, ZSTR_VAL(prop2->ce->name), zend_get_mangled_property_name(prop2->name), - ZEND_TYPE_ALLOW_NULL(prop2->type) ? "?" : "", - ZEND_TYPE_IS_CLASS(prop2->type) ? ZSTR_VAL(ZEND_TYPE_CE(prop2->type)->name) : zend_get_type_by_const(ZEND_TYPE_CODE(prop2->type)) + prop2_type1, prop2_type2 ); } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index e7a1551399d79..98f8851c55011 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2580,9 +2580,12 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 75d29278ba6a3..099e6e79f54b2 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26192,9 +26192,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26314,9 +26317,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26436,9 +26442,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26557,9 +26566,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29090,9 +29102,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29212,9 +29227,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29334,9 +29352,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29455,9 +29476,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31066,9 +31090,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31188,9 +31215,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31310,9 +31340,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31431,9 +31464,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33589,9 +33625,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33711,9 +33750,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33833,9 +33875,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33954,9 +33999,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46285,9 +46333,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -46407,9 +46458,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46529,9 +46583,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46650,9 +46707,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -50596,9 +50656,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50718,9 +50781,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50840,9 +50906,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50961,9 +51030,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -53889,9 +53961,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -54011,9 +54086,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54133,9 +54211,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54254,9 +54335,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -57476,9 +57560,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); @@ -57598,9 +57685,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57720,9 +57810,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57841,9 +57934,12 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - zend_type_error("Cannot write an array to a null or false reference held by %s::$%s which does not allow for array", + const char *prop_type1, *prop_type2; + zend_format_type(error_prop->type, &prop_type1, &prop_type2); + zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name)); + zend_get_mangled_property_name(error_prop->name), + prop_type1, prop_type2); From ac1ac47ad7d82d889fc594b3c7117fcbe9bebda3 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:55:51 +0100 Subject: [PATCH 344/369] Extract auto-init errors into cold helpers Also fixing a typo in one of the many cases where this was copy&pasted. --- .../typed_properties_083.phpt | 2 +- Zend/zend_execute.c | 71 +++--- Zend/zend_vm_def.h | 7 +- Zend/zend_vm_execute.h | 224 +++--------------- 4 files changed, 63 insertions(+), 241 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_083.phpt b/Zend/tests/type_declarations/typed_properties_083.phpt index 91aed8b4b27eb..6d34cd7d6d3bd 100644 --- a/Zend/tests/type_declarations/typed_properties_083.phpt +++ b/Zend/tests/type_declarations/typed_properties_083.phpt @@ -54,7 +54,7 @@ array(1) { [0]=> int(1) } -string(72) "Cannot auto-initialize and array inside property Foo::$p of type ?string" +string(71) "Cannot auto-initialize an array inside property Foo::$p of type ?string" string(65) "Typed property Foo::$p must not be accessed before initialization" array(1) { ["bar"]=> diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index affb6d1cb82bf..442ec51c8a9cb 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -649,6 +649,28 @@ static void zend_format_type(zend_type type, const char **part1, const char **pa } } +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_prop_error(zend_property_info *prop, const char *type) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error( + "Cannot auto-initialize an %s inside property %s::$%s of type %s%s", + type, + ZSTR_VAL(prop->ce->name), zend_get_mangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + +static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_property_info *prop, const char *type) { + const char *prop_type1, *prop_type2; + zend_format_type(prop->type, &prop_type1, &prop_type2); + zend_type_error( + "Cannot auto-initialize an %s inside a reference held by property %s::$%s of type %s%s", + type, + ZSTR_VAL(prop->ce->name), zend_get_mangled_property_name(prop->name), + prop_type1, prop_type2 + ); +} + /* this should modify object only if it's empty */ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) @@ -685,12 +707,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -737,12 +754,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval if (ref) { zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); if (RETURN_VALUE_USED(opline)) { ZVAL_UNDEF(EX_VAR(opline->result.var)); } @@ -2157,12 +2169,7 @@ static zend_always_inline void zend_fetch_dimension_address(zval *result, zval * if (type != BP_VAR_UNSET) { zend_property_info *error_prop; if (UNEXPECTED(orig_container != container) && Z_ISREF_P(orig_container) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_container))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); ZVAL_ERROR(result); } else { array_init(container); @@ -2614,12 +2621,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c if (UNEXPECTED(prop_info)) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(prop_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize and array inside property %s::$%s of type %s%s", - ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(prop_info, "array"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2627,12 +2629,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(prop_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", - ZSTR_VAL(prop_info->ce->name), - zend_get_mangled_property_name(prop_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(prop_info, "stdClass"); ZVAL_UNDEF(ptr); ZVAL_ERROR(result); } @@ -2785,22 +2782,12 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, if (flags) { if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(property_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside property %s::$%s of type %s%s", - ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(property_info, "array"); return FAILURE; } if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { - const char *prop_type1, *prop_type2; - zend_format_type(property_info->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an stdClass inside property %s::$%s of type %s%s", - ZSTR_VAL(property_info->ce->name), - zend_get_mangled_property_name(property_info->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_prop_error(property_info, "stdClass"); return FAILURE; } if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 98f8851c55011..0c94db72c578b 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2580,12 +2580,7 @@ ZEND_VM_C_LABEL(try_assign_dim_array): } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); FREE_UNFETCHED_OP2(); FREE_UNFETCHED_OP_DATA(); FREE_OP1_VAR_PTR(); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 099e6e79f54b2..c6a39f4b6b573 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26192,12 +26192,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26317,12 +26312,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26442,12 +26432,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -26566,12 +26551,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CONST_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29102,12 +29082,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29227,12 +29202,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29352,12 +29322,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -29476,12 +29441,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_TMPVAR_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31090,12 +31050,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31215,12 +31170,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31340,12 +31290,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -31464,12 +31409,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_UNUSED_OP_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33625,12 +33565,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33750,12 +33685,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33875,12 +33805,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -33999,12 +33924,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_VAR_CV_OP_DATA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; @@ -46333,12 +46253,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -46458,12 +46373,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46583,12 +46493,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -46707,12 +46612,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CONST_OP_DA } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -50656,12 +50556,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -50781,12 +50676,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -50906,12 +50796,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -51030,12 +50915,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_TMPVAR_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR(opline->op2.var)); @@ -53961,12 +53841,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -54086,12 +53961,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54211,12 +54081,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -54335,12 +54200,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_UNUSED_OP_D } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -57560,12 +57420,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); @@ -57685,12 +57540,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57810,12 +57660,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); zval_ptr_dtor_nogc(EX_VAR((opline+1)->op1.var)); @@ -57934,12 +57779,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_DIM_SPEC_CV_CV_OP_DATA_ } else if (EXPECTED(Z_TYPE_P(object_ptr) <= IS_FALSE)) { zend_property_info *error_prop; if (Z_ISREF_P(orig_object_ptr) && (error_prop = zend_check_ref_array_assignable(Z_REF_P(orig_object_ptr))) != NULL) { - const char *prop_type1, *prop_type2; - zend_format_type(error_prop->type, &prop_type1, &prop_type2); - zend_type_error("Cannot auto-initialize an array inside a reference held by property %s::$%s of type %s%s", - ZSTR_VAL(error_prop->ce->name), - zend_get_mangled_property_name(error_prop->name), - prop_type1, prop_type2); + zend_throw_auto_init_in_ref_error(error_prop, "array"); From 0311fc5f7d1677cde5c96c8e71d02e35daea14b4 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 12:57:59 +0100 Subject: [PATCH 345/369] Remove hardcoded path in test --- Zend/tests/type_declarations/typed_properties_091.phpt | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_091.phpt b/Zend/tests/type_declarations/typed_properties_091.phpt index 47dc8b7f2460e..6b3f19fd356e2 100644 --- a/Zend/tests/type_declarations/typed_properties_091.phpt +++ b/Zend/tests/type_declarations/typed_properties_091.phpt @@ -143,9 +143,9 @@ object(Test)#3 (3) { } Cannot auto-initialize an stdClass inside property Test::$staticProp of type ?Test -Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 58 +Warning: Creating default object from empty value in %s on line %d -Warning: Creating default object from empty value in /home/nikic/php-src-refs/Zend/tests/type_declarations/typed_properties_091.php on line 59 +Warning: Creating default object from empty value in %s on line %d NULL object(stdClass)#4 (1) { ["wat"]=> From 6574e7f59d79f84caa0ff2a6e3cfe408dcb4347e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 13:11:18 +0100 Subject: [PATCH 346/369] Handle all FETCH_OBJ flags in opcache --- ext/opcache/Optimizer/compact_literals.c | 14 +++++++------- ext/opcache/Optimizer/zend_optimizer.c | 6 +++--- 2 files changed, 10 insertions(+), 10 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index a062456bb6430..2df84c8539dcb 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -615,12 +615,12 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx // op2 property if (opline->op1_type == IS_UNUSED && property_slot[opline->op2.constant] >= 0) { - opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); + opline->extended_value = property_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); cache_size += 3 * sizeof(void *); if (opline->op1_type == IS_UNUSED) { - property_slot[opline->op2.constant] = opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE); + property_slot[opline->op2.constant] = opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS; } } } @@ -745,17 +745,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + &cache_size) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = class_slot[opline->op2.constant] | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } else { - opline->extended_value = cache_size | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = cache_size | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 0d44a7bc13eb6..0e18a2dd91c05 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -351,10 +351,10 @@ int zend_optimizer_update_op1_const(zend_op_array *op_array, case ZEND_POST_DEC_STATIC_PROP: TO_STRING_NOWARN(val); opline->op1.constant = zend_optimizer_add_literal(op_array, val); - if (opline->op2_type == IS_CONST && (opline->extended_value & ~(ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)) + sizeof(void*) == op_array->cache_size) { + if (opline->op2_type == IS_CONST && (opline->extended_value & ~ZEND_FETCH_OBJ_FLAGS) + sizeof(void*) == op_array->cache_size) { op_array->cache_size += sizeof(void *); } else { - opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 3) | (opline->extended_value & ZEND_FETCH_OBJ_FLAGS); } break; case ZEND_SEND_VAR: @@ -445,7 +445,7 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, opline->op2.constant = zend_optimizer_add_literal(op_array, val); zend_optimizer_add_literal_string(op_array, zend_string_tolower(Z_STR_P(val))); if (opline->op1_type != IS_CONST) { - opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_ISEMPTY)); + opline->extended_value = alloc_cache_slots(op_array, 1) | (opline->extended_value & (ZEND_RETURNS_FUNCTION|ZEND_ISEMPTY|ZEND_FETCH_OBJ_FLAGS)); } break; case ZEND_INIT_FCALL: From d44a513f83a6c6be1d5cb79408a412f5990bfc1c Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 14:39:51 +0100 Subject: [PATCH 347/369] Fix static prop ref sources memory leak under opcache We also have to remove ref sources for the immutable class case. --- Zend/zend_opcode.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index 2163a203befc0..c38ea0855c7e6 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -148,6 +148,15 @@ ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce) ZEND_MAP_PTR_SET(ce->static_members_table, NULL); while (p != end) { + if (UNEXPECTED(Z_ISREF_P(p))) { + zend_property_info *prop_info; + ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { + if (prop_info->ce == ce && p - static_members == prop_info->offset) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + break; /* stop iteration here, the array might be realloc()'ed */ + } + } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + } i_zval_ptr_dtor(p); p++; } From f95ef9cc8e9a2aa888cb1972e845406ef4e72680 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 14:42:26 +0100 Subject: [PATCH 348/369] Fix fastcall use on Windows --- Zend/zend_execute.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 442ec51c8a9cb..c387ce9eb8e59 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -673,7 +673,7 @@ static zend_never_inline ZEND_COLD void zend_throw_auto_init_in_ref_error(zend_p /* this should modify object only if it's empty */ -static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) +static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object(zval *object, zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_object *obj; zval *ref = NULL; @@ -732,7 +732,7 @@ static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object(zval *ob return object; } -static zend_never_inline ZEND_COLD ZEND_FASTCALL zval *make_real_object_rw(zval *object, zval *property OPLINE_DC) +static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object_rw(zval *object, zval *property OPLINE_DC) { zval *ref = NULL; if (Z_ISREF_P(object)) { From c0f7ab64c29f2bb0e3507640c91c2680b449335d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:09:30 +0100 Subject: [PATCH 349/369] Test tweaks --- .../typed_properties_020.phpt | 25 +++++++++--------- .../typed_properties_023.phpt | 26 ++++++++++++------- 2 files changed, 30 insertions(+), 21 deletions(-) diff --git a/Zend/tests/type_declarations/typed_properties_020.phpt b/Zend/tests/type_declarations/typed_properties_020.phpt index 03fdd714b536b..d32d17b1c8d4a 100644 --- a/Zend/tests/type_declarations/typed_properties_020.phpt +++ b/Zend/tests/type_declarations/typed_properties_020.phpt @@ -2,12 +2,19 @@ Test typed properties binary assign op helper test --FILE-- bar += 2; - } +class Foo { + public int $bar = 0; + + public function __construct() { + $this->bar += 2; + try { + $this->bar += 1.5; + } catch (TypeError $e) { + echo $e->getMessage(), "\n"; + } + } } $foo = new Foo(); @@ -15,11 +22,5 @@ $foo = new Foo(); var_dump($foo->bar); ?> --EXPECT-- +Typed property Foo::$bar must be int, float used int(2) - - - - - - - diff --git a/Zend/tests/type_declarations/typed_properties_023.phpt b/Zend/tests/type_declarations/typed_properties_023.phpt index e48ae3c073e0b..1531b23b95987 100644 --- a/Zend/tests/type_declarations/typed_properties_023.phpt +++ b/Zend/tests/type_declarations/typed_properties_023.phpt @@ -12,33 +12,41 @@ class Foo { public static string $s = "x"; } -var_dump(Foo::$s); -Foo::$i = 1; +var_dump(Foo::$i = 1); var_dump(Foo::$i); -Foo::$i = "1"; +var_dump(Foo::$i = "1"); var_dump(Foo::$i); -Foo::$s = Foo::$i++; + +var_dump(Foo::$s); +var_dump(Foo::$s = Foo::$i++); var_dump(Foo::$s, Foo::$i); $a = 3; -Foo::$s = $a; +var_dump(Foo::$s = $a); var_dump(Foo::$s); -Foo::$i = "4"; +var_dump(Foo::$i = "4"); var_dump(Foo::$i); -Foo::$i = ref(); +var_dump(Foo::$i = ref()); var_dump(Foo::$i); -Foo::$s = ref(); +var_dump(Foo::$s = ref()); var_dump(Foo::$s); var_dump(ref()); ?> --EXPECT-- -string(1) "x" int(1) int(1) +int(1) +int(1) +string(1) "x" +string(1) "1" string(1) "1" int(2) string(1) "3" +string(1) "3" int(4) +int(4) +int(5) int(5) string(1) "5" +string(1) "5" int(5) From 3cdaf7187ba1e1a8af75da5c09ab3e0969222cfb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:35:40 +0100 Subject: [PATCH 350/369] Remove unnecessary flag handling in compact_literals ASSIGN_* does not use obj flags. --- ext/opcache/Optimizer/compact_literals.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/ext/opcache/Optimizer/compact_literals.c b/ext/opcache/Optimizer/compact_literals.c index 2df84c8539dcb..397458365f964 100644 --- a/ext/opcache/Optimizer/compact_literals.c +++ b/ext/opcache/Optimizer/compact_literals.c @@ -566,17 +566,17 @@ void zend_optimizer_compact_literals(zend_op_array *op_array, zend_optimizer_ctx opline->op2.constant, opline->op1.constant, LITERAL_STATIC_PROPERTY, - &cache_size) | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + &cache_size); } else { - (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = cache_size; cache_size += 3 * sizeof(void *); } } else if (opline->op2_type == IS_CONST) { // op2 class if (class_slot[opline->op2.constant] >= 0) { - (opline+1)->extended_value = class_slot[opline->op2.constant] | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = class_slot[opline->op2.constant]; } else { - (opline+1)->extended_value = cache_size | ((opline+1)->extended_value & (ZEND_FETCH_REF|ZEND_ISEMPTY)); + (opline+1)->extended_value = cache_size; class_slot[opline->op2.constant] = cache_size; cache_size += sizeof(void *); } From eec91a2a51f7e756813dfcf2f7a56632aed8b6f7 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:37:29 +0100 Subject: [PATCH 351/369] Remove unnecessary result undefing This is handled by the calling code in this case. --- Zend/zend_execute.c | 3 --- 1 file changed, 3 deletions(-) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index c387ce9eb8e59..9a6865e274e61 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -755,9 +755,6 @@ static zend_never_inline ZEND_COLD zval* ZEND_FASTCALL make_real_object_rw(zval zend_property_info *error_prop = i_zend_check_ref_stdClass_assignable(Z_REF_P(ref)); if (error_prop) { zend_throw_auto_init_in_ref_error(error_prop, "stdClass"); - if (RETURN_VALUE_USED(opline)) { - ZVAL_UNDEF(EX_VAR(opline->result.var)); - } return NULL; } } From 4efefc3e2bf0e3ab4badef8df5d07d0c8ab9f27d Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 15:43:49 +0100 Subject: [PATCH 352/369] Add ASSIGN_STATIC_PROP to opcodes that can have unused result --- ext/opcache/Optimizer/dce.c | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/ext/opcache/Optimizer/dce.c b/ext/opcache/Optimizer/dce.c index 486334373a8bb..95755d559ffb2 100644 --- a/ext/opcache/Optimizer/dce.c +++ b/ext/opcache/Optimizer/dce.c @@ -328,9 +328,11 @@ static zend_bool try_remove_var_def(context *ctx, int free_var, int use_chain, z switch (def_opline->opcode) { case ZEND_ASSIGN: case ZEND_ASSIGN_REF: - case ZEND_ASSIGN_OBJ_REF: case ZEND_ASSIGN_DIM: case ZEND_ASSIGN_OBJ: + case ZEND_ASSIGN_OBJ_REF: + case ZEND_ASSIGN_STATIC_PROP: + case ZEND_ASSIGN_STATIC_PROP_REF: case ZEND_ASSIGN_ADD: case ZEND_ASSIGN_SUB: case ZEND_ASSIGN_MUL: From f6257b74e05b0efd477afb13e8394606c20d30ab Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 16:26:04 +0100 Subject: [PATCH 353/369] Pack obj fetch flags tighter, so it's compatible with 32 bit --- Zend/zend_compile.h | 11 +++++------ Zend/zend_execute.c | 16 ++++++++-------- 2 files changed, 13 insertions(+), 14 deletions(-) diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h index 0c7333425b8ad..b872403e014fe 100644 --- a/Zend/zend_compile.h +++ b/Zend/zend_compile.h @@ -898,12 +898,11 @@ void zend_assert_valid_class_name(const zend_string *const_name); #define ZEND_FETCH_TYPE_MASK 0xe -// TODO We only have 2 bits of flag space in the low bits, this won't work on -// 32-bit systems -#define ZEND_FETCH_REF (1<<0) -#define ZEND_FETCH_DIM_WRITE (1<<1) -#define ZEND_FETCH_OBJ_WRITE (1<<2) -#define ZEND_FETCH_OBJ_FLAGS (ZEND_FETCH_REF|ZEND_FETCH_DIM_WRITE|ZEND_FETCH_OBJ_WRITE) +/* Only one of these can ever be in use */ +#define ZEND_FETCH_REF 1 +#define ZEND_FETCH_DIM_WRITE 2 +#define ZEND_FETCH_OBJ_WRITE 3 +#define ZEND_FETCH_OBJ_FLAGS 3 #define ZEND_ISEMPTY (1<<0) diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9a6865e274e61..3d94bfe007783 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -2602,9 +2602,9 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c return_indirect: ZVAL_INDIRECT(result, ptr); if (flags && - (((flags & ZEND_FETCH_REF) && Z_TYPE_P(ptr) != IS_REFERENCE) || - ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) || - ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr))) + ((flags == ZEND_FETCH_REF && Z_TYPE_P(ptr) != IS_REFERENCE) || + (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(ptr)) || + (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(ptr))) ) { zend_property_info *prop_info; @@ -2616,7 +2616,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c zend_tmp_string_release(tmp_str); } if (UNEXPECTED(prop_info)) { - if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(ptr)) { + if (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(ptr)) { if (!check_type_array_assignable(prop_info->type)) { zend_throw_auto_init_in_prop_error(prop_info, "array"); ZVAL_UNDEF(ptr); @@ -2624,7 +2624,7 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } return; } - if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(ptr)) { + if (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(ptr)) { if (!check_type_stdClass_assignable(prop_info->type)) { zend_throw_auto_init_in_prop_error(prop_info, "stdClass"); ZVAL_UNDEF(ptr); @@ -2777,17 +2777,17 @@ static zend_always_inline int zend_fetch_static_property_address(zval **retval, } if (flags) { - if ((flags & ZEND_FETCH_DIM_WRITE) && promotes_to_array(*retval) + if (flags == ZEND_FETCH_DIM_WRITE && promotes_to_array(*retval) && !check_type_array_assignable(property_info->type)) { zend_throw_auto_init_in_prop_error(property_info, "array"); return FAILURE; } - if ((flags & ZEND_FETCH_OBJ_WRITE) && promotes_to_object(*retval) + if (flags == ZEND_FETCH_OBJ_WRITE && promotes_to_object(*retval) && !check_type_stdClass_assignable(property_info->type)) { zend_throw_auto_init_in_prop_error(property_info, "stdClass"); return FAILURE; } - if ((flags & ZEND_FETCH_REF) && Z_TYPE_P(*retval) != IS_REFERENCE) { + if (flags == ZEND_FETCH_REF && Z_TYPE_P(*retval) != IS_REFERENCE) { zval *ref = *retval; if (UNEXPECTED(!ZEND_TYPE_ALLOW_NULL(property_info->type) && Z_TYPE_P(ref) <= IS_NULL)) { zend_throw_error(NULL, "Cannot access uninitialized property %s::$%s by reference", From f28943ca2e98730a408281a8781ed9f482bbeceb Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Thu, 3 Jan 2019 17:16:21 +0100 Subject: [PATCH 354/369] Start working on inference support for typed static props Also fix a bug in inference for object properties: We must check that it's a non-static property, otherwise null becomes an additional valid return value. --- ext/opcache/Optimizer/zend_inference.c | 55 ++++++++++++++++++++++---- 1 file changed, 48 insertions(+), 7 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 7d298d3ce386f..3124c4f873ff7 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2280,10 +2280,9 @@ static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *ar return tmp; } -static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i, zend_class_entry **pce) +static zend_property_info *zend_fetch_prop_info(const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline, int i) { zend_property_info *prop_info = NULL; - if (opline->op2_type == IS_CONST) { zend_class_entry *ce = NULL; @@ -2295,9 +2294,52 @@ static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ss if (ce) { prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants))); + if (prop_info && (prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } + } + } + return prop_info; +} + +static zend_property_info *zend_fetch_static_prop_info(const zend_script *script, const zend_op_array *op_array, zend_ssa *ssa, zend_op *opline) +{ + zend_property_info *prop_info = NULL; + if (opline->op1_type == IS_CONST) { + zend_class_entry *ce = NULL; + if (opline->op2_type == IS_UNUSED) { + int fetch_type = opline->op2.num & ZEND_FETCH_CLASS_MASK; + switch (fetch_type) { + case ZEND_FETCH_CLASS_SELF: + case ZEND_FETCH_CLASS_STATIC: + /* We enforce that static property types cannot change during inheritance, so + * handling static the same way as self here is legal. */ + ce = op_array->scope; + break; + case ZEND_FETCH_CLASS_PARENT: + if (op_array->scope) { + ce = op_array->scope->parent; + } + break; + } + } else if (opline->op2_type == IS_CONST) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op2, ssa->rt_constants); + ce = get_class_entry(script, Z_STR_P(zv + 1)); + } + + if (ce) { + zval *zv = CRT_CONSTANT_EX(op_array, opline, opline->op1, ssa->rt_constants); + prop_info = zend_hash_find_ptr(&ce->properties_info, Z_STR_P(zv)); + if (prop_info && !(prop_info->flags & ZEND_ACC_STATIC)) { + prop_info = NULL; + } } } + return prop_info; +} +static uint32_t zend_fetch_prop_type(zend_property_info *prop_info, zend_class_entry **pce) +{ if (prop_info && ZEND_TYPE_IS_SET(prop_info->type)) { uint32_t type = ZEND_TYPE_IS_CLASS(prop_info->type) ? MAY_BE_OBJECT @@ -2314,7 +2356,6 @@ static uint32_t zend_fetch_prop_type_info(const zend_op_array *op_array, zend_ss } return type; } - if (pce) { *pce = NULL; } @@ -2523,7 +2564,7 @@ static int zend_update_type_info(const zend_op_array *op_array, tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { orig = t1; - t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, NULL); + t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), NULL); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2595,7 +2636,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } /* The return value must also satisfy the property type */ - t1 = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); if (t1) { tmp &= t1; } @@ -2782,7 +2823,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } if (ssa_ops[i].result_def >= 0) { // TODO: If there is no __set we might do better - tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + tmp = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); if (ce) { UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); @@ -3436,7 +3477,7 @@ static int zend_update_type_info(const zend_op_array *op_array, COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } if (ssa_ops[i].result_def >= 0) { - tmp = zend_fetch_prop_type_info(op_array, ssa, opline, i, &ce); + tmp = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); if (opline->result_type != IS_TMP_VAR) { tmp |= MAY_BE_REF | MAY_BE_ERROR; } From 4910f1d274da580d1859c69af6ffadae51d6a891 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:09:49 +0100 Subject: [PATCH 355/369] Support type inference for static properties --- ext/opcache/Optimizer/zend_inference.c | 39 ++++++++++++++++++++++---- 1 file changed, 34 insertions(+), 5 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 3124c4f873ff7..58fb966171ffc 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2559,12 +2559,14 @@ static int zend_update_type_info(const zend_op_array *op_array, case ZEND_ASSIGN_BW_OR: case ZEND_ASSIGN_BW_AND: case ZEND_ASSIGN_BW_XOR: - case ZEND_ASSIGN_CONCAT: + case ZEND_ASSIGN_CONCAT: { + zend_property_info *prop_info = NULL; orig = 0; tmp = 0; if (opline->extended_value == ZEND_ASSIGN_OBJ) { + prop_info = zend_fetch_prop_info(op_array, ssa, opline, i); orig = t1; - t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), NULL); + t1 = zend_fetch_prop_type(prop_info, &ce); t2 = OP1_DATA_INFO(); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (t1 & MAY_BE_ARRAY_OF_REF) { @@ -2573,6 +2575,10 @@ static int zend_update_type_info(const zend_op_array *op_array, orig = t1; t1 = zend_array_element_type(t1, 1, 0); t2 = OP1_DATA_INFO(); + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + prop_info = zend_fetch_static_prop_info(script, op_array, ssa, opline); + t1 = zend_fetch_prop_type(prop_info, &ce); + t2 = OP1_DATA_INFO(); } else { if (t1 & MAY_BE_REF) { tmp |= MAY_BE_REF; @@ -2608,6 +2614,8 @@ static int zend_update_type_info(const zend_op_array *op_array, UPDATE_SSA_TYPE(orig, ssa_ops[i].op1_def); COPY_SSA_OBJ_TYPE(ssa_ops[i].op1_use, ssa_ops[i].op1_def); } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* Nothing to do */ } else { UPDATE_SSA_TYPE(tmp, ssa_ops[i].op1_def); } @@ -2636,9 +2644,13 @@ static int zend_update_type_info(const zend_op_array *op_array, } /* The return value must also satisfy the property type */ - t1 = zend_fetch_prop_type(zend_fetch_prop_info(op_array, ssa, opline, i), &ce); - if (t1) { - tmp &= t1; + if (prop_info) { + tmp &= zend_fetch_prop_type(prop_info, NULL); + } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + /* The return value must also satisfy the property type */ + if (prop_info) { + tmp &= zend_fetch_prop_type(prop_info, NULL); } } tmp &= ~MAY_BE_REF; @@ -2648,6 +2660,7 @@ static int zend_update_type_info(const zend_op_array *op_array, } } break; + } case ZEND_PRE_INC: case ZEND_PRE_DEC: tmp = 0; @@ -3487,6 +3500,22 @@ static int zend_update_type_info(const zend_op_array *op_array, } } break; + case ZEND_FETCH_STATIC_PROP_R: + case ZEND_FETCH_STATIC_PROP_IS: + case ZEND_FETCH_STATIC_PROP_RW: + case ZEND_FETCH_STATIC_PROP_W: + case ZEND_FETCH_STATIC_PROP_UNSET: + case ZEND_FETCH_STATIC_PROP_FUNC_ARG: + tmp = zend_fetch_prop_type( + zend_fetch_static_prop_info(script, op_array, ssa, opline), &ce); + if (opline->result_type != IS_TMP_VAR) { + tmp |= MAY_BE_REF | MAY_BE_ERROR; + } + UPDATE_SSA_TYPE(tmp, ssa_ops[i].result_def); + if (ce) { + UPDATE_SSA_OBJ_TYPE(ce, 1, ssa_ops[i].result_def); + } + break; case ZEND_DO_FCALL: case ZEND_DO_ICALL: case ZEND_DO_UCALL: From 78acbd7b2ed470ca23b915db8aebca54ab8c5e74 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:26:17 +0100 Subject: [PATCH 356/369] Don't call magic in ReflectionProperty::isInitialized() --- ext/reflection/php_reflection.c | 16 +++++++----- .../ReflectionProperty_isInitialized.phpt | 26 +++++++++++++++++++ 2 files changed, 36 insertions(+), 6 deletions(-) diff --git a/ext/reflection/php_reflection.c b/ext/reflection/php_reflection.c index b59f9fd694600..126283a9c0fa0 100644 --- a/ext/reflection/php_reflection.c +++ b/ext/reflection/php_reflection.c @@ -5507,7 +5507,9 @@ ZEND_METHOD(reflection_property, isInitialized) } RETURN_FALSE; } else { - zval rv; + zval name_zv; + zend_class_entry *old_scope; + int retval; if (zend_parse_parameters(ZEND_NUM_ARGS(), "o", &object) == FAILURE) { return; @@ -5518,11 +5520,13 @@ ZEND_METHOD(reflection_property, isInitialized) /* Returns from this function */ } - member_p = zend_read_property_ex(intern->ce, object, ref->unmangled_name, 1, &rv); - RETVAL_BOOL(member_p != &EG(uninitialized_zval)); - if (member_p == &rv) { - zval_ptr_dtor(member_p); - } + old_scope = EG(fake_scope); + EG(fake_scope) = intern->ce; + ZVAL_STR(&name_zv, ref->unmangled_name); + retval = Z_OBJ_HT_P(object)->has_property(object, &name_zv, ZEND_PROPERTY_EXISTS, NULL); + EG(fake_scope) = old_scope; + + RETVAL_BOOL(retval); } } /* }}} */ diff --git a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt index 587919605dc72..f1f6e53ebd542 100644 --- a/ext/reflection/tests/ReflectionProperty_isInitialized.phpt +++ b/ext/reflection/tests/ReflectionProperty_isInitialized.phpt @@ -62,6 +62,29 @@ try { echo $e->getMessage(), "\n"; } +class WithMagic { + public $prop; + public int $intProp; + + public function __isset($name) { + echo "__isset($name)\n"; + return true; + } + + public function __get($name) { + echo "__get($name)\n"; + return "foobar"; + } +} + +echo "Class with __isset:\n"; +$obj = new WithMagic; +unset($obj->prop); +$rp = new ReflectionProperty('WithMagic', 'prop'); +var_dump($rp->isInitialized($obj)); +$rp = new ReflectionProperty('WithMagic', 'intProp'); +var_dump($rp->isInitialized($obj)); + ?> --EXPECT-- Static properties: @@ -85,3 +108,6 @@ bool(false) Object type: bool(false) Given object is not an instance of the class this property was declared in +Class with __isset: +bool(false) +bool(false) From 743011509e198033b6413f3b1fd080230c29fc26 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:31:46 +0100 Subject: [PATCH 357/369] Remove redundant check in zend_inheritance --- Zend/zend_inheritance.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index fec9c12343279..dd15d5aab5395 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -746,7 +746,7 @@ static void do_inherit_property(zend_property_info *parent_info, zend_string *ke } if (UNEXPECTED(ZEND_TYPE_IS_SET(parent_info->type))) { - if (ZEND_TYPE_IS_CLASS(parent_info->type) ? !property_types_compatible(parent_info, child_info) : parent_info->type != child_info->type) { + if (!property_types_compatible(parent_info, child_info)) { zend_error_noreturn(E_COMPILE_ERROR, "Type of %s::$%s must be %s%s (as in class %s)", ZSTR_VAL(ce->name), From c5d916ff4c77af5ae22fca72e4004a19b0d6a089 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:36:13 +0100 Subject: [PATCH 358/369] Remove dead code --- ext/opcache/Optimizer/zend_optimizer.c | 1 - 1 file changed, 1 deletion(-) diff --git a/ext/opcache/Optimizer/zend_optimizer.c b/ext/opcache/Optimizer/zend_optimizer.c index 0e18a2dd91c05..912f635c7fc41 100644 --- a/ext/opcache/Optimizer/zend_optimizer.c +++ b/ext/opcache/Optimizer/zend_optimizer.c @@ -535,7 +535,6 @@ int zend_optimizer_update_op2_const(zend_op_array *op_array, (opline+1)->extended_value = alloc_cache_slots(op_array, 3); } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { goto handle_static_prop; - (opline+1)->extended_value = alloc_cache_slots(op_array, 2); } else if (opline->extended_value == ZEND_ASSIGN_DIM) { if (Z_TYPE_P(val) == IS_STRING) { zend_ulong index; From 8b714421246267f939cfc9ffe431f03ac8470785 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:37:51 +0100 Subject: [PATCH 359/369] Convert if/else to switch Based on reviewer comment. --- ext/opcache/Optimizer/zend_inference.c | 28 +++++++++++++------------- 1 file changed, 14 insertions(+), 14 deletions(-) diff --git a/ext/opcache/Optimizer/zend_inference.c b/ext/opcache/Optimizer/zend_inference.c index 58fb966171ffc..b5227feffaa24 100644 --- a/ext/opcache/Optimizer/zend_inference.c +++ b/ext/opcache/Optimizer/zend_inference.c @@ -2241,21 +2241,21 @@ static inline zend_class_entry *get_class_entry(const zend_script *script, zend_ } static uint32_t zend_convert_type_code_to_may_be(zend_uchar type_code) { - if (type_code == IS_VOID) { - return MAY_BE_NULL; - } else if (type_code == IS_CALLABLE) { - return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == IS_ITERABLE) { - return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == IS_ARRAY) { - return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; - } else if (type_code == _IS_BOOL) { - return MAY_BE_TRUE|MAY_BE_FALSE; + switch (type_code) { + case IS_VOID: + return MAY_BE_NULL; + case IS_CALLABLE: + return MAY_BE_STRING|MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ITERABLE: + return MAY_BE_OBJECT|MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case IS_ARRAY: + return MAY_BE_ARRAY|MAY_BE_ARRAY_KEY_ANY|MAY_BE_ARRAY_OF_ANY|MAY_BE_ARRAY_OF_REF; + case _IS_BOOL: + return MAY_BE_TRUE|MAY_BE_FALSE; + default: + ZEND_ASSERT(type_code < IS_REFERENCE); + return 1 << type_code; } - - ZEND_ASSERT(type_code < IS_REFERENCE); - return 1 << type_code; - } static uint32_t zend_fetch_arg_info(const zend_script *script, zend_arg_info *arg_info, zend_class_entry **pce) From 401ff4ce052c75839ccdc20be7c46e276c87470a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 15:39:21 +0100 Subject: [PATCH 360/369] Revert "Remove lchown($file, -5); test" This reverts commit 0cc95b84d5d31f33ee5080116dca0f81d501cdac. This has already been fixed in a different way in 3b830cfb5c87974eb48596cdc4e4bf07cab89acc and is unrelated to typed properties... --- ext/standard/tests/file/lchown_error.phpt | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/ext/standard/tests/file/lchown_error.phpt b/ext/standard/tests/file/lchown_error.phpt index 7564042fdfe85..f4b4f5089e2df 100644 --- a/ext/standard/tests/file/lchown_error.phpt +++ b/ext/standard/tests/file/lchown_error.phpt @@ -43,6 +43,9 @@ var_dump( lchown( 'foobar_lchown.txt', $uid ) ); var_dump( lchown( new StdClass(), $uid ) ); var_dump( lchown( array(), $uid ) ); +// Bad user +var_dump( lchown( $filename, -5 ) ); + ?> ===DONE=== --CLEAN-- @@ -69,4 +72,7 @@ bool(true) Warning: lchown() expects parameter 1 to be a valid path, array given in %s on line %d bool(true) + +Warning: lchown(): %r(Operation not permitted|Invalid argument)%r in %s on line %d +bool(false) ===DONE=== From dbf7d8202f59f6014995e22060bff4acabe8dcf8 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 16:11:39 +0100 Subject: [PATCH 361/369] Allow references to typed properties during unserialization Still needs more work to make the assignment successful in more cases. --- .../tests/serialize/typed_property_refs.phpt | 25 +++++++++++- ext/standard/var_unserializer.re | 40 ++++++++++++------- 2 files changed, 48 insertions(+), 17 deletions(-) diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index a05a8e53af51b..a58bd3e108480 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -13,17 +13,38 @@ class B { public int $b; } +class C { + public int $a; + public string $b; +} + var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); ?> --EXPECTF-- object(A)#1 (2) { ["a"]=> - int(1) + &int(1) ["b"]=> - int(1) + &int(1) } Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d bool(false) + +Notice: unserialize(): Error at offset 21 of 34 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 33 of 34 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d +bool(false) + +Notice: unserialize(): Error at offset 39 of 40 bytes in %s on line %d +bool(false) diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index ad80d4b1ce7fd..b1b14eb6a3fb7 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -46,7 +46,7 @@ struct php_unserialize_data { var_dtor_entries *first_dtor; var_dtor_entries *last_dtor; HashTable *allowed_classes; - HashTable *refs; + HashTable *ref_props; var_entries entries; }; @@ -58,7 +58,7 @@ PHPAPI php_unserialize_data_t php_var_unserialize_init() { d->last = &d->entries; d->first_dtor = d->last_dtor = NULL; d->allowed_classes = NULL; - d->refs = NULL; + d->ref_props = NULL; d->entries.used_slots = 0; d->entries.next = NULL; if (!BG(serialize_lock)) { @@ -242,8 +242,8 @@ PHPAPI void var_destroy(php_unserialize_data_t *var_hashx) zval_ptr_dtor_nogc(&wakeup_name); - if ((*var_hashx)->refs) { - zend_array_destroy((*var_hashx)->refs); + if ((*var_hashx)->ref_props) { + zend_array_destroy((*var_hashx)->ref_props); } } @@ -497,6 +497,7 @@ string_key: if ((old_data = zend_hash_find(ht, Z_STR(key))) != NULL) { if (Z_TYPE_P(old_data) == IS_INDIRECT) { + // TODO Deduplicate with above code? old_data = Z_INDIRECT_P(old_data); if (Z_STRVAL(key)[0] == 0) { zend_string *member, *class; @@ -515,18 +516,19 @@ string_key: info = zend_get_property_info(ce, Z_STR(key), 1); } var_push_dtor(var_hash, old_data); - old_data = zend_hash_update_ind(ht, Z_STR(key), &d); + data = zend_hash_update_ind(ht, Z_STR(key), &d); if (EXPECTED(!info->type)) { info = NULL; - data = old_data; } else { - /* little hack to disallow references */ - if (!(*var_hash)->refs) { - (*var_hash)->refs = emalloc(sizeof(HashTable)); - zend_hash_init((*var_hash)->refs, 8, NULL, ZVAL_PTR_DTOR, 0); + /* Remember to which property this slot belongs, so we can add a type + * source if it is turned into a reference lateron. */ + if (!(*var_hash)->ref_props) { + (*var_hash)->ref_props = emalloc(sizeof(HashTable)); + zend_hash_init((*var_hash)->ref_props, 8, NULL, NULL, 0); } - data = zend_hash_next_index_insert((*var_hash)->refs, &d); + zend_hash_index_update_ptr( + (*var_hash)->ref_props, (zend_uintptr_t) data, info); } } else { var_push_dtor(var_hash, old_data); @@ -551,6 +553,8 @@ string_key: } if (UNEXPECTED(info)) { + // TODO Throw an error instead? + // TODO Handle references correctly ZVAL_COPY_VALUE(&tmp, data); if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { zval_dtor(&key); @@ -745,13 +749,19 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key) return 0; } - if (Z_ISREF_P(rval_ref)) { - ZVAL_COPY(rval, rval_ref); - } else { + if (!Z_ISREF_P(rval_ref)) { + zend_property_info *info = NULL; + if ((*var_hash)->ref_props) { + info = zend_hash_index_find_ptr((*var_hash)->ref_props, (zend_uintptr_t) rval_ref); + } ZVAL_NEW_REF(rval_ref, rval_ref); - ZVAL_COPY(rval, rval_ref); + if (info) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(rval_ref), info); + } } + ZVAL_COPY(rval, rval_ref); + return 1; } From b1df1b71d0f1f3214433da0345efa63ef4fc2489 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Fri, 4 Jan 2019 16:38:29 +0100 Subject: [PATCH 362/369] Fix type checks during unserialization --- .../tests/serialize/typed_property_refs.phpt | 63 +++++++++++++------ ext/standard/var_unserializer.re | 14 ++--- 2 files changed, 50 insertions(+), 27 deletions(-) diff --git a/ext/standard/tests/serialize/typed_property_refs.phpt b/ext/standard/tests/serialize/typed_property_refs.phpt index a58bd3e108480..9475e8a78339e 100644 --- a/ext/standard/tests/serialize/typed_property_refs.phpt +++ b/ext/standard/tests/serialize/typed_property_refs.phpt @@ -18,33 +18,56 @@ class C { public string $b; } +class D { + public int $a; + public float $b; +} + var_dump(unserialize('O:1:"A":2:{s:1:"a";i:1;s:1:"b";R:2;}')); var_dump(unserialize('O:1:"B":2:{s:1:"a";i:1;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); -var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); + +try { + var_dump(unserialize('O:1:"A":2:{s:1:"a";N;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"B":2:{s:1:"a";N;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"C":2:{s:1:"b";s:1:"x";s:1:"a";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +try { + var_dump(unserialize('O:1:"D":2:{s:1:"a";i:1;s:1:"b";R:2;}')); +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} ?> ---EXPECTF-- +--EXPECT-- object(A)#1 (2) { ["a"]=> &int(1) ["b"]=> &int(1) } - -Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 21 of 34 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 33 of 34 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 35 of 36 bytes in %s on line %d -bool(false) - -Notice: unserialize(): Error at offset 39 of 40 bytes in %s on line %d -bool(false) +object(B)#1 (2) { + ["a"]=> + &int(1) + ["b"]=> + &int(1) +} +Typed property A::$a must be int, null used +Typed property B::$b must be int, null used +Typed property C::$b must be string, int used +Typed property C::$a must be int, string used +Reference with value of type int held by property D::$a of type int is not compatible with property D::$b of type float diff --git a/ext/standard/var_unserializer.re b/ext/standard/var_unserializer.re index b1b14eb6a3fb7..f3901bb58aa13 100644 --- a/ext/standard/var_unserializer.re +++ b/ext/standard/var_unserializer.re @@ -404,7 +404,7 @@ static int php_var_unserialize_internal(UNSERIALIZE_PARAMETER, int as_key); static zend_always_inline int process_nested_data(UNSERIALIZE_PARAMETER, HashTable *ht, zend_long elements, zend_class_entry *ce) { while (elements-- > 0) { - zval key, *data, d, *old_data, tmp; + zval key, *data, d, *old_data; zend_ulong idx; zend_property_info *info = NULL; @@ -553,15 +553,15 @@ string_key: } if (UNEXPECTED(info)) { - // TODO Throw an error instead? - // TODO Handle references correctly - ZVAL_COPY_VALUE(&tmp, data); - if (UNEXPECTED(!zend_verify_property_type(info, &tmp, 1))) { + if (!zend_verify_prop_assignable_by_ref(info, data, /* strict */ 1)) { + zval_ptr_dtor(data); + ZVAL_UNDEF(data); zval_dtor(&key); return 0; } - data = &tmp; - ZVAL_COPY(old_data, data); + if (Z_ISREF_P(data)) { + ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(data), info); + } } if (BG(unserialize).level > 1) { From bac542502582ed57426c21928c6447c894ab78d5 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 10:47:16 +0100 Subject: [PATCH 363/369] Correctly handle refs on ASSIGN_OBJ fastpath --- .../typed_properties_092.phpt | 41 + Zend/zend_vm_def.h | 46 +- Zend/zend_vm_execute.h | 1656 ++++++++++------- 3 files changed, 1077 insertions(+), 666 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_092.phpt diff --git a/Zend/tests/type_declarations/typed_properties_092.phpt b/Zend/tests/type_declarations/typed_properties_092.phpt new file mode 100644 index 0000000000000..8509fa74464ca --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_092.phpt @@ -0,0 +1,41 @@ +--TEST-- +Refs on ASSIGN_OBJ fast-path +--FILE-- +prop = $array; + } + + public function bar() { + $str = "123"; + $this->prop2 = ref($str); + } +} + +$test = new Test; +$test->foo(); +$test->foo(); +$test->bar(); +$test->bar(); +var_dump($test); + +?> +--EXPECT-- +object(Test)#1 (2) { + ["prop"]=> + array(0) { + } + ["prop2"]=> + int(123) +} diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 0c94db72c578b..fb2e6c3021a4e 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2331,23 +2331,43 @@ ZEND_VM_C_LABEL(assign_object): zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - FREE_OP_DATA(); + zval_ptr_dtor(value); + if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } FREE_OP2(); FREE_OP1_VAR_PTR(); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (OP_DATA_TYPE == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { ZEND_VM_C_LABEL(fast_assign_obj): - value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -2427,11 +2447,8 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -2444,22 +2461,17 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); if (UNEXPECTED(prop_info->type)) { -#if defined(ZEND_VM_SPEC) && (OP_DATA_TYPE & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if !defined(ZEND_VM_SPEC) || (OP_DATA_TYPE & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((OP_DATA_TYPE & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((OP_DATA_TYPE & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((OP_DATA_TYPE & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((OP_DATA_TYPE & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -2468,13 +2480,11 @@ ZEND_VM_HANDLER(201, ZEND_ASSIGN_STATIC_PROP, CONST|TMPVAR|CV, UNUSED|CONST|VAR, UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if !defined(ZEND_VM_SPEC) || !(OP_DATA_TYPE & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((OP_DATA_TYPE & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index c6a39f4b6b573..9e666e43776c9 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -4984,11 +4984,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5001,22 +4998,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5025,13 +5017,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5051,11 +5041,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5068,22 +5055,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5092,13 +5074,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5118,11 +5098,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5135,22 +5112,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5159,13 +5131,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -5185,11 +5155,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -5202,22 +5169,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -5226,13 +5188,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8571,11 +8531,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8588,22 +8545,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8612,13 +8564,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8638,11 +8588,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8655,22 +8602,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8679,13 +8621,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8705,11 +8645,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8722,22 +8659,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8746,13 +8678,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -8772,11 +8702,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -8789,22 +8716,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -8813,13 +8735,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9503,11 +9423,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9520,22 +9437,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9544,13 +9456,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9570,11 +9480,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9587,22 +9494,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9611,13 +9513,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9637,11 +9537,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9654,22 +9551,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9678,13 +9570,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -9704,11 +9594,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -9721,22 +9608,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -9745,13 +9627,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CONST_ UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15080,11 +14960,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15097,22 +14974,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15121,13 +14993,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15147,11 +15017,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15164,22 +15031,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15188,13 +15050,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15214,11 +15074,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15231,22 +15088,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15255,13 +15107,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -15281,11 +15131,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -15298,22 +15145,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -15322,13 +15164,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17542,11 +17382,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17559,22 +17396,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17583,13 +17415,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17609,11 +17439,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17626,22 +17453,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17650,13 +17472,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17676,11 +17496,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17693,22 +17510,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17717,13 +17529,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -17743,11 +17553,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -17760,22 +17567,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -17784,13 +17586,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18220,11 +18020,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18237,22 +18034,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18261,13 +18053,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18287,11 +18077,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18304,22 +18091,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18328,13 +18110,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18354,11 +18134,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18371,22 +18148,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18395,13 +18167,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -18421,11 +18191,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -18438,22 +18205,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -18462,13 +18224,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_TMPVAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -25609,23 +25369,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25743,23 +25523,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -25877,23 +25677,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -26011,23 +25831,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CONST_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28499,23 +28339,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28633,23 +28493,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28767,23 +28647,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -28901,23 +28801,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_TMPVAR_OP_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -32982,23 +32902,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33116,23 +33056,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33250,23 +33210,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -33384,23 +33364,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_VAR_CV_OP_DATA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35689,23 +35689,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35823,23 +35843,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -35957,23 +35997,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -36091,23 +36151,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CONST_O zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37674,23 +37754,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37808,23 +37908,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -37942,23 +38062,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -38076,23 +38216,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_TMPVAR_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40306,23 +40466,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40440,23 +40620,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40574,23 +40774,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -40708,23 +40928,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_UNUSED_CV_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45402,23 +45642,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45536,23 +45796,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45670,23 +45950,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45804,23 +46104,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CONST_OP_DA zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -45900,11 +46220,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -45917,22 +46234,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -45941,13 +46253,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -45967,11 +46277,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -45984,22 +46291,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46008,13 +46310,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -46034,11 +46334,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -46051,22 +46348,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46075,13 +46367,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -46101,11 +46391,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -46118,22 +46405,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -46142,13 +46424,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_CON UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -49973,23 +50253,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50107,23 +50407,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50241,23 +50561,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -50375,23 +50715,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_TMPVAR_OP_D zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } zval_ptr_dtor_nogc(free_op2); + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -52161,11 +52521,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52178,22 +52535,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52202,13 +52554,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52228,11 +52578,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52245,22 +52592,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52269,13 +52611,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52295,11 +52635,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52312,22 +52649,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52336,13 +52668,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -52362,11 +52692,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -52379,22 +52706,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -52403,13 +52725,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_VAR UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53488,11 +53808,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CONST & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53505,22 +53822,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = RT_CONSTANT((opline+1), (opline+1)->op1); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CONST & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CONST & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CONST & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53529,13 +53841,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CONST & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53555,11 +53865,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53572,22 +53879,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_tmp((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_TMP_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_TMP_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_TMP_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53596,13 +53898,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_TMP_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53622,11 +53922,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zend_free_op free_op_data; zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_VAR & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53639,22 +53936,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_var((opline+1)->op1.var, &free_op_data EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_VAR & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_VAR & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_VAR & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53663,13 +53955,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_VAR & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -53689,11 +53979,8 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU USE_OPLINE zval *prop, *value; - zend_reference *ref = NULL; zend_property_info *prop_info; -#if 0 || !(IS_CV & IS_TMP_VAR) zval tmp; -#endif SAVE_OPLINE(); @@ -53706,22 +53993,17 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU value = _get_zval_ptr_cv_BP_VAR_R((opline+1)->op1.var EXECUTE_DATA_CC); if (UNEXPECTED(prop_info->type)) { -#if 1 && (IS_CV & IS_TMP_VAR) - if (UNEXPECTED(!i_zend_verify_property_type(prop_info, value, EX_USES_STRICT_TYPES()))) { -#else -#if 0 || (IS_CV & (IS_CV | IS_VAR)) - if (Z_ISREF_P(value)) { + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { ref = Z_REF_P(value); value = Z_REFVAL_P(value); } -#endif - if (((IS_CV & (IS_CONST | IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { ZVAL_COPY(&tmp, value); } else { ZVAL_COPY_VALUE(&tmp, value); } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { -#endif zend_verify_property_type_error(prop_info, value); zval_ptr_dtor(value); if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { @@ -53730,13 +54012,11 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_SPEC_CV_UNU UNDEF_RESULT(); HANDLE_EXCEPTION(); } -#if 0 || !(IS_CV & IS_TMP_VAR) - value = &tmp; + value = &tmp; if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { efree(ref); } -#endif value = zend_assign_to_variable(prop, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); } else { @@ -56837,23 +57117,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CONST & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CONST & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CONST & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CONST == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CONST & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CONST, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -56971,23 +57271,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_TMP_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_TMP_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_TMP_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_TMP_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_TMP_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -57105,23 +57425,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_VAR & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_VAR & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); - zval_ptr_dtor_nogc(free_op_data); + zval_ptr_dtor(value); + if ((IS_VAR & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_VAR == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_VAR & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_VAR, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } @@ -57239,23 +57579,43 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_SPEC_CV_CV_OP_DATA_ zval tmp; if (UNEXPECTED(prop_info != NULL)) { - ZVAL_COPY_VALUE(&tmp, value); + zend_reference *ref = NULL; + if ((IS_CV & (IS_CV|IS_VAR)) && UNEXPECTED(Z_ISREF_P(value))) { + ref = Z_REF_P(value); + value = Z_REFVAL_P(value); + } + if (((IS_CV & (IS_CONST|IS_CV)) || (ref && GC_REFCOUNT(ref) > 1))) { + ZVAL_COPY(&tmp, value); + } else { + ZVAL_COPY_VALUE(&tmp, value); + } if (UNEXPECTED(!i_zend_verify_property_type(prop_info, &tmp, EX_USES_STRICT_TYPES()))) { zend_verify_property_type_error(prop_info, value); + zval_ptr_dtor(value); + if ((IS_CV & IS_VAR) && ref && GC_DELREF(ref) == 0) { + efree(ref); + } - + UNDEF_RESULT(); HANDLE_EXCEPTION(); } + /* will remain valid, thus no need to check prop_info in future here */ if (IS_CV == IS_CONST && Z_TYPE(tmp) == Z_TYPE_P(value)) { CACHE_PTR_EX(cache_slot + 2, NULL); } + value = &tmp; - } + if ((IS_CV & IS_VAR) && UNEXPECTED(ref) && GC_DELREF(ref) == 0) { + efree(ref); + } + value = zend_assign_to_variable(property_val, value, IS_TMP_VAR, EX_USES_STRICT_TYPES()); + } else { fast_assign_obj: - value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + value = zend_assign_to_variable(property_val, value, IS_CV, EX_USES_STRICT_TYPES()); + } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_COPY(EX_VAR(opline->result.var), value); } From 882aabab2c07fb5058e0d5122234c7a800f0bb71 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:19:28 +0100 Subject: [PATCH 364/369] Handle ASSIGN_STATIC_PROP compound assign in SCCP --- ext/opcache/Optimizer/sccp.c | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/ext/opcache/Optimizer/sccp.c b/ext/opcache/Optimizer/sccp.c index 48d513030bce4..c7251f70811a1 100644 --- a/ext/opcache/Optimizer/sccp.c +++ b/ext/opcache/Optimizer/sccp.c @@ -1400,7 +1400,7 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o if (op2) { SKIP_IF_TOP(op2); } - if (!opline->extended_value) { + if (opline->extended_value == 0) { if (zend_optimizer_eval_binary_op(&zv, zend_compound_assign_to_binary_op(opline->opcode), op1, op2) == SUCCESS) { SET_RESULT(op1, &zv); SET_RESULT(result, &zv); @@ -1482,6 +1482,11 @@ static void sccp_visit_instr(scdf_ctx *scdf, zend_op *opline, zend_ssa_op *ssa_o zval_ptr_dtor_nogc(&zv); } } + } else if (opline->extended_value == ZEND_ASSIGN_STATIC_PROP) { + SET_RESULT_BOT(result); + break; + } else { + ZEND_ASSERT(0 && "Invalid compound assignment kind"); } SET_RESULT_BOT(result); SET_RESULT_BOT(op1); From 978834415b424e2de9aee4fa1c9d8210d759ecf1 Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:33:41 +0100 Subject: [PATCH 365/369] Remove bogus check in ASSIGN_OBJ_REF --- Zend/zend_vm_def.h | 34 ++- Zend/zend_vm_execute.h | 546 +++++++++++++++++++---------------------- 2 files changed, 271 insertions(+), 309 deletions(-) diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index fb2e6c3021a4e..3592d587ce3d1 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2756,26 +2756,24 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C } else { zend_property_info *prop_info = NULL; - if ((OP2_TYPE == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (OP2_TYPE == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (OP2_TYPE == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - FREE_OP1_VAR_PTR(); - FREE_OP2(); - FREE_OP_DATA_VAR_PTR(); - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + FREE_OP1_VAR_PTR(); + FREE_OP2(); + FREE_OP_DATA_VAR_PTR(); + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 9e666e43776c9..22962ad3eb999 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -26536,26 +26536,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -26634,26 +26632,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_ } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -29450,26 +29446,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -29548,26 +29542,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -34117,26 +34109,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -34215,26 +34205,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);}; - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -36322,26 +36310,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -36419,26 +36405,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -38387,26 +38371,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -38484,26 +38466,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -41099,26 +41079,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -41196,26 +41174,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_ } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -47037,26 +47013,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -47134,26 +47108,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O } else { zend_property_info *prop_info = NULL; - if ((IS_CONST == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CONST == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CONST == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -51364,26 +51336,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + zval_ptr_dtor_nogc(free_op2); + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -51461,26 +51431,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_ } else { zend_property_info *prop_info = NULL; - if (((IS_TMP_VAR|IS_VAR) == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if ((IS_TMP_VAR|IS_VAR) == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - zval_ptr_dtor_nogc(free_op2); + zval_ptr_dtor_nogc(free_op2); - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -58332,26 +58300,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; - HANDLE_EXCEPTION(); - } + if (UNEXPECTED(free_op_data)) {zval_ptr_dtor_nogc(free_op_data);}; + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); @@ -58429,26 +58395,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D } else { zend_property_info *prop_info = NULL; - if ((IS_CV == IS_CONST) ? EXPECTED(!IS_UNKNOWN_DYNAMIC_PROPERTY_OFFSET((uintptr_t) CACHED_PTR_EX(cache_addr + 1))) : EXPECTED(Z_TYPE_P(property) == IS_STRING)) { - if (IS_CV == IS_CONST) { - prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); - } else { - zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); - prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); - zend_tmp_string_release(tmp_str); - } + if (IS_CV == IS_CONST) { + prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2); + } else { + zend_string *tmp_str, *prop_name = zval_get_tmp_string(property, &tmp_str); + prop_info = zend_object_fetch_property_type_info(Z_OBJCE_P(container), prop_name, NULL); + zend_tmp_string_release(tmp_str); + } - if (UNEXPECTED(prop_info)) { - if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { + if (UNEXPECTED(prop_info)) { + if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) { - HANDLE_EXCEPTION(); - } + HANDLE_EXCEPTION(); + } - if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); - } + if (UNEXPECTED(Z_REFCOUNTED_P(variable_ptr)) && Z_ISREF_P(variable_ptr)) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info); } } zend_assign_to_variable_reference(variable_ptr, value_ptr); From c89b5ba656e5acbeac1909365027f0b4e5fd779e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 11:54:07 +0100 Subject: [PATCH 366/369] Add slot to prop info mapping mechanism Taken from PR #3573, minus the foreach/iteration parts. --- Zend/zend.h | 2 ++ Zend/zend_API.c | 11 +++++++ Zend/zend_compile.c | 3 ++ Zend/zend_inheritance.c | 38 +++++++++++++++++++++++ Zend/zend_inheritance.h | 1 + Zend/zend_object_handlers.h | 8 +++++ Zend/zend_opcode.c | 3 ++ ext/opcache/zend_accelerator_util_funcs.c | 10 ++++++ ext/opcache/zend_file_cache.c | 22 +++++++++++++ ext/opcache/zend_persist.c | 13 ++++++++ ext/opcache/zend_persist_calc.c | 4 +++ 11 files changed, 115 insertions(+) diff --git a/Zend/zend.h b/Zend/zend.h index aadda0c3cc875..5918691c279b7 100644 --- a/Zend/zend.h +++ b/Zend/zend.h @@ -133,6 +133,8 @@ struct _zend_class_entry { HashTable properties_info; HashTable constants_table; + struct _zend_property_info **properties_info_table; + zend_function *constructor; zend_function *destructor; zend_function *clone; diff --git a/Zend/zend_API.c b/Zend/zend_API.c index f5a957acad300..1e9c163277f26 100644 --- a/Zend/zend_API.c +++ b/Zend/zend_API.c @@ -2658,6 +2658,7 @@ ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *cla if (parent_ce) { zend_do_inheritance(register_class, parent_ce); + zend_build_properties_info_table(register_class); } return register_class; } @@ -3632,10 +3633,20 @@ ZEND_API int zend_declare_typed_property(zend_class_entry *ce, zend_string *name property_info->offset = property_info_ptr->offset; zval_ptr_dtor(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)]); zend_hash_del(&ce->properties_info, name); + + ZEND_ASSERT(ce->type == ZEND_INTERNAL_CLASS); + ZEND_ASSERT(ce->properties_info_table != NULL); + ce->properties_info_table[OBJ_PROP_TO_NUM(property_info->offset)] = property_info; } else { property_info->offset = OBJ_PROP_TO_OFFSET(ce->default_properties_count); ce->default_properties_count++; ce->default_properties_table = perealloc(ce->default_properties_table, sizeof(zval) * ce->default_properties_count, ce->type == ZEND_INTERNAL_CLASS); + + /* For user classes this is handled during linking */ + if (ce->type == ZEND_INTERNAL_CLASS) { + ce->properties_info_table = perealloc(ce->properties_info_table, sizeof(zend_property_info *) * ce->default_properties_count, 1); + ce->properties_info_table[ce->default_properties_count - 1] = property_info; + } } ZVAL_COPY_VALUE(&ce->default_properties_table[OBJ_PROP_TO_NUM(property_info->offset)], property); } diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index d27106cea0d57..64a879eaef6dd 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -1613,6 +1613,7 @@ ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify ce->default_properties_count = 0; ce->default_static_members_count = 0; + ce->properties_info_table = NULL; if (nullify_handlers) { ce->constructor = NULL; @@ -6495,6 +6496,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ CG(zend_lineno) = decl->end_lineno; ce->ce_flags |= ZEND_ACC_LINKED; zend_do_inheritance(ce, parent_ce); + zend_build_properties_info_table(ce); if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } @@ -6506,6 +6508,7 @@ void zend_compile_class_decl(zend_ast *ast, zend_bool toplevel) /* {{{ */ } else { if (EXPECTED(zend_hash_add_ptr(CG(class_table), lcname, ce) != NULL)) { zend_string_release(lcname); + zend_build_properties_info_table(ce); ce->ce_flags |= ZEND_ACC_LINKED; return; } diff --git a/Zend/zend_inheritance.c b/Zend/zend_inheritance.c index dd15d5aab5395..4fdf04e9fa5ae 100644 --- a/Zend/zend_inheritance.c +++ b/Zend/zend_inheritance.c @@ -846,6 +846,42 @@ static void do_inherit_class_constant(zend_string *name, zend_class_constant *pa } /* }}} */ +void zend_build_properties_info_table(zend_class_entry *ce) +{ + zend_property_info **table, *prop; + if (ce->default_properties_count == 0) { + return; + } + + ZEND_ASSERT(ce->properties_info_table == NULL); + if (ce->type == ZEND_USER_CLASS) { + ce->properties_info_table = table = zend_arena_alloc(&CG(arena), + sizeof(zend_property_info *) * ce->default_properties_count); + } else { + ce->properties_info_table = table = pemalloc( + sizeof(zend_property_info *) * ce->default_properties_count, 1); + } + + if (ce->parent && ce->parent->default_properties_count != 0) { + zend_property_info **parent_table = ce->parent->properties_info_table; + memcpy( + table, parent_table, + sizeof(zend_property_info *) * ce->parent->default_properties_count + ); + + /* Child did not add any new properties, we are done */ + if (ce->default_properties_count == ce->parent->default_properties_count) { + return; + } + } + + ZEND_HASH_FOREACH_PTR(&ce->properties_info, prop) { + if (prop->ce == ce && (prop->flags & ZEND_ACC_STATIC) == 0) { + table[OBJ_PROP_TO_NUM(prop->offset)] = prop; + } + } ZEND_HASH_FOREACH_END(); +} + ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce) /* {{{ */ { zend_property_info *property_info; @@ -2003,6 +2039,8 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent) if ((ce->ce_flags & (ZEND_ACC_IMPLICIT_ABSTRACT_CLASS|ZEND_ACC_INTERFACE|ZEND_ACC_TRAIT|ZEND_ACC_EXPLICIT_ABSTRACT_CLASS)) == ZEND_ACC_IMPLICIT_ABSTRACT_CLASS) { zend_verify_abstract_class(ce); } + + zend_build_properties_info_table(ce); } /* }}} */ diff --git a/Zend/zend_inheritance.h b/Zend/zend_inheritance.h index 9df49cb07e79a..f53b9f7d24418 100644 --- a/Zend/zend_inheritance.h +++ b/Zend/zend_inheritance.h @@ -31,6 +31,7 @@ ZEND_API void zend_do_link_class(zend_class_entry *ce, zend_class_entry *parent_ void zend_verify_abstract_class(zend_class_entry *ce); void zend_check_deprecated_constructor(const zend_class_entry *ce); +void zend_build_properties_info_table(zend_class_entry *ce); zend_string* zend_resolve_property_type(zend_string *name, zend_class_entry *scope); diff --git a/Zend/zend_object_handlers.h b/Zend/zend_object_handlers.h index c3b5fda42ddac..b306d67eb8e8c 100644 --- a/Zend/zend_object_handlers.h +++ b/Zend/zend_object_handlers.h @@ -246,6 +246,14 @@ ZEND_API HashTable *zend_get_properties_for(zval *obj, zend_prop_purpose purpose } \ } while (0) +static inline struct _zend_property_info *zend_get_property_info_for_slot(zend_object *obj, zval *slot) +{ + struct _zend_property_info **table = obj->ce->properties_info_table; + intptr_t prop_num = slot - obj->properties_table; + ZEND_ASSERT(prop_num >= 0 && prop_num < obj->ce->default_properties_count); + return table[prop_num]; +} + #define zend_free_trampoline(func) do { \ if ((func) == &EG(trampoline)) { \ EG(trampoline).common.function_name = NULL; \ diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c index c38ea0855c7e6..2580824a6c707 100644 --- a/Zend/zend_opcode.c +++ b/Zend/zend_opcode.c @@ -374,6 +374,9 @@ ZEND_API void destroy_zend_class(zval *zv) if (ce->num_interfaces > 0) { free(ce->interfaces); } + if (ce->properties_info_table) { + free(ce->properties_info_table); + } free(ce); break; } diff --git a/ext/opcache/zend_accelerator_util_funcs.c b/ext/opcache/zend_accelerator_util_funcs.c index caf160a152bb0..7b04d0d2df44b 100644 --- a/ext/opcache/zend_accelerator_util_funcs.c +++ b/ext/opcache/zend_accelerator_util_funcs.c @@ -312,6 +312,16 @@ static void zend_class_copy_ctor(zend_class_entry **pce) /* constants table */ zend_hash_clone_constants(&ce->constants_table); + if (ce->properties_info_table) { + int i; + ce->properties_info_table = ARENA_REALLOC(ce->properties_info_table); + for (i = 0; i < ce->default_properties_count; i++) { + if (IN_ARENA(ce->properties_info_table[i])) { + ce->properties_info_table[i] = ARENA_REALLOC(ce->properties_info_table[i]); + } + } + } + if (ce->num_interfaces) { zend_class_name *interface_names; diff --git a/ext/opcache/zend_file_cache.c b/ext/opcache/zend_file_cache.c index fddcd5dcd4c71..bebb753122bb5 100644 --- a/ext/opcache/zend_file_cache.c +++ b/ext/opcache/zend_file_cache.c @@ -660,6 +660,19 @@ static void zend_file_cache_serialize_class(zval *zv, SERIALIZE_STR(ce->info.user.doc_comment); zend_file_cache_serialize_hash(&ce->properties_info, script, info, buf, zend_file_cache_serialize_prop_info); + if (ce->properties_info_table) { + uint32_t i; + zend_property_info **table; + + SERIALIZE_PTR(ce->properties_info_table); + table = ce->properties_info_table; + UNSERIALIZE_PTR(table); + + for (i = 0; i < ce->default_properties_count; i++) { + SERIALIZE_PTR(table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; zend_class_name *interface_names; @@ -1325,6 +1338,15 @@ static void zend_file_cache_unserialize_class(zval *zv, zend_file_cache_unserialize_hash(&ce->properties_info, script, buf, zend_file_cache_unserialize_prop_info, NULL); + if (ce->properties_info_table) { + uint32_t i; + UNSERIALIZE_PTR(ce->properties_info_table); + + for (i = 0; i < ce->default_properties_count; i++) { + UNSERIALIZE_PTR(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces) { uint32_t i; diff --git a/ext/opcache/zend_persist.c b/ext/opcache/zend_persist.c index 108b68a2e5fb4..71cc452ff5d9c 100644 --- a/ext/opcache/zend_persist.c +++ b/ext/opcache/zend_persist.c @@ -872,6 +872,19 @@ static void zend_persist_class_entry(zval *zv) zend_hash_persist(&ce->properties_info, zend_persist_property_info); HT_FLAGS(&ce->properties_info) &= (HASH_FLAG_UNINITIALIZED | HASH_FLAG_STATIC_KEYS); + if (ce->properties_info_table) { + int i; + + size_t size = sizeof(zend_property_info *) * ce->default_properties_count; + memcpy(ZCG(arena_mem), ce->properties_info_table, size); + ce->properties_info_table = ZCG(arena_mem); + ZCG(arena_mem) = (void*)((char*)ZCG(arena_mem) + ZEND_ALIGNED_SIZE(size)); + + for (i = 0; i < ce->default_properties_count; i++) { + ce->properties_info_table[i] = zend_shared_alloc_get_xlat_entry(ce->properties_info_table[i]); + } + } + if (ce->num_interfaces && !(ce->ce_flags & ZEND_ACC_LINKED)) { uint32_t i = 0; diff --git a/ext/opcache/zend_persist_calc.c b/ext/opcache/zend_persist_calc.c index 3761e9bf65059..a17d7c4627f6a 100644 --- a/ext/opcache/zend_persist_calc.c +++ b/ext/opcache/zend_persist_calc.c @@ -387,6 +387,10 @@ static void zend_persist_class_entry_calc(zval *zv) zend_hash_persist_calc(&ce->properties_info, zend_persist_property_info_calc); + if (ce->properties_info_table) { + ADD_ARENA_SIZE(sizeof(zend_property_info *) * ce->default_properties_count); + } + if (ce->num_interfaces) { uint32_t i; From 40540b71b9b70373d334ef4dda9bed21060fe43e Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:12:14 +0100 Subject: [PATCH 367/369] Fix ref source removal on object destruction --- .../typed_properties_093.phpt | 31 ++++++++++++++++ .../typed_properties_094.phpt | 36 +++++++++++++++++++ Zend/zend_objects.c | 11 +++--- 3 files changed, 71 insertions(+), 7 deletions(-) create mode 100644 Zend/tests/type_declarations/typed_properties_093.phpt create mode 100644 Zend/tests/type_declarations/typed_properties_094.phpt diff --git a/Zend/tests/type_declarations/typed_properties_093.phpt b/Zend/tests/type_declarations/typed_properties_093.phpt new file mode 100644 index 0000000000000..7335d656b26f1 --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_093.phpt @@ -0,0 +1,31 @@ +--TEST-- +Typed property assignment by ref with variable name +--FILE-- +$name =& $ref; +} catch (TypeError $e) { + echo $e->getMessage(), "\n"; +} +var_dump($test); + +?> +--EXPECT-- +Typed property Test::$prop must be int, string used +object(Test)#2 (1) { + ["prop"]=> + NULL +} diff --git a/Zend/tests/type_declarations/typed_properties_094.phpt b/Zend/tests/type_declarations/typed_properties_094.phpt new file mode 100644 index 0000000000000..0fbcb7ef5585a --- /dev/null +++ b/Zend/tests/type_declarations/typed_properties_094.phpt @@ -0,0 +1,36 @@ +--TEST-- +Edge cases relating to reference source tracking +--FILE-- +prop; +unset($b); +$r = "foo"; // ok + +class A2 { + private int $prop = 42; + + public function &getRef() { + return $this->prop; + } +} +class B2 extends A2 { + public $prop; +} + +$b2 = new B2; +$r2 =& $b2->getRef(); +unset($b2); +$r2 = "foo"; // ok + +?> +===DONE=== +--EXPECT-- +===DONE=== diff --git a/Zend/zend_objects.c b/Zend/zend_objects.c index c6dd952cb0d02..d3079c175255d 100644 --- a/Zend/zend_objects.c +++ b/Zend/zend_objects.c @@ -59,13 +59,10 @@ ZEND_API void zend_object_std_dtor(zend_object *object) do { if (Z_REFCOUNTED_P(p)) { if (UNEXPECTED(Z_ISREF_P(p))) { - zend_property_info *prop_info; - ZEND_REF_FOREACH_TYPE_SOURCES(Z_REF_P(p), prop_info) { - if (prop_info->ce == object->ce && p == OBJ_PROP(object, prop_info->offset)) { - ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); - break; /* stop iteration here, the array might be realloc()'ed */ - } - } ZEND_REF_FOREACH_TYPE_SOURCES_END(); + zend_property_info *prop_info = zend_get_property_info_for_slot(object, p); + if (prop_info->type) { + ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(p), prop_info); + } } i_zval_ptr_dtor(p); } From 93609556b33c724703ac4a2da89b39fafc16faae Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:14:13 +0100 Subject: [PATCH 368/369] Assert that all type sources have been removed when ref is dtored --- Zend/zend_variables.c | 1 + 1 file changed, 1 insertion(+) diff --git a/Zend/zend_variables.c b/Zend/zend_variables.c index c057390700fbd..d6e72362435ac 100644 --- a/Zend/zend_variables.c +++ b/Zend/zend_variables.c @@ -70,6 +70,7 @@ static void ZEND_FASTCALL zend_string_destroy(zend_string *str) static void ZEND_FASTCALL zend_reference_destroy(zend_reference *ref) { + ZEND_ASSERT(!ZEND_REF_HAS_TYPE_SOURCES(ref)); i_zval_ptr_dtor(&ref->val); efree_size(ref, sizeof(zend_reference)); } From 5f7d3769676d04160f83d9df9e08c1b24a49095a Mon Sep 17 00:00:00 2001 From: Nikita Popov Date: Mon, 7 Jan 2019 12:19:56 +0100 Subject: [PATCH 369/369] Use get_property_info_for slot while unsetting properties as well --- Zend/zend_object_handlers.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c index 9fa9988778a49..8f667628dd05c 100644 --- a/Zend/zend_object_handlers.c +++ b/Zend/zend_object_handlers.c @@ -1075,8 +1075,8 @@ ZEND_API void zend_std_unset_property(zval *object, zval *member, void **cache_s if (Z_TYPE_P(slot) != IS_UNDEF) { if (UNEXPECTED(Z_ISREF_P(slot)) && Z_REFCOUNT_P(slot) > 1) { - zend_property_info *prop_info = zend_object_fetch_property_type_info(zobj->ce, name, cache_slot); - if (UNEXPECTED(prop_info != NULL)) { + zend_property_info *prop_info = zend_get_property_info_for_slot(zobj, slot); + if (UNEXPECTED(prop_info->type)) { ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(slot), prop_info); } }