diff options
| -rw-r--r-- | Zend/zend.c | 6 | ||||
| -rw-r--r-- | Zend/zend_compile.c | 4 | ||||
| -rw-r--r-- | Zend/zend_exceptions.c | 3 | ||||
| -rw-r--r-- | Zend/zend_execute.c | 16 | ||||
| -rw-r--r-- | Zend/zend_generators.c | 13 | ||||
| -rw-r--r-- | Zend/zend_interfaces.c | 25 | ||||
| -rw-r--r-- | Zend/zend_interfaces.h | 2 | ||||
| -rw-r--r-- | Zend/zend_iterators.c | 5 | ||||
| -rw-r--r-- | Zend/zend_iterators.h | 2 | ||||
| -rw-r--r-- | Zend/zend_list.c | 70 | ||||
| -rw-r--r-- | Zend/zend_list.h | 2 | ||||
| -rw-r--r-- | Zend/zend_vm_def.h | 77 | ||||
| -rw-r--r-- | Zend/zend_vm_execute.h | 429 | ||||
| -rw-r--r-- | ext/date/php_date.c | 2 | ||||
| -rw-r--r-- | ext/spl/spl_array.c | 2 | ||||
| -rw-r--r-- | ext/spl/spl_dllist.c | 3 | ||||
| -rw-r--r-- | ext/spl/spl_fixedarray.c | 3 | ||||
| -rw-r--r-- | ext/spl/spl_heap.c | 6 | ||||
| -rw-r--r-- | ext/spl/spl_iterators.c | 2 | ||||
| -rw-r--r-- | main/streams/streams.c | 4 |
20 files changed, 418 insertions, 258 deletions
diff --git a/Zend/zend.c b/Zend/zend.c index 19401d2e03..e8a6a40ff6 100644 --- a/Zend/zend.c +++ b/Zend/zend.c @@ -319,6 +319,7 @@ ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int in { zval expr_copy; int use_copy; + int ret; zend_make_printable_zval(expr, &expr_copy, &use_copy); if (use_copy) { @@ -331,10 +332,11 @@ ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int in return 0; } write_func(Z_STRVAL_P(expr), Z_STRLEN_P(expr)); + ret = Z_STRLEN_P(expr); if (use_copy) { zval_dtor(expr); } - return Z_STRLEN_P(expr); + return ret; } /* }}} */ @@ -366,7 +368,7 @@ ZEND_API void zend_print_flat_zval_r(zval *expr TSRMLS_DC) /* {{{ */ zend_printf("%s Object (", "Unknown Class"); } if (class_name) { - efree((char*)class_name); + STR_RELEASE(class_name); } if (Z_OBJ_HANDLER_P(expr, get_properties)) { properties = Z_OBJPROP_P(expr); diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c index 66410d41d3..40694377be 100644 --- a/Zend/zend_compile.c +++ b/Zend/zend_compile.c @@ -2789,7 +2789,7 @@ void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC) /* {{{ */ if (do_end_vparse) { if (returns_reference && !zend_is_function_or_method_call(expr)) { - zend_do_end_variable_parse(expr, BP_VAR_W, 0 TSRMLS_CC); + zend_do_end_variable_parse(expr, BP_VAR_W, 1 TSRMLS_CC); } else { zend_do_end_variable_parse(expr, BP_VAR_R, 0 TSRMLS_CC); } @@ -2851,7 +2851,7 @@ void zend_do_yield(znode *result, znode *value, const znode *key, zend_bool is_v if (is_variable) { if ((CG(active_op_array)->fn_flags & ZEND_ACC_RETURN_REFERENCE) && !zend_is_function_or_method_call(value)) { - zend_do_end_variable_parse(value, BP_VAR_W, 0 TSRMLS_CC); + zend_do_end_variable_parse(value, BP_VAR_W, 1 TSRMLS_CC); } else { zend_do_end_variable_parse(value, BP_VAR_R, 0 TSRMLS_CC); } diff --git a/Zend/zend_exceptions.c b/Zend/zend_exceptions.c index 791f7a25c5..531ec345b7 100644 --- a/Zend/zend_exceptions.c +++ b/Zend/zend_exceptions.c @@ -655,7 +655,8 @@ ZEND_METHOD(exception, __toString) zend_update_property_string(default_exception_ce, getThis(), "string", sizeof("string")-1, str TSRMLS_CC); //??? RETURN_STRINGL(str, len, 0); - RETURN_STRINGL(str, len); + RETVAL_STRINGL(str, len); + efree(str); } /* }}} */ diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c index 9bdee5c2c1..e2bffd8dbf 100644 --- a/Zend/zend_execute.c +++ b/Zend/zend_execute.c @@ -699,6 +699,9 @@ static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zva need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, need_msg, class_name, "none", "" TSRMLS_CC); } + if (Z_TYPE_P(arg) == IS_REFERENCE) { + arg = Z_REFVAL_P(arg); + } if (Z_TYPE_P(arg) == IS_OBJECT) { need_msg = zend_verify_arg_class_kind(cur_arg_info, fetch_type, &class_name, &ce TSRMLS_CC); if (!ce || !instanceof_function(Z_OBJCE_P(arg), ce TSRMLS_CC)) { @@ -715,6 +718,9 @@ static inline int zend_verify_arg_type(zend_function *zf, zend_uint arg_num, zva return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", "none", "" TSRMLS_CC); } + if (Z_TYPE_P(arg) == IS_REFERENCE) { + arg = Z_REFVAL_P(arg); + } if (Z_TYPE_P(arg) != IS_ARRAY && (Z_TYPE_P(arg) != IS_NULL || !cur_arg_info->allow_null)) { return zend_verify_arg_error(E_RECOVERABLE_ERROR, zf, arg_num, "be of the type array", "", zend_zval_type_name(arg), "" TSRMLS_CC); } @@ -1612,19 +1618,19 @@ static zend_always_inline zend_execute_data *i_create_execute_data_from_op_array * and the passed arguments */ int args_count = zend_vm_stack_get_args_count_ex(EG(current_execute_data)); - size_t args_size = ZEND_MM_ALIGNED_SIZE(sizeof(zval*)) * (args_count + 1); + size_t args_size = ZEND_MM_ALIGNED_SIZE(sizeof(zval)) * (args_count + 1); total_size += args_size + execute_data_size; - EG(argument_stack) = zend_vm_stack_new_page((total_size + (sizeof(void*) - 1)) / sizeof(void*)); + EG(argument_stack) = zend_vm_stack_new_page((total_size + (sizeof(zval) - 1)) / sizeof(zval)); EG(argument_stack)->prev = NULL; - execute_data = (zend_execute_data*)((char*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)) + args_size + execute_data_size + vars_size); + execute_data = (zend_execute_data*)((char*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)) + execute_data_size + args_size); /* copy prev_execute_data */ - EX(prev_execute_data) = (zend_execute_data*)((char*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)) + args_size); + EX(prev_execute_data) = (zend_execute_data*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)); memset(EX(prev_execute_data), 0, sizeof(zend_execute_data)); EX(prev_execute_data)->function_state.function = (zend_function*)op_array; - EX(prev_execute_data)->function_state.arguments = (zval*)((char*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)) + ZEND_MM_ALIGNED_SIZE(sizeof(zval)) * args_count); + EX(prev_execute_data)->function_state.arguments = (zval*)(((char*)ZEND_VM_STACK_ELEMETS(EG(argument_stack)) + execute_data_size + args_size - sizeof(zval))); /* copy arguments */ ZVAL_LONG(EX(prev_execute_data)->function_state.arguments, args_count); diff --git a/Zend/zend_generators.c b/Zend/zend_generators.c index d6b4a3b0ad..78cb346eb7 100644 --- a/Zend/zend_generators.c +++ b/Zend/zend_generators.c @@ -35,7 +35,7 @@ static void zend_generator_cleanup_unfinished_execution(zend_generator *generato zend_op_array *op_array = execute_data->op_array; if (generator->send_target) { - Z_DELREF_P(generator->send_target); + if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target); generator->send_target = NULL; } @@ -302,6 +302,9 @@ ZEND_API void zend_generator_create_zval(zend_op_array *op_array, zval *return_v generator->execute_data = execute_data; generator->stack = EG(argument_stack); EG(argument_stack) = current_stack; + + /* EX(return_value) keeps pointer to zend_object (not a real zval) */ + execute_data->return_value = (zval*)generator; } /* }}} */ @@ -515,9 +518,8 @@ ZEND_METHOD(Generator, send) /* Put sent value in the target VAR slot, if it is used */ if (generator->send_target) { - Z_DELREF_P(generator->send_target); - Z_ADDREF_P(value); - ZVAL_COPY_VALUE(generator->send_target, value); + if (Z_REFCOUNTED_P(generator->send_target)) Z_DELREF_P(generator->send_target); + ZVAL_COPY(generator->send_target, value); } zend_generator_resume(generator TSRMLS_CC); @@ -672,6 +674,9 @@ zend_object_iterator *zend_generator_get_iterator(zend_class_entry *ce, zval *ob } iterator = &generator->iterator; + + zend_iterator_init(&iterator->intern TSRMLS_CC); + iterator->intern.funcs = &zend_generator_iterator_functions; iterator->intern.data = (void *) generator; diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c index 87b3f723c0..feacae7f0e 100644 --- a/Zend/zend_interfaces.c +++ b/Zend/zend_interfaces.c @@ -120,12 +120,9 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun /* iterator interface, c-level functions used by engine */ /* {{{ zend_user_it_new_iterator */ -ZEND_API zval *zend_user_it_new_iterator(zend_class_entry *ce, zval *object TSRMLS_DC) +ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *retval TSRMLS_DC) { - zval retval; - - return zend_call_method_with_0_params(object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", &retval); - + zend_call_method_with_0_params(object, ce, &ce->iterator_funcs.zf_new_iterator, "getiterator", retval); } /* }}} */ @@ -259,6 +256,8 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva iterator = emalloc(sizeof(zend_user_iterator)); + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + Z_ADDREF_P(object); iterator->it.data = (void*)object; iterator->it.funcs = ce->iterator_funcs.funcs; @@ -271,23 +270,23 @@ static zend_object_iterator *zend_user_it_get_iterator(zend_class_entry *ce, zva /* {{{ zend_user_it_get_new_iterator */ ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC) { - zval *iterator = zend_user_it_new_iterator(ce, object TSRMLS_CC); + zval iterator; zend_object_iterator *new_iterator; - zend_class_entry *ce_it = iterator && Z_TYPE_P(iterator) == IS_OBJECT ? Z_OBJCE_P(iterator) : NULL; + zend_user_it_new_iterator(ce, object, &iterator TSRMLS_CC); + zend_class_entry *ce_it = (Z_TYPE(iterator) == IS_OBJECT && + Z_OBJ_HT(iterator)->get_class_entry) ? Z_OBJCE(iterator) : NULL; - if (!ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && iterator == object)) { + if (!ce_it || !ce_it->get_iterator || (ce_it->get_iterator == zend_user_it_get_new_iterator && Z_OBJ(iterator) == Z_OBJ_P(object))) { if (!EG(exception)) { zend_throw_exception_ex(NULL, 0 TSRMLS_CC, "Objects returned by %s::getIterator() must be traversable or implement interface Iterator", ce ? ce->name->val : Z_OBJCE_P(object)->name->val); } - if (iterator) { - zval_ptr_dtor(iterator); - } + zval_ptr_dtor(&iterator); return NULL; } - new_iterator = ce_it->get_iterator(ce_it, iterator, by_ref TSRMLS_CC); - zval_ptr_dtor(iterator); + new_iterator = ce_it->get_iterator(ce_it, &iterator, by_ref TSRMLS_CC); + zval_ptr_dtor(&iterator); return new_iterator; } /* }}} */ diff --git a/Zend/zend_interfaces.h b/Zend/zend_interfaces.h index 3c539ad563..a0d1cc329a 100644 --- a/Zend/zend_interfaces.h +++ b/Zend/zend_interfaces.h @@ -56,7 +56,7 @@ ZEND_API zval *zend_user_it_get_current_data(zend_object_iterator *_iter TSRMLS_ ZEND_API void zend_user_it_move_forward(zend_object_iterator *_iter TSRMLS_DC); ZEND_API void zend_user_it_invalidate_current(zend_object_iterator *_iter TSRMLS_DC); -ZEND_API zval *zend_user_it_new_iterator(zend_class_entry *ce, zval *object TSRMLS_DC); +ZEND_API void zend_user_it_new_iterator(zend_class_entry *ce, zval *object, zval *iterator TSRMLS_DC); ZEND_API zend_object_iterator *zend_user_it_get_new_iterator(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC); ZEND_API void zend_register_interfaces(TSRMLS_D); diff --git a/Zend/zend_iterators.c b/Zend/zend_iterators.c index bb41ab9000..5514c8bba8 100644 --- a/Zend/zend_iterators.c +++ b/Zend/zend_iterators.c @@ -65,9 +65,10 @@ static void iter_wrapper_dtor(zend_object *object TSRMLS_DC) iter->funcs->dtor(iter TSRMLS_CC); } -ZEND_API void zend_iterator_wrap(zend_object_iterator *iter, zval *wrapped TSRMLS_DC) +ZEND_API void zend_iterator_init(zend_object_iterator *iter TSRMLS_DC) { - ZVAL_OBJ(wrapped, &iter->std); + zend_object_std_init(&iter->std, &zend_iterator_class_entry); + iter->std.handlers = &iterator_object_handlers; } ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap( diff --git a/Zend/zend_iterators.h b/Zend/zend_iterators.h index 0ab5bef82a..d6cba7c892 100644 --- a/Zend/zend_iterators.h +++ b/Zend/zend_iterators.h @@ -83,7 +83,7 @@ BEGIN_EXTERN_C() ZEND_API enum zend_object_iterator_kind zend_iterator_unwrap(zval *array_ptr, zend_object_iterator **iter TSRMLS_DC); /* given an iterator, wrap it up as a zval for use by the engine opcodes */ -ZEND_API void zend_iterator_wrap(zend_object_iterator *iter, zval *zv TSRMLS_DC); +ZEND_API void zend_iterator_init(zend_object_iterator *iter TSRMLS_DC); ZEND_API void zend_register_iterator_wrapper(TSRMLS_D); END_EXTERN_C() diff --git a/Zend/zend_list.c b/Zend/zend_list.c index 8bc5161bda..f7cbfac89f 100644 --- a/Zend/zend_list.c +++ b/Zend/zend_list.c @@ -50,6 +50,37 @@ ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC) } } +ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC) +{ + if (res->gc.refcount <= 0) { + return zend_list_delete(res); + } else if (res->type >= 0) { + zend_rsrc_list_dtors_entry *ld; + + ld = zend_hash_index_find_ptr(&list_destructors, res->type); + if (ld) { + switch (ld->type) { + case ZEND_RESOURCE_LIST_TYPE_STD: + if (ld->list_dtor) { + (ld->list_dtor)(res->ptr); + } + break; + case ZEND_RESOURCE_LIST_TYPE_EX: + if (ld->list_dtor_ex) { + ld->list_dtor_ex(res TSRMLS_CC); + } + break; + EMPTY_SWITCH_DEFAULT_CASE() + } + } else { + zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); + } + res->ptr = NULL; + res->type = -1; + } + return SUCCESS; +} + ZEND_API zend_resource* zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type TSRMLS_DC) { zval *zv; @@ -124,26 +155,29 @@ ZEND_API void *zend_fetch_resource(zval *passed_id TSRMLS_DC, int default_id, co void list_entry_destructor(zval *zv) { zend_resource *res = Z_RES_P(zv); - zend_rsrc_list_dtors_entry *ld; - TSRMLS_FETCH(); + + if (res->type >= 0) { + zend_rsrc_list_dtors_entry *ld; + TSRMLS_FETCH(); - ld = zend_hash_index_find_ptr(&list_destructors, res->type); - if (ld) { - switch (ld->type) { - case ZEND_RESOURCE_LIST_TYPE_STD: - if (ld->list_dtor) { - (ld->list_dtor)(res->ptr); - } - break; - case ZEND_RESOURCE_LIST_TYPE_EX: - if (ld->list_dtor_ex) { - ld->list_dtor_ex(res TSRMLS_CC); - } - break; - EMPTY_SWITCH_DEFAULT_CASE() + ld = zend_hash_index_find_ptr(&list_destructors, res->type); + if (ld) { + switch (ld->type) { + case ZEND_RESOURCE_LIST_TYPE_STD: + if (ld->list_dtor) { + (ld->list_dtor)(res->ptr); + } + break; + case ZEND_RESOURCE_LIST_TYPE_EX: + if (ld->list_dtor_ex) { + ld->list_dtor_ex(res TSRMLS_CC); + } + break; + EMPTY_SWITCH_DEFAULT_CASE() + } + } else { + zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); } - } else { - zend_error(E_WARNING,"Unknown list entry type in request shutdown (%d)", res->type); } efree(res); } diff --git a/Zend/zend_list.h b/Zend/zend_list.h index 52b171e422..c58905aa1f 100644 --- a/Zend/zend_list.h +++ b/Zend/zend_list.h @@ -66,8 +66,10 @@ void zend_destroy_rsrc_list_dtors(void); ZEND_API zval *zend_list_insert(void *ptr, int type TSRMLS_DC); ZEND_API int _zend_list_delete(zend_resource *res TSRMLS_DC); +ZEND_API int _zend_list_close(zend_resource *res TSRMLS_DC); #define zend_list_delete(res) _zend_list_delete(res TSRMLS_CC) +#define zend_list_close(res) _zend_list_close(res TSRMLS_CC) ZEND_API zend_resource *zend_register_resource(zval *rsrc_result, void *rsrc_pointer, int rsrc_type TSRMLS_DC); ZEND_API void *zend_fetch_resource(zval *passed_id TSRMLS_DC, int default_id, const char *resource_type_name, int *found_resource_type, int num_resource_types, ...); diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h index b91e4894cf..d230f575ad 100644 --- a/Zend/zend_vm_def.h +++ b/Zend/zend_vm_def.h @@ -1096,7 +1096,7 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST| 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: @@ -2861,7 +2861,7 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY) //??? 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); //??? } @@ -2881,8 +2881,8 @@ ZEND_VM_HANDLER(111, ZEND_RETURN_BY_REF, CONST|TMP|VAR|CV, ANY) ZEND_VM_HANDLER(161, ZEND_GENERATOR_RETURN, ANY, ANY) { - /* 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); @@ -3134,8 +3134,6 @@ ZEND_VM_HANDLER(66, ZEND_SEND_VAR, VAR|CV, ANY) ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) { -//??? -#if 0 USE_OPLINE zend_free_op free_op1; zval *args; @@ -3154,14 +3152,13 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) 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_OP1(); CHECK_EXCEPTION(); @@ -3172,9 +3169,9 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) 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); @@ -3196,7 +3193,7 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) 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(); @@ -3210,13 +3207,13 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) } for (; iter->funcs->valid(iter TSRMLS_CC) == SUCCESS; ++arg_num) { - zval **arg_ptr, *arg; + zval *arg; if (UNEXPECTED(EG(exception) != NULL)) { ZEND_VM_C_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)) { ZEND_VM_C_GOTO(unpack_iter_dtor); } @@ -3242,18 +3239,18 @@ ZEND_VM_HANDLER(165, ZEND_SEND_UNPACK, ANY, ANY) 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); @@ -3276,7 +3273,6 @@ ZEND_VM_C_LABEL(unpack_iter_dtor): FREE_OP1(); CHECK_EXCEPTION(); -#endif ZEND_VM_NEXT_OPCODE(); } @@ -3357,7 +3353,7 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY) 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); @@ -3368,6 +3364,10 @@ ZEND_VM_HANDLER(164, ZEND_RECV_VARIADIC, ANY, ANY) 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); @@ -4196,6 +4196,7 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) 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); } } } @@ -4253,7 +4254,10 @@ ZEND_VM_HANDLER(77, ZEND_FE_RESET, CONST|TMP|VAR|CV, ANY) FREE_OP1_IF_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 (OP1_TYPE == IS_VAR && opline->extended_value & ZEND_FE_RESET_VARIABLE) { FREE_OP1_VAR_PTR(); @@ -4441,12 +4445,9 @@ ZEND_VM_HANDLER(78, ZEND_FE_FETCH, VAR, ANY) } 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(); @@ -4465,6 +4466,12 @@ ZEND_VM_HANDLER(114, ZEND_ISSET_ISEMPTY_VAR, CONST|TMP|VAR|CV, UNUSED|CONST|VAR) (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); @@ -5306,8 +5313,8 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE { 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"); @@ -5370,7 +5377,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE ) { //??? 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 (!IS_OP1_TMP_FREE()) { @@ -5380,7 +5387,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE FREE_OP1_IF_VAR(); } else { if (OP1_TYPE == IS_CV) { - Z_ADDREF_P(value); + if (Z_REFCOUNTED_P(value)) Z_ADDREF_P(value); } ZVAL_COPY_VALUE(&generator->value, value); } @@ -5401,7 +5408,7 @@ ZEND_VM_HANDLER(160, ZEND_YIELD, CONST|TMP|VAR|CV|UNUSED, CONST|TMP|VAR|CV|UNUSE ) { //??? 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 (!IS_OP2_TMP_FREE()) { 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) { diff --git a/ext/date/php_date.c b/ext/date/php_date.c index 05dccf4f8e..1489ac8184 100644 --- a/ext/date/php_date.c +++ b/ext/date/php_date.c @@ -1976,6 +1976,8 @@ zend_object_iterator *date_object_period_get_iterator(zend_class_entry *ce, zval zend_error(E_ERROR, "An iterator cannot be used with foreach by reference"); } + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + Z_ADDREF_P(object); iterator->intern.data = (void*) dpobj; iterator->intern.funcs = &date_period_it_funcs; diff --git a/ext/spl/spl_array.c b/ext/spl/spl_array.c index e272a145e5..e552ca8fb4 100644 --- a/ext/spl/spl_array.c +++ b/ext/spl/spl_array.c @@ -1148,6 +1148,8 @@ zend_object_iterator *spl_array_get_iterator(zend_class_entry *ce, zval *object, iterator = emalloc(sizeof(spl_array_it)); + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + Z_ADDREF_P(object); iterator->intern.it.data = (void*)object; iterator->intern.it.funcs = &spl_array_it_funcs; diff --git a/ext/spl/spl_dllist.c b/ext/spl/spl_dllist.c index fbe249456e..99863626bc 100644 --- a/ext/spl/spl_dllist.c +++ b/ext/spl/spl_dllist.c @@ -1291,6 +1291,9 @@ zend_object_iterator *spl_dllist_get_iterator(zend_class_entry *ce, zval *object Z_ADDREF_P(object); iterator = emalloc(sizeof(spl_dllist_it)); + + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + iterator->intern.it.data = (void*)object; iterator->intern.it.funcs = &spl_dllist_it_funcs; iterator->intern.ce = ce; diff --git a/ext/spl/spl_fixedarray.c b/ext/spl/spl_fixedarray.c index 075df9b2b7..9e5e8b590c 100644 --- a/ext/spl/spl_fixedarray.c +++ b/ext/spl/spl_fixedarray.c @@ -1052,6 +1052,9 @@ zend_object_iterator *spl_fixedarray_get_iterator(zend_class_entry *ce, zval *ob Z_ADDREF_P(object); iterator = emalloc(sizeof(spl_fixedarray_it)); + + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + iterator->intern.it.data = object; iterator->intern.it.funcs = &spl_fixedarray_it_funcs; iterator->intern.ce = ce; diff --git a/ext/spl/spl_heap.c b/ext/spl/spl_heap.c index 9159000799..2afee6cd49 100644 --- a/ext/spl/spl_heap.c +++ b/ext/spl/spl_heap.c @@ -1091,6 +1091,9 @@ zend_object_iterator *spl_heap_get_iterator(zend_class_entry *ce, zval *object, Z_ADDREF_P(object); iterator = emalloc(sizeof(spl_heap_it)); + + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + iterator->intern.it.data = (void*)object; iterator->intern.it.funcs = &spl_heap_it_funcs; iterator->intern.ce = ce; @@ -1115,6 +1118,9 @@ zend_object_iterator *spl_pqueue_get_iterator(zend_class_entry *ce, zval *object Z_ADDREF_P(object); iterator = emalloc(sizeof(spl_heap_it)); + + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + iterator->intern.it.data = (void*)object; iterator->intern.it.funcs = &spl_pqueue_it_funcs; iterator->intern.ce = ce; diff --git a/ext/spl/spl_iterators.c b/ext/spl/spl_iterators.c index 81d1ecc4bc..2891f3ce9b 100644 --- a/ext/spl/spl_iterators.c +++ b/ext/spl/spl_iterators.c @@ -423,6 +423,8 @@ static zend_object_iterator *spl_recursive_it_get_iterator(zend_class_entry *ce, "the parent constructor has not been called"); } + zend_iterator_init((zend_object_iterator*)iterator TSRMLS_CC); + Z_ADDREF_P(zobject); iterator->intern.data = (void*)object; iterator->intern.funcs = ce->iterator_funcs.funcs; diff --git a/main/streams/streams.c b/main/streams/streams.c index e80a87c860..c595c80240 100644 --- a/main/streams/streams.c +++ b/main/streams/streams.c @@ -464,8 +464,8 @@ fprintf(stderr, "stream_free: %s:%p[%s] preserve_handle=%d release_cast=%d remov * In any case, let's always completely delete it from the resource list, * not only when PHP_STREAM_FREE_RELEASE_STREAM is set */ //??? while (zend_list_delete(stream->res) == SUCCESS) {} - stream->res->gc.refcount = 0; - zend_list_delete(stream->res); +//??? stream->res->gc.refcount = 0; + zend_list_close(stream->res); } if (close_options & PHP_STREAM_FREE_CALL_DTOR) { |
