|
|
|
@ -811,7 +811,9 @@ ZEND_VM_HELPER(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, |
|
|
|
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"); |
|
|
|
zend_string *property_name = zval_get_string(property); |
|
|
|
zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
@ -1070,7 +1072,9 @@ ZEND_VM_HELPER(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, |
|
|
|
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 increment/decrement property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(property); |
|
|
|
zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
@ -1147,7 +1151,9 @@ ZEND_VM_HELPER(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|CV, |
|
|
|
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 increment/decrement property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(property); |
|
|
|
zend_error(E_WARNING, "Attempt to increment/decrement property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
break; |
|
|
|
} |
|
|
|
@ -1802,8 +1808,11 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|THIS|CV, CONST|TMPVAR |
|
|
|
} |
|
|
|
|
|
|
|
if (UNEXPECTED(zobj->handlers->read_property == NULL)) { |
|
|
|
zend_string *property_name; |
|
|
|
ZEND_VM_C_LABEL(fetch_obj_r_no_object): |
|
|
|
zend_error(E_NOTICE, "Trying to get property of non-object"); |
|
|
|
property_name = zval_get_string(offset); |
|
|
|
zend_error(E_NOTICE, "Trying to get property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
} 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)); |
|
|
|
@ -2014,7 +2023,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( |
|
|
|
{ |
|
|
|
USE_OPLINE |
|
|
|
zend_free_op free_op1, free_op2, free_op_data; |
|
|
|
zval *object, *property_name, *value, tmp; |
|
|
|
zval *object, *property, *value, tmp; |
|
|
|
|
|
|
|
SAVE_OPLINE(); |
|
|
|
object = GET_OP1_OBJ_ZVAL_PTR_PTR_UNDEF(BP_VAR_W); |
|
|
|
@ -2023,7 +2032,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( |
|
|
|
ZEND_VM_DISPATCH_TO_HELPER(zend_this_not_in_object_context_helper); |
|
|
|
} |
|
|
|
|
|
|
|
property_name = GET_OP2_ZVAL_PTR(BP_VAR_R); |
|
|
|
property = GET_OP2_ZVAL_PTR(BP_VAR_R); |
|
|
|
value = GET_OP_DATA_ZVAL_PTR(BP_VAR_R); |
|
|
|
|
|
|
|
if (OP1_TYPE != IS_UNUSED && UNEXPECTED(Z_TYPE_P(object) != IS_OBJECT)) { |
|
|
|
@ -2055,7 +2064,9 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, SPEC( |
|
|
|
Z_DELREF_P(object); |
|
|
|
} else { |
|
|
|
if (OP1_TYPE != IS_VAR || EXPECTED(!Z_ISERROR_P(object))) { |
|
|
|
zend_error(E_WARNING, "Attempt to assign property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(property); |
|
|
|
zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
} |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
@ -2067,16 +2078,16 @@ 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*)); |
|
|
|
EXPECTED(Z_OBJCE_P(object) == CACHED_PTR(Z_CACHE_SLOT_P(property)))) { |
|
|
|
uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(property) + sizeof(void*)); |
|
|
|
zend_object *zobj = Z_OBJ_P(object); |
|
|
|
zval *property; |
|
|
|
zval *property_val; |
|
|
|
|
|
|
|
if (EXPECTED(prop_offset != (uint32_t)ZEND_DYNAMIC_PROPERTY_OFFSET)) { |
|
|
|
property = OBJ_PROP(zobj, prop_offset); |
|
|
|
if (Z_TYPE_P(property) != IS_UNDEF) { |
|
|
|
property_val = OBJ_PROP(zobj, prop_offset); |
|
|
|
if (Z_TYPE_P(property_val) != IS_UNDEF) { |
|
|
|
ZEND_VM_C_LABEL(fast_assign_obj): |
|
|
|
value = zend_assign_to_variable(property, value, OP_DATA_TYPE); |
|
|
|
value = zend_assign_to_variable(property_val, value, OP_DATA_TYPE); |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_COPY(EX_VAR(opline->result.var), value); |
|
|
|
} |
|
|
|
@ -2090,8 +2101,8 @@ ZEND_VM_C_LABEL(fast_assign_obj): |
|
|
|
} |
|
|
|
zobj->properties = zend_array_dup(zobj->properties); |
|
|
|
} |
|
|
|
property = zend_hash_find(zobj->properties, Z_STR_P(property_name)); |
|
|
|
if (property) { |
|
|
|
property_val = zend_hash_find(zobj->properties, Z_STR_P(property)); |
|
|
|
if (property_val) { |
|
|
|
ZEND_VM_C_GOTO(fast_assign_obj); |
|
|
|
} |
|
|
|
} |
|
|
|
@ -2129,7 +2140,7 @@ ZEND_VM_C_LABEL(fast_assign_obj): |
|
|
|
Z_ADDREF_P(value); |
|
|
|
} |
|
|
|
} |
|
|
|
zend_hash_add_new(zobj->properties, Z_STR_P(property_name), value); |
|
|
|
zend_hash_add_new(zobj->properties, Z_STR_P(property), value); |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_COPY(EX_VAR(opline->result.var), value); |
|
|
|
} |
|
|
|
@ -2139,7 +2150,9 @@ ZEND_VM_C_LABEL(fast_assign_obj): |
|
|
|
} |
|
|
|
|
|
|
|
if (!Z_OBJ_HT_P(object)->write_property) { |
|
|
|
zend_error(E_WARNING, "Attempt to assign property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(property); |
|
|
|
zend_error(E_WARNING, "Attempt to assign property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
} |
|
|
|
@ -2151,7 +2164,7 @@ 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); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, value, (OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL); |
|
|
|
|
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_COPY(EX_VAR(opline->result.var), value); |
|
|
|
@ -5597,7 +5610,9 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV) |
|
|
|
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 { |
|
|
|
zend_error(E_NOTICE, "Trying to unset property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(offset); |
|
|
|
zend_error(E_NOTICE, "Trying to unset property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
} |
|
|
|
} while (0); |
|
|
|
|
|
|
|
@ -6489,7 +6504,9 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|THIS|CV, C |
|
|
|
} |
|
|
|
} |
|
|
|
if (UNEXPECTED(!Z_OBJ_HT_P(container)->has_property)) { |
|
|
|
zend_error(E_NOTICE, "Trying to check property of non-object"); |
|
|
|
zend_string *property_name = zval_get_string(offset); |
|
|
|
zend_error(E_NOTICE, "Trying to check property '%s' of non-object", ZSTR_VAL(property_name)); |
|
|
|
zend_string_release(property_name); |
|
|
|
ZEND_VM_C_LABEL(isset_no_object): |
|
|
|
result = ((opline->extended_value & ZEND_ISSET) == 0); |
|
|
|
} else { |
|
|
|
|