zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if (IS_CONST == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- HANDLE_EXCEPTION();
+ do {
+ if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
- zval_ptr_dtor_nogc(free_op2);
- FREE_OP(free_op_data1);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- HANDLE_EXCEPTION();
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- HANDLE_EXCEPTION();
+ do {
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
-
- if (IS_CV == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
- if (UNEXPECTED(free_op1)) {zval_ptr_dtor_nogc(free_op1);};
- HANDLE_EXCEPTION();
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if (IS_CONST == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if (IS_CV == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
-
- if (IS_CONST == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CONST == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
-
- HANDLE_EXCEPTION();
+ do {
+ if (IS_CONST != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
-
- if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if ((IS_TMP_VAR|IS_VAR) == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
- zval_ptr_dtor_nogc(free_op2);
- FREE_OP(free_op_data1);
-
- HANDLE_EXCEPTION();
+ do {
+ if ((IS_TMP_VAR|IS_VAR) != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
zval *prop, *value;
zend_property_info *prop_info;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
SAVE_OPLINE();
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data);
- if (UNEXPECTED(Z_ISREF_P(prop))) {
- ref = Z_REF_P(prop);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- prop = Z_REFVAL_P(prop);
- }
-
- if (UNEXPECTED(prop_info->type || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(prop))) {
+ ref = Z_REF_P(prop);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ prop = Z_REFVAL_P(prop);
+ }
- binary_op(&z_copy, prop, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(prop);
- ZVAL_COPY_VALUE(prop, &z_copy);
+ if (UNEXPECTED(prop_info->type)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, prop, value, binary_op);
} else {
- zval_ptr_dtor(&z_copy);
+ binary_op(prop, prop, value);
}
- } else {
- binary_op(prop, prop, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), prop);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
-
- HANDLE_EXCEPTION();
+ do {
+ if (IS_UNUSED != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
} else {
zval *orig_zptr = zptr;
zend_reference *ref;
- zend_bool is_typed_ref = 0;
-
- if (UNEXPECTED(Z_ISREF_P(zptr))) {
- ref = Z_REF_P(zptr);
- is_typed_ref = ZEND_REF_HAS_TYPE_SOURCES(ref);
- zptr = Z_REFVAL_P(zptr);
- }
- if (IS_CV == IS_CONST) {
- prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
- } else {
- prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
- }
- if (UNEXPECTED(prop_info || is_typed_ref)) {
- /* special case for typed properties */
- zval z_copy;
+ do {
+ if (UNEXPECTED(Z_ISREF_P(zptr))) {
+ ref = Z_REF_P(zptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ zptr = Z_REFVAL_P(zptr);
+ }
- binary_op(&z_copy, zptr, value);
- if (EXPECTED(is_typed_ref ? zend_verify_ref_assignable_zval(ref, &z_copy, EX_USES_STRICT_TYPES()) : zend_verify_property_type(prop_info, &z_copy, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(zptr);
- ZVAL_COPY_VALUE(zptr, &z_copy);
+ if (IS_CV == IS_CONST) {
+ prop_info = (zend_property_info*)CACHED_PTR_EX(cache_slot + 2);
} else {
- zval_ptr_dtor(&z_copy);
+ prop_info = zend_object_fetch_property_type_info(Z_OBJ_P(object), orig_zptr);
}
- } else {
- binary_op(zptr, zptr, value);
- }
+ if (UNEXPECTED(prop_info)) {
+ /* special case for typed properties */
+ zend_binary_assign_op_typed_prop(prop_info, zptr, value, binary_op);
+ } else {
+ binary_op(zptr, zptr, value);
+ }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), zptr);
value = get_op_data_zval_ptr_r((opline+1)->op1_type, (opline+1)->op1, &free_op_data1);
- if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
- zend_reference *ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
- if (EXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
-
- FREE_OP(free_op_data1);
-
- HANDLE_EXCEPTION();
+ do {
+ if (IS_CV != IS_UNUSED && UNEXPECTED(Z_ISREF_P(var_ptr))) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ var_ptr = Z_REFVAL_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
}
- } else {
- binary_op(var_ptr, var_ptr, value);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);
ZVAL_NULL(EX_VAR(opline->result.var));
}
} else {
- zend_reference *ref = NULL;
- if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
- ref = Z_REF_P(var_ptr);
- var_ptr = Z_REFVAL_P(var_ptr);
- }
-
- if (UNEXPECTED(ref && ZEND_REF_HAS_TYPE_SOURCES(ref))) {
- zval tmp;
- binary_op(&tmp, var_ptr, value);
-
- if (UNEXPECTED(zend_verify_ref_assignable_zval(ref, &tmp, EX_USES_STRICT_TYPES()))) {
- zval_ptr_dtor(var_ptr);
- ZVAL_COPY_VALUE(var_ptr, &tmp);
- } else {
- zval_ptr_dtor(&tmp);
+ do {
+ if (UNEXPECTED(Z_TYPE_P(var_ptr) == IS_REFERENCE)) {
+ zend_reference *ref = Z_REF_P(var_ptr);
+ if (UNEXPECTED(ZEND_REF_HAS_TYPE_SOURCES(ref))) {
+ zend_binary_assign_op_typed_ref(ref, value, binary_op);
+ break;
+ }
+ var_ptr = Z_REFVAL_P(var_ptr);
}
- } else {
binary_op(var_ptr, var_ptr, value);
- }
+ } while (0);
if (UNEXPECTED(RETURN_VALUE_USED(opline))) {
ZVAL_COPY(EX_VAR(opline->result.var), var_ptr);