From: Dmitry Stogov Date: Wed, 21 Feb 2018 15:43:38 +0000 (+0300) Subject: Reorganize make_real_object() related code X-Git-Tag: php-7.3.0alpha1~318 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=927748b2716f4f01cdbcc52c4ae8ecd52d6b185f;p=php Reorganize make_real_object() related code --- diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 93f6334ecc..b7a007e8fa 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -648,12 +648,15 @@ static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(z return 1; } -static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_assignment(zval *property) +static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_wrong_property_assignment(zval *property OPLINE_DC EXECUTE_DATA_DC) { zend_string *tmp_property_name; zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name)); zend_tmp_string_release(property_name); + if (UNEXPECTED(RETURN_VALUE_USED(opline))) { + ZVAL_NULL(EX_VAR(opline->result.var)); + } } /* this should modify object only if it's empty */ @@ -667,17 +670,18 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje zval_ptr_dtor_nogc(object); } else { if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { + zend_string *tmp_property_name; + zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); + if (opline->opcode == ZEND_PRE_INC_OBJ || opline->opcode == ZEND_PRE_DEC_OBJ || opline->opcode == ZEND_POST_INC_OBJ || opline->opcode == ZEND_POST_DEC_OBJ) { - zend_string *tmp_property_name; - zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name)); - zend_tmp_string_release(property_name); } else { - zend_wrong_property_assignment(property); + zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name)); } + zend_tmp_string_release(property_name); } if (UNEXPECTED(RETURN_VALUE_USED(opline))) { ZVAL_NULL(EX_VAR(opline->result.var)); @@ -700,6 +704,25 @@ static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object(zval *obje return 1; } +static zend_never_inline ZEND_COLD int ZEND_FASTCALL make_real_object_rw(zval *object, zval *property) +{ + if (EXPECTED(Z_TYPE_P(object) <= IS_FALSE)) { + /* nothing to destroy */ + } else if (EXPECTED((Z_TYPE_P(object) == IS_STRING && Z_STRLEN_P(object) == 0))) { + zval_ptr_dtor_nogc(object); + } else { + if (opline->op1_type != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { + zend_string *tmp_property_name; + zend_string *property_name = zval_get_tmp_string(property, &tmp_property_name); + zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name)); + zend_tmp_string_release(property_name); + } + return 0; + } + object_init(object); + return 1; +} + static ZEND_COLD void zend_verify_type_error_common( const zend_function *zf, const zend_arg_info *arg_info, const zend_class_entry *ce, zval *value, @@ -1654,14 +1677,6 @@ static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_use_new_element_for_s zend_throw_error(NULL, "[] operator not supported for strings"); } -static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_modify_property_of_non_object(zval *property) -{ - zend_string *tmp; - zend_string *property_name = zval_get_tmp_string(property, &tmp); - zend_error(E_WARNING, "Attempt to modify property '%s' of non-object", ZSTR_VAL(property_name)); - zend_tmp_string_release(tmp); -} - static zend_never_inline ZEND_COLD void ZEND_FASTCALL zend_access_undefined_propery_in_overloaded_object(void) { zend_throw_error(NULL, "Cannot access undefined property for object with overloaded property access"); @@ -2195,15 +2210,8 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c } /* this should modify object only if it's empty */ - if (type != BP_VAR_UNSET && - EXPECTED(Z_TYPE_P(container) <= IS_FALSE || - (Z_TYPE_P(container) == IS_STRING && Z_STRLEN_P(container)==0))) { - zval_ptr_dtor_nogc(container); - object_init(container); - } else { - if (container_op_type != IS_VAR || EXPECTED(!Z_ISERROR_P(container))) { - zend_modify_property_of_non_object(prop_ptr); - } + if (type == BP_VAR_UNSET || + UNEXPECTED(!make_real_object_rw(container, prop_ptr))) { ZVAL_ERROR(result); return; } diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index 730d1d60df..c6500239ea 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -2180,10 +2180,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); FREE_OP_DATA(); ZEND_VM_C_GOTO(exit_assign_obj); } diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h index 79e69c71bb..56b6a3756f 100644 --- a/Zend/zend_vm_execute.h +++ b/Zend/zend_vm_execute.h @@ -23143,10 +23143,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -23267,10 +23264,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -23391,10 +23385,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -23515,10 +23506,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -25431,10 +25419,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -25555,10 +25540,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25679,10 +25661,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -25803,10 +25782,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -29152,10 +29128,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -29276,10 +29249,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -29400,10 +29370,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -29524,10 +29491,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -31491,10 +31455,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -31615,10 +31576,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -31739,10 +31697,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -31863,10 +31818,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -33244,10 +33196,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -33368,10 +33317,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33492,10 +33438,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -33616,10 +33559,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -35624,10 +35564,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -35748,10 +35685,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35872,10 +35806,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -35996,10 +35927,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -40221,10 +40149,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -40345,10 +40270,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40469,10 +40391,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -40593,10 +40512,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -43910,10 +43826,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -44034,10 +43947,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -44158,10 +44068,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -44282,10 +44189,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -49458,10 +49362,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; } @@ -49582,10 +49483,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -49706,10 +49604,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); zval_ptr_dtor_nogc(free_op_data); goto exit_assign_obj; } @@ -49830,10 +49725,7 @@ fast_assign_obj: } if (!Z_OBJ_HT_P(object)->write_property) { - zend_wrong_property_assignment(property); - if (UNEXPECTED(RETURN_VALUE_USED(opline))) { - ZVAL_NULL(EX_VAR(opline->result.var)); - } + zend_wrong_property_assignment(property OPLINE_CC EXECUTE_DATA_CC); goto exit_assign_obj; }