|
|
|
@ -377,7 +377,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
|
|
|
|
/* 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) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { |
|
|
|
&& 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); |
|
|
|
@ -391,7 +391,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
zval rv; |
|
|
|
|
|
|
|
if (Z_OBJ_HT_P(object)->read_property && |
|
|
|
(z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) { |
|
|
|
(z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv)) != NULL) { |
|
|
|
if (Z_TYPE_P(z) == IS_OBJECT && Z_OBJ_HT_P(z)->get) { |
|
|
|
zval rv; |
|
|
|
zval *value = Z_OBJ_HT_P(z)->get(z, &rv); |
|
|
|
@ -404,7 +404,7 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_obj_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
ZVAL_DEREF(z); |
|
|
|
SEPARATE_ZVAL_NOREF(z); |
|
|
|
binary_op(z, z, value); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, z, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL)); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, z, ((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), z); |
|
|
|
} |
|
|
|
@ -777,7 +777,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C |
|
|
|
/* 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) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { |
|
|
|
&& 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); |
|
|
|
@ -790,7 +790,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C |
|
|
|
zval rv; |
|
|
|
|
|
|
|
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { |
|
|
|
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL), &rv); |
|
|
|
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv); |
|
|
|
|
|
|
|
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) { |
|
|
|
zval rv; |
|
|
|
@ -807,7 +807,7 @@ ZEND_VM_HELPER_EX(zend_pre_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR|C |
|
|
|
if (UNEXPECTED(RETURN_VALUE_USED(opline))) { |
|
|
|
ZVAL_COPY(retval, z); |
|
|
|
} |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, z, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL)); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, z, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); |
|
|
|
zval_ptr_dtor(z); |
|
|
|
} else { |
|
|
|
zend_error(E_WARNING, "Attempt to increment/decrement property of non-object"); |
|
|
|
@ -864,7 +864,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
/* 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) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL))) != NULL)) { |
|
|
|
&& 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); |
|
|
|
ZVAL_COPY_VALUE(retval, zptr); |
|
|
|
@ -874,7 +874,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
} else { |
|
|
|
if (Z_OBJ_HT_P(object)->read_property && Z_OBJ_HT_P(object)->write_property) { |
|
|
|
zval rv; |
|
|
|
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL), &rv); |
|
|
|
zval *z = Z_OBJ_HT_P(object)->read_property(object, property, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL), &rv); |
|
|
|
zval z_copy; |
|
|
|
|
|
|
|
if (UNEXPECTED(Z_TYPE_P(z) == IS_OBJECT) && Z_OBJ_HT_P(z)->get) { |
|
|
|
@ -890,7 +890,7 @@ ZEND_VM_HELPER_EX(zend_post_incdec_property_helper, VAR|UNUSED|CV, CONST|TMPVAR| |
|
|
|
ZVAL_DUP(&z_copy, z); |
|
|
|
incdec_op(&z_copy); |
|
|
|
if (Z_REFCOUNTED_P(z)) Z_ADDREF_P(z); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, &z_copy, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL)); |
|
|
|
Z_OBJ_HT_P(object)->write_property(object, property, &z_copy, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property)) : NULL)); |
|
|
|
zval_ptr_dtor(&z_copy); |
|
|
|
zval_ptr_dtor(z); |
|
|
|
} else { |
|
|
|
@ -1131,7 +1131,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMPVAR|CV, UNUSED|CONST|V |
|
|
|
if (OP1_TYPE == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) { |
|
|
|
|
|
|
|
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))); |
|
|
|
retval = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1); |
|
|
|
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)) { |
|
|
|
@ -1438,7 +1438,7 @@ ZEND_VM_HANDLER(82, ZEND_FETCH_OBJ_R, CONST|TMP|VAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
|
|
|
|
if (OP2_TYPE == IS_CONST && |
|
|
|
EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) { |
|
|
|
uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + 1); |
|
|
|
uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*)); |
|
|
|
|
|
|
|
if (EXPECTED(prop_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { |
|
|
|
retval = OBJ_PROP(zobj, prop_offset); |
|
|
|
@ -1460,7 +1460,7 @@ 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)); |
|
|
|
} else { |
|
|
|
retval = zobj->handlers->read_property(container, offset, BP_VAR_R, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); |
|
|
|
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)); |
|
|
|
|
|
|
|
if (retval != EX_VAR(opline->result.var)) { |
|
|
|
ZVAL_COPY(EX_VAR(opline->result.var), retval); |
|
|
|
@ -1489,7 +1489,7 @@ ZEND_VM_HANDLER(85, ZEND_FETCH_OBJ_W, VAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); |
|
|
|
} |
|
|
|
|
|
|
|
zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); |
|
|
|
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)); |
|
|
|
@ -1513,7 +1513,7 @@ ZEND_VM_HANDLER(88, ZEND_FETCH_OBJ_RW, VAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { |
|
|
|
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); |
|
|
|
} |
|
|
|
zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + 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); |
|
|
|
FREE_OP2(); |
|
|
|
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { |
|
|
|
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); |
|
|
|
@ -1553,7 +1553,7 @@ ZEND_VM_HANDLER(91, ZEND_FETCH_OBJ_IS, CONST|TMPVAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
|
|
|
|
if (OP2_TYPE == IS_CONST && |
|
|
|
EXPECTED(zobj->ce == CACHED_PTR(Z_CACHE_SLOT_P(offset)))) { |
|
|
|
uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + 1); |
|
|
|
uint32_t prop_offset = (uint32_t)(intptr_t)CACHED_PTR(Z_CACHE_SLOT_P(offset) + sizeof(void*)); |
|
|
|
|
|
|
|
if (EXPECTED(prop_offset != ZEND_DYNAMIC_PROPERTY_OFFSET)) { |
|
|
|
retval = OBJ_PROP(zobj, prop_offset); |
|
|
|
@ -1575,7 +1575,7 @@ ZEND_VM_C_LABEL(fetch_obj_is_no_object): |
|
|
|
ZVAL_NULL(EX_VAR(opline->result.var)); |
|
|
|
} else { |
|
|
|
|
|
|
|
retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); |
|
|
|
retval = zobj->handlers->read_property(container, offset, BP_VAR_IS, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL), EX_VAR(opline->result.var)); |
|
|
|
|
|
|
|
if (retval != EX_VAR(opline->result.var)) { |
|
|
|
ZVAL_COPY(EX_VAR(opline->result.var), retval); |
|
|
|
@ -1609,7 +1609,7 @@ ZEND_VM_HANDLER(94, ZEND_FETCH_OBJ_FUNC_ARG, CONST|TMP|VAR|UNUSED|CV, CONST|TMPV |
|
|
|
if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { |
|
|
|
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); |
|
|
|
} |
|
|
|
zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property)) : NULL), BP_VAR_W); |
|
|
|
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)); |
|
|
|
@ -1635,7 +1635,7 @@ ZEND_VM_HANDLER(97, ZEND_FETCH_OBJ_UNSET, VAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
if (OP1_TYPE == IS_VAR && UNEXPECTED(container == NULL)) { |
|
|
|
zend_error_noreturn(E_ERROR, "Cannot use string offset as an object"); |
|
|
|
} |
|
|
|
zend_fetch_property_address(EX_VAR(opline->result.var), container, OP1_TYPE, property, OP2_TYPE, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + 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); |
|
|
|
FREE_OP2(); |
|
|
|
if (OP1_TYPE == IS_VAR && READY_TO_DESTROY(free_op1)) { |
|
|
|
EXTRACT_ZVAL_PTR(EX_VAR(opline->result.var)); |
|
|
|
@ -1696,7 +1696,7 @@ ZEND_VM_HANDLER(136, ZEND_ASSIGN_OBJ, VAR|UNUSED|CV, CONST|TMPVAR|CV) |
|
|
|
if (OP1_TYPE == IS_VAR && UNEXPECTED(object == NULL)) { |
|
|
|
zend_error_noreturn(E_ERROR, "Cannot use string offset as an array"); |
|
|
|
} |
|
|
|
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, OP1_TYPE, property_name, OP2_TYPE, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(property_name)) : NULL)); |
|
|
|
zend_assign_to_object(UNEXPECTED(RETURN_VALUE_USED(opline)) ? EX_VAR(opline->result.var) : NULL, object, OP1_TYPE, property_name, OP2_TYPE, (opline+1)->op1_type, (opline+1)->op1, execute_data, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(property_name)) : NULL)); |
|
|
|
FREE_OP2(); |
|
|
|
FREE_OP1_VAR_PTR(); |
|
|
|
/* assign_obj has two opcodes! */ |
|
|
|
@ -4659,7 +4659,7 @@ ZEND_VM_HANDLER(76, ZEND_UNSET_OBJ, VAR|UNUSED|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) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(offset)) : NULL)); |
|
|
|
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"); |
|
|
|
} |
|
|
|
@ -5321,7 +5321,7 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMPVAR|CV, UNUSED|CONST|VAR) |
|
|
|
if (OP1_TYPE == IS_CONST && CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)))) { |
|
|
|
|
|
|
|
ce = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1))); |
|
|
|
value = CACHED_PTR(Z_CACHE_SLOT_P(EX_CONSTANT(opline->op1)) + 1); |
|
|
|
value = 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)) { |
|
|
|
@ -5528,7 +5528,7 @@ ZEND_VM_HANDLER(148, ZEND_ISSET_ISEMPTY_PROP_OBJ, CONST|TMPVAR|UNUSED|CV, CONST| |
|
|
|
ZEND_VM_C_LABEL(isset_no_object): |
|
|
|
result = ((opline->extended_value & ZEND_ISSET) == 0); |
|
|
|
} else { |
|
|
|
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? (EX_RUN_TIME_CACHE() + Z_CACHE_SLOT_P(offset)) : NULL)); |
|
|
|
result = Z_OBJ_HT_P(container)->has_property(container, offset, (opline->extended_value & ZEND_ISSET) == 0, ((OP2_TYPE == IS_CONST) ? CACHE_ADDR(Z_CACHE_SLOT_P(offset)) : NULL)); |
|
|
|
if ((opline->extended_value & ZEND_ISSET) == 0) { |
|
|
|
result = !result; |
|
|
|
} |
|
|
|
|