summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDmitry Stogov <dmitry@zend.com>2019-06-06 14:10:23 +0300
committerDmitry Stogov <dmitry@zend.com>2019-06-06 14:10:23 +0300
commitdbd1ecd09f26015451063c6d545c9ab929a12129 (patch)
tree4e8c026628bd257c7b30d9fd3891693c004e8215
parent3820296c42e146cc080bc24314ccdfdd700e743e (diff)
parentbe74ca497680ef544af1f650fe4717a3e0d0af67 (diff)
downloadphp-git-dbd1ecd09f26015451063c6d545c9ab929a12129.tar.gz
Merge branch 'PHP-7.4'
* PHP-7.4: Support for exceptions thrown during "Array to string conversion" error processing Reduce over-specialization for quite seldom instructions
-rw-r--r--Zend/zend_execute.c85
-rw-r--r--Zend/zend_operators.c3
-rw-r--r--Zend/zend_vm_def.h87
-rw-r--r--Zend/zend_vm_execute.h1260
4 files changed, 378 insertions, 1057 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 515ac3ba3e..60323ad854 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -585,6 +585,19 @@ static inline void zend_assign_to_variable_reference(zval *variable_ptr, zval *v
ZVAL_REF(variable_ptr, ref);
}
+static zend_never_inline zval* zend_assign_to_typed_property_reference(zend_property_info *prop_info, zval *prop, zval *value_ptr)
+{
+ if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
+ return &EG(uninitialized_zval);
+ }
+ if (Z_ISREF_P(prop)) {
+ ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info);
+ }
+ zend_assign_to_variable_reference(prop, value_ptr);
+ ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info);
+ return prop;
+}
+
static zend_never_inline ZEND_COLD int zend_wrong_assign_to_variable_reference(zval *variable_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
{
zend_error(E_NOTICE, "Only variables should be assigned by reference");
@@ -2744,6 +2757,78 @@ static zend_always_inline void zend_fetch_property_address(zval *result, zval *c
}
}
+static zend_always_inline void zend_assign_to_property_reference(zval *container, uint32_t container_op_type, zval *prop_ptr, uint32_t prop_op_type, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zval variable, *variable_ptr = &variable;
+ void **cache_addr = (prop_op_type == IS_CONST) ? CACHE_ADDR(opline->extended_value & ~ZEND_RETURNS_FUNCTION) : NULL;
+
+ zend_fetch_property_address(variable_ptr, container, container_op_type, prop_ptr, prop_op_type,
+ cache_addr, BP_VAR_W, 0, 0 OPLINE_CC EXECUTE_DATA_CC);
+
+ if (Z_TYPE_P(variable_ptr) == IS_INDIRECT) {
+ variable_ptr = Z_INDIRECT_P(variable_ptr);
+ }
+
+ 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");
+ variable_ptr = &EG(uninitialized_zval);
+ } 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))) {
+
+ if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
+ variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
+ variable_ptr = &EG(uninitialized_zval);
+ }
+ } else {
+ zend_property_info *prop_info = NULL;
+
+ if (prop_op_type == IS_CONST) {
+ prop_info = (zend_property_info *) CACHED_PTR_EX(cache_addr + 2);
+ } else {
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(container), variable_ptr);
+ }
+
+ if (UNEXPECTED(prop_info)) {
+ variable_ptr = zend_assign_to_typed_property_reference(prop_info, variable_ptr, value_ptr);
+ } else {
+ zend_assign_to_variable_reference(variable_ptr, value_ptr);
+ }
+ }
+
+ if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
+ ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+}
+
+static zend_never_inline void zend_assign_to_property_reference_this_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_UNUSED, prop_ptr, IS_CONST, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_var_const(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_CONST, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_this_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_CONST, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
+static zend_never_inline void zend_assign_to_property_reference_var_var(zval *container, zval *prop_ptr, zval *value_ptr OPLINE_DC EXECUTE_DATA_DC)
+{
+ zend_assign_to_property_reference(container, IS_VAR, prop_ptr, IS_VAR, value_ptr
+ OPLINE_CC EXECUTE_DATA_CC);
+}
+
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;
diff --git a/Zend/zend_operators.c b/Zend/zend_operators.c
index 4c5a3e4ce7..dc04548757 100644
--- a/Zend/zend_operators.c
+++ b/Zend/zend_operators.c
@@ -870,7 +870,8 @@ try_again:
}
case IS_ARRAY:
zend_error(E_NOTICE, "Array to string conversion");
- return ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
+ return (try && UNEXPECTED(EG(exception))) ?
+ NULL : ZSTR_KNOWN(ZEND_STR_ARRAY_CAPITALIZED);
case IS_OBJECT: {
zval tmp;
if (Z_OBJ_HT_P(op)->cast_object) {
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 901275903c..fd277630e2 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -2689,11 +2689,7 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -2705,59 +2701,24 @@ ZEND_VM_HANDLER(200, ZEND_ASSIGN_OBJ_REF, VAR|UNUSED|THIS|CV, CONST|TMPVAR|CV, C
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (OP1_TYPE == IS_UNUSED) {
+ if (OP2_TYPE == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (OP2_TYPE == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, OP1_TYPE, property, OP2_TYPE, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
FREE_OP1_VAR_PTR();
@@ -2790,22 +2751,10 @@ ZEND_VM_HANDLER(202, ZEND_ASSIGN_STATIC_PROP_REF, ANY, ANY, CACHE_SLOT|SRC)
if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
prop = &EG(uninitialized_zval);
}
+ } else if (UNEXPECTED(prop_info->type)) {
+ prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr);
} else {
- do {
- if (UNEXPECTED(prop_info->type)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- prop = &EG(uninitialized_zval);
- break;
- }
- if (Z_ISREF_P(prop)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info);
- }
- }
- zend_assign_to_variable_reference(prop, value_ptr);
- if (prop_info->type) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info);
- }
- } while (0);
+ zend_assign_to_variable_reference(prop, value_ptr);
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index ca578999fd..17476f3a33 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -824,22 +824,10 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_STATIC_PROP_REF_SPEC_HA
if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(prop, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
prop = &EG(uninitialized_zval);
}
+ } else if (UNEXPECTED(prop_info->type)) {
+ prop = zend_assign_to_typed_property_reference(prop_info, prop, value_ptr);
} else {
- do {
- if (UNEXPECTED(prop_info->type)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- prop = &EG(uninitialized_zval);
- break;
- }
- if (Z_ISREF_P(prop)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(prop), prop_info);
- }
- }
- zend_assign_to_variable_reference(prop, value_ptr);
- if (prop_info->type) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(prop), prop_info);
- }
- } while (0);
+ zend_assign_to_variable_reference(prop, value_ptr);
}
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
@@ -23548,11 +23536,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -23564,59 +23548,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -23630,11 +23579,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -23646,59 +23591,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CONST_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -26176,11 +26086,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -26192,59 +26098,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -26258,11 +26129,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR
{
USE_OPLINE
zend_free_op free_op1, free_op2;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -26274,59 +26141,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_TMPVAR
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -30476,11 +30308,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -30492,59 +30320,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -30558,11 +30351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_
{
USE_OPLINE
zend_free_op free_op1;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -30574,59 +30363,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_VAR_CV_OP_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_VAR == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_VAR, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
@@ -32648,11 +32402,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON
{
USE_OPLINE
zend_free_op free_op_data;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -32664,59 +32414,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -32729,11 +32444,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON
{
USE_OPLINE
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -32745,59 +32456,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CON
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -34748,11 +34424,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -34764,59 +34436,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
zval_ptr_dtor_nogc(free_op2);
@@ -34829,11 +34466,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP
{
USE_OPLINE
zend_free_op free_op2;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -34845,59 +34478,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_TMP
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
zval_ptr_dtor_nogc(free_op2);
@@ -37513,11 +37111,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_
{
USE_OPLINE
zend_free_op free_op_data;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -37529,59 +37123,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -37594,11 +37153,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_
{
USE_OPLINE
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -37610,59 +37165,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_UNUSED_CV_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_UNUSED == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_UNUSED, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -42839,11 +42359,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O
{
USE_OPLINE
zend_free_op free_op_data;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -42855,59 +42371,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -42920,11 +42401,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O
{
USE_OPLINE
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -42936,59 +42413,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CONST_O
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CONST == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CONST, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -46867,11 +46309,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_
{
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;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -46883,59 +46321,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
zval_ptr_dtor_nogc(free_op2);
@@ -46948,11 +46351,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_
{
USE_OPLINE
zend_free_op free_op2;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -46964,59 +46363,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_TMPVAR_
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, (IS_TMP_VAR|IS_VAR), value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
zval_ptr_dtor_nogc(free_op2);
@@ -52677,11 +52041,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D
{
USE_OPLINE
zend_free_op free_op_data;
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -52693,59 +52053,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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))) {
-
- if (UNEXPECTED(!zend_wrong_assign_to_variable_reference(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
@@ -52758,11 +52083,7 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D
{
USE_OPLINE
- zval *property;
- zval *container;
- zval variable, *variable_ptr = &variable;
- zval *value_ptr;
- void **cache_addr;
+ zval *property, *container, *value_ptr;
SAVE_OPLINE();
@@ -52774,59 +52095,24 @@ static ZEND_OPCODE_HANDLER_RET ZEND_FASTCALL ZEND_ASSIGN_OBJ_REF_SPEC_CV_CV_OP_D
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, 0 OPLINE_CC EXECUTE_DATA_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)) {
- zend_throw_error(NULL, "Cannot assign by reference to overloaded object");
- variable_ptr = &EG(uninitialized_zval);
- } 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(
- variable_ptr, value_ptr OPLINE_CC EXECUTE_DATA_CC))) {
- variable_ptr = &EG(uninitialized_zval);
- }
- } else {
- zend_property_info *prop_info = NULL;
-
- 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_OBJ_P(container), variable_ptr);
- }
-
- do {
- if (UNEXPECTED(prop_info)) {
- if (!zend_verify_prop_assignable_by_ref(prop_info, value_ptr, EX_USES_STRICT_TYPES())) {
- variable_ptr = &EG(uninitialized_zval);
- break;
- }
-
- if (Z_ISREF_P(variable_ptr)) {
- ZEND_REF_DEL_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
- }
+ if (ZEND_VM_SPEC) {
+ if (IS_CV == IS_UNUSED) {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_this_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_this_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- zend_assign_to_variable_reference(variable_ptr, value_ptr);
- if (prop_info) {
- ZEND_REF_ADD_TYPE_SOURCE(Z_REF_P(variable_ptr), prop_info);
+ } else {
+ if (IS_CV == IS_CONST) {
+ zend_assign_to_property_reference_var_const(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
+ } else {
+ zend_assign_to_property_reference_var_var(container, property, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}
- } while (0);
- }
-
- if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
- ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
+ }
+ } else {
+ zend_assign_to_property_reference(container, IS_CV, property, IS_CV, value_ptr OPLINE_CC EXECUTE_DATA_CC);
}