summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h429
1 files changed, 257 insertions, 172 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index f2ebf3f7ee..5284ffb8fb 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -681,8 +681,8 @@ static int ZEND_FASTCALL ZEND_DO_FCALL_BY_NAME_SPEC_HANDLER(ZEND_OPCODE_HANDLER
static int ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
/* Close the generator to free up resources */
zend_generator_close(generator, 1 TSRMLS_CC);
@@ -693,8 +693,6 @@ static int ZEND_FASTCALL ZEND_GENERATOR_RETURN_SPEC_HANDLER(ZEND_OPCODE_HANDLER
static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
{
-//???
-#if 0
USE_OPLINE
zend_free_op free_op1;
zval *args;
@@ -713,14 +711,13 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
ZEND_VM_STACK_GROW_IF_NEEDED(zend_hash_num_elements(ht));
for (zend_hash_internal_pointer_reset_ex(ht, &pos);
- (arg = zend_hash_get_current_data_ex(ht, &pos) != NULL;
+ (arg = zend_hash_get_current_data_ex(ht, &pos)) != NULL;
zend_hash_move_forward_ex(ht, &pos), ++arg_num
) {
- char *name;
- zend_uint name_len;
+ zend_string *name;
zend_ulong index;
- if (zend_hash_get_current_key_ex(ht, &name, &name_len, &index, 0, &pos) == HASH_KEY_IS_STRING) {
+ if (zend_hash_get_current_key_ex(ht, &name, &index, 0, &pos) == HASH_KEY_IS_STRING) {
zend_error(E_RECOVERABLE_ERROR, "Cannot unpack array with string keys");
FREE_OP(free_op1);
CHECK_EXCEPTION();
@@ -731,9 +728,9 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
SEPARATE_ZVAL_TO_MAKE_IS_REF(arg);
Z_ADDREF_P(arg);
} else if (Z_ISREF_P(arg)) {
- ZVAL_DUP(arg, Z_REFVAL_P(arg);
+ ZVAL_DUP(arg, Z_REFVAL_P(arg));
} else {
- Z_ADDREF_P(arg);
+ if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
}
zend_vm_stack_push(arg TSRMLS_CC);
@@ -755,7 +752,7 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
FREE_OP(free_op1);
if (!EG(exception)) {
zend_throw_exception_ex(
- NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name
+ NULL, 0 TSRMLS_CC, "Object of type %s did not create an Iterator", ce->name->val
);
}
HANDLE_EXCEPTION();
@@ -769,13 +766,13 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
}
for (; iter->funcs->valid(iter TSRMLS_CC) == SUCCESS; ++arg_num) {
- zval **arg_ptr, *arg;
+ zval *arg;
if (UNEXPECTED(EG(exception) != NULL)) {
goto unpack_iter_dtor;
}
- iter->funcs->get_current_data(iter, &arg_ptr TSRMLS_CC);
+ arg = iter->funcs->get_current_data(iter TSRMLS_CC);
if (UNEXPECTED(EG(exception) != NULL)) {
goto unpack_iter_dtor;
}
@@ -801,18 +798,18 @@ static int ZEND_FASTCALL ZEND_SEND_UNPACK_SPEC_HANDLER(ZEND_OPCODE_HANDLER_ARGS
zend_error(
E_WARNING, "Cannot pass by-reference argument %d of %s%s%s()"
" by unpacking a Traversable, passing by-value instead", arg_num,
- EX(call)->fbc->common.scope ? EX(call)->fbc->common.scope->name : "",
+ EX(call)->fbc->common.scope ? EX(call)->fbc->common.scope->name->val : "",
EX(call)->fbc->common.scope ? "::" : "",
- EX(call)->fbc->common.function_name
+ EX(call)->fbc->common.function_name->val
);
}
- if (Z_ISREF_PP(arg_ptr)) {
- ALLOC_ZVAL(arg);
- MAKE_COPY_ZVAL(arg_ptr, arg);
+ if (Z_ISREF_P(arg)) {
+//??? ALLOC_ZVAL(arg);
+//??? MAKE_COPY_ZVAL(arg_ptr, arg);
+ ZVAL_DUP(arg, Z_REFVAL_P(arg));
} else {
- arg = *arg_ptr;
- Z_ADDREF_P(arg);
+ if (Z_REFCOUNTED_P(arg)) Z_ADDREF_P(arg);
}
ZEND_VM_STACK_GROW_IF_NEEDED(1);
@@ -835,7 +832,6 @@ unpack_iter_dtor:
FREE_OP(free_op1);
CHECK_EXCEPTION();
-#endif
ZEND_VM_NEXT_OPCODE();
}
@@ -889,7 +885,7 @@ static int ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_AR
SAVE_OPLINE();
params = _get_zval_ptr_cv_BP_VAR_W(execute_data, opline->result.var TSRMLS_CC);
- Z_DELREF_P(params);
+ if (Z_REFCOUNTED_P(params)) Z_DELREF_P(params);
if (arg_num <= arg_count) {
array_init_size(params, arg_count - arg_num + 1);
@@ -900,6 +896,10 @@ static int ZEND_FASTCALL ZEND_RECV_VARIADIC_SPEC_HANDLER(ZEND_OPCODE_HANDLER_AR
for (; arg_num <= arg_count; ++arg_num) {
zval *param = zend_vm_stack_get_arg(arg_num TSRMLS_CC);
zend_verify_arg_type((zend_function *) EG(active_op_array), arg_num, param, opline->extended_value TSRMLS_CC);
+//??? "params" may became IS_INDIRECT because of symtable initialization in zend_error
+ if (Z_TYPE_P(params) == IS_INDIRECT) {
+ params = Z_INDIRECT_P(params);
+ }
zend_hash_next_index_insert(Z_ARRVAL_P(params), param);
if (Z_REFCOUNTED_P(param)) {
Z_ADDREF_P(param);
@@ -2613,7 +2613,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CONST_HANDLER(ZEND_OPCODE_HAND
//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
-//??? zend_error(E_NOTICE, "Only variable references should be returned by reference");
+ zend_error(E_NOTICE, "Only variable references should be returned by reference");
//??? if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
//??? }
@@ -2987,6 +2987,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
SEPARATE_ZVAL(array_ptr);
if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
ZVAL_NEW_REF(array_ptr, array_ptr);
+ array_ptr = Z_REFVAL_P(array_ptr);
}
}
}
@@ -3044,7 +3045,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
}
if (iter && EXPECTED(EG(exception) == NULL)) {
- zend_iterator_wrap(iter, array_ptr TSRMLS_CC);
+ zval iterator;
+
+ array_ptr = &iterator;
+ ZVAL_OBJ(array_ptr, &iter->std);
} else {
if (IS_CONST == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
@@ -3610,7 +3614,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -4106,6 +4110,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_CONST_HANDLER(ZEND_O
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -4219,8 +4229,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -4282,7 +4292,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -4291,7 +4301,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
} else {
if (IS_CONST == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -4312,7 +4322,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CONST_HANDLER(ZEND_OPCODE_HANDLE
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -4866,8 +4876,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -4929,7 +4939,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -4938,7 +4948,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
} else {
if (IS_CONST == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -4959,7 +4969,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_TMP_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -5379,7 +5389,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -5761,6 +5771,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_VAR_HANDLER(ZEND_OPC
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -5841,8 +5857,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -5904,7 +5920,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -5913,7 +5929,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
} else {
if (IS_CONST == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -5934,7 +5950,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_VAR_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -6079,7 +6095,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -6429,6 +6445,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CONST_UNUSED_HANDLER(ZEND_
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -6527,8 +6549,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -6590,7 +6612,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -6599,7 +6621,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
} else {
if (IS_CONST == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -6620,7 +6642,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_UNUSED_HANDLER(ZEND_OPCODE_HANDL
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -7232,8 +7254,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -7295,7 +7317,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -7304,7 +7326,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
} else {
if (IS_CONST == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -7325,7 +7347,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CONST_CV_HANDLER(ZEND_OPCODE_HANDLER_A
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -7663,7 +7685,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLE
//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
-//??? zend_error(E_NOTICE, "Only variable references should be returned by reference");
+ zend_error(E_NOTICE, "Only variable references should be returned by reference");
//??? if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
//??? }
@@ -8038,6 +8060,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
SEPARATE_ZVAL(array_ptr);
if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
ZVAL_NEW_REF(array_ptr, array_ptr);
+ array_ptr = Z_REFVAL_P(array_ptr);
}
}
}
@@ -8095,7 +8118,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
if (iter && EXPECTED(EG(exception) == NULL)) {
- zend_iterator_wrap(iter, array_ptr TSRMLS_CC);
+ zval iterator;
+
+ array_ptr = &iterator;
+ ZVAL_OBJ(array_ptr, &iter->std);
} else {
if (IS_TMP_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
@@ -8711,7 +8737,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -9113,6 +9139,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_CONST_HANDLER(ZEND_OPC
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -9193,8 +9225,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -9256,7 +9288,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -9265,7 +9297,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
} else {
if (IS_TMP_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -9286,7 +9318,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CONST_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -9848,8 +9880,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -9911,7 +9943,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -9920,7 +9952,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
} else {
if (IS_TMP_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -9941,7 +9973,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -10361,7 +10393,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -10751,6 +10783,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -10831,8 +10869,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -10894,7 +10932,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -10903,7 +10941,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
} else {
if (IS_TMP_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -10924,7 +10962,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -11069,7 +11107,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -11308,6 +11346,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -11388,8 +11432,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -11451,7 +11495,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -11460,7 +11504,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
} else {
if (IS_TMP_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -11481,7 +11525,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -12040,8 +12084,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -12103,7 +12147,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -12112,7 +12156,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
} else {
if (IS_TMP_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -12133,7 +12177,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_TMP_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -12663,7 +12707,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLE
//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
-//??? zend_error(E_NOTICE, "Only variable references should be returned by reference");
+ zend_error(E_NOTICE, "Only variable references should be returned by reference");
//??? if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
//??? }
@@ -13141,6 +13185,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
SEPARATE_ZVAL(array_ptr);
if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
ZVAL_NEW_REF(array_ptr, array_ptr);
+ array_ptr = Z_REFVAL_P(array_ptr);
}
}
}
@@ -13198,7 +13243,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
zval_ptr_dtor_nogc(free_op1.var);
}
if (iter && EXPECTED(EG(exception) == NULL)) {
- zend_iterator_wrap(iter, array_ptr TSRMLS_CC);
+ zval iterator;
+
+ array_ptr = &iterator;
+ ZVAL_OBJ(array_ptr, &iter->std);
} else {
if (IS_VAR == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
@@ -13386,12 +13434,9 @@ static int ZEND_FASTCALL ZEND_FE_FETCH_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
}
if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
- SEPARATE_ZVAL_IF_NOT_REF(value);
- ZVAL_NEW_REF(value, value);
- Z_ADDREF_P(value);
- } else {
- ZVAL_COPY(EX_VAR(opline->result.var), value);
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(value);
}
+ ZVAL_COPY(EX_VAR(opline->result.var), value);
CHECK_EXCEPTION();
ZEND_VM_INC_OPCODE();
@@ -14358,7 +14403,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -15589,6 +15634,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_CONST_HANDLER(ZEND_OPC
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -15811,8 +15862,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -15875,7 +15926,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -15885,7 +15936,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
zval_ptr_dtor_nogc(free_op1.var);
} else {
if (IS_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -15906,7 +15957,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CONST_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -17804,8 +17855,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -17868,7 +17919,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -17878,7 +17929,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
zval_ptr_dtor_nogc(free_op1.var);
} else {
if (IS_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -17899,7 +17950,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_TMP_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -18762,7 +18813,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -19962,6 +20013,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -20184,8 +20241,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -20248,7 +20305,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -20258,7 +20315,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
zval_ptr_dtor_nogc(free_op1.var);
} else {
if (IS_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -20279,7 +20336,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDLER_AR
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -20673,7 +20730,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -21190,6 +21247,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -21287,8 +21350,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -21351,7 +21414,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -21361,7 +21424,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
zval_ptr_dtor_nogc(free_op1.var);
} else {
if (IS_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -21382,7 +21445,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_UNUSED_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -23334,8 +23397,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -23398,7 +23461,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -23408,7 +23471,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
zval_ptr_dtor_nogc(free_op1.var);
} else {
if (IS_VAR == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -23429,7 +23492,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -24766,8 +24829,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -24829,7 +24892,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -24838,7 +24901,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
} else {
if (IS_UNUSED == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -24859,7 +24922,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CONST_HANDLER(ZEND_OPCODE_HANDL
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -26032,8 +26095,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -26095,7 +26158,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -26104,7 +26167,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
} else {
if (IS_UNUSED == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -26125,7 +26188,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_TMP_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -27298,8 +27361,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -27361,7 +27424,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -27370,7 +27433,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
} else {
if (IS_UNUSED == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -27391,7 +27454,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_VAR_HANDLER(ZEND_OPCODE_HANDLER
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -27700,8 +27763,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -27763,7 +27826,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -27772,7 +27835,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
} else {
if (IS_UNUSED == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -27793,7 +27856,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_UNUSED_HANDLER(ZEND_OPCODE_HAND
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -28963,8 +29026,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -29026,7 +29089,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -29035,7 +29098,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
} else {
if (IS_UNUSED == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -29056,7 +29119,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_UNUSED_CV_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -29567,7 +29630,7 @@ static int ZEND_FASTCALL ZEND_RETURN_BY_REF_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER
//??? if (opline->extended_value == ZEND_RETURNS_FUNCTION &&
//??? EX_T(opline->op1.var).var.fcall_returned_reference) {
//??? } else if (EX_T(opline->op1.var).var.ptr_ptr == &EX_T(opline->op1.var).var.ptr) {
-//??? zend_error(E_NOTICE, "Only variable references should be returned by reference");
+ zend_error(E_NOTICE, "Only variable references should be returned by reference");
//??? if (EX(return_value)) {
//??? ZVAL_DUP(EX(return_value), retval_ptr);
//??? }
@@ -30032,6 +30095,7 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
SEPARATE_ZVAL(array_ptr);
if (opline->extended_value & ZEND_FE_FETCH_BYREF) {
ZVAL_NEW_REF(array_ptr, array_ptr);
+ array_ptr = Z_REFVAL_P(array_ptr);
}
}
}
@@ -30089,7 +30153,10 @@ static int ZEND_FASTCALL ZEND_FE_RESET_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
}
if (iter && EXPECTED(EG(exception) == NULL)) {
- zend_iterator_wrap(iter, array_ptr TSRMLS_CC);
+ zval iterator;
+
+ array_ptr = &iterator;
+ ZVAL_OBJ(array_ptr, &iter->std);
} else {
if (IS_CV == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) {
@@ -31117,7 +31184,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -32134,6 +32201,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_CONST_HANDLER(ZEND_OPCO
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -32354,8 +32427,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -32417,7 +32490,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -32426,7 +32499,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
} else {
if (IS_CV == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -32447,7 +32520,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CONST_HANDLER(ZEND_OPCODE_HANDLER_A
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -34221,8 +34294,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -34284,7 +34357,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -34293,7 +34366,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
} else {
if (IS_CV == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -34314,7 +34387,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!1) {
@@ -35176,7 +35249,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -36255,6 +36328,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -36475,8 +36554,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -36538,7 +36617,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -36547,7 +36626,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
} else {
if (IS_CV == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -36568,7 +36647,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARG
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -36961,7 +37040,7 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (EXPECTED(retval)) {
+ if (EXPECTED(retval != NULL)) {
if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
switch (type) {
case BP_VAR_R:
@@ -37366,6 +37445,12 @@ static int ZEND_FASTCALL ZEND_ISSET_ISEMPTY_VAR_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
(opline->extended_value & ZEND_QUICK_SET)) {
if (Z_TYPE_P(EX_VAR_NUM(opline->op1.var)) != IS_UNDEF) {
value = EX_VAR_NUM(opline->op1.var);
+ if (Z_TYPE_P(value) == IS_INDIRECT) {
+ value = Z_INDIRECT_P(value);
+ }
+ if (Z_TYPE_P(value) == IS_REFERENCE) {
+ value = Z_REFVAL_P(value);
+ }
} else if (EG(active_symbol_table)) {
zend_string *cv = CV_DEF_OF(opline->op1.var);
@@ -37446,8 +37531,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -37509,7 +37594,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -37518,7 +37603,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
} else {
if (IS_CV == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -37539,7 +37624,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_UNUSED_HANDLER(ZEND_OPCODE_HANDLER_
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -39367,8 +39452,8 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
{
USE_OPLINE
- /* The generator object is stored in return_value_ptr_ptr */
- zend_generator *generator = (zend_generator *) Z_OBJ_P(EX(return_value));
+ /* The generator object is stored in EX(return_value) */
+ zend_generator *generator = (zend_generator *) EX(return_value);
if (generator->flags & ZEND_GENERATOR_FORCED_CLOSE) {
zend_error_noreturn(E_ERROR, "Cannot yield from finally in a force-closed generator");
@@ -39430,7 +39515,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
) {
//??? INIT_PZVAL_COPY(copy, value);
ZVAL_COPY_VALUE(&generator->value, value);
- Z_SET_REFCOUNT(generator->value, 1);
+ if (Z_REFCOUNTED(generator->value)) Z_SET_REFCOUNT(generator->value, 1);
/* Temporary variables don't need ctor copying */
if (!0) {
@@ -39439,7 +39524,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
} else {
if (IS_CV == IS_CV) {
- Z_ADDREF_P(value);
+ if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value);
}
ZVAL_COPY_VALUE(&generator->value, value);
}
@@ -39460,7 +39545,7 @@ static int ZEND_FASTCALL ZEND_YIELD_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS
) {
//??? INIT_PZVAL_COPY(copy, key);
ZVAL_COPY_VALUE(&generator->key, key);
- Z_SET_REFCOUNT(generator->key, 1);
+ if (Z_REFCOUNTED(generator->key)) Z_SET_REFCOUNT(generator->key, 1);
/* Temporary variables don't need ctor copying */
if (!0) {