summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend.h10
-rw-r--r--Zend/zend_API.c6
-rw-r--r--Zend/zend_compile.c56
-rw-r--r--Zend/zend_compile.h8
-rw-r--r--Zend/zend_execute.c3
-rw-r--r--Zend/zend_execute_API.c44
-rw-r--r--Zend/zend_interfaces.c2
-rw-r--r--Zend/zend_object_handlers.c6
-rw-r--r--Zend/zend_opcode.c2
-rw-r--r--Zend/zend_vm_def.h53
-rw-r--r--Zend/zend_vm_execute.h660
-rw-r--r--ext/standard/string.c11
12 files changed, 477 insertions, 384 deletions
diff --git a/Zend/zend.h b/Zend/zend.h
index 44266c29ce..b62a022e42 100644
--- a/Zend/zend.h
+++ b/Zend/zend.h
@@ -733,11 +733,11 @@ END_EXTERN_C()
Z_SET_REFCOUNT_PP(ppzv_dest, refcount); \
}
-#define SEPARATE_ARG_IF_REF(varptr) \
- if (Z_ISREF_P(varptr)) { \
- ZVAL_DUP(varptr, Z_REFVAL_P(varptr)); \
- } else { \
- Z_ADDREF_P(varptr); \
+#define SEPARATE_ARG_IF_REF(varptr) \
+ if (Z_ISREF_P(varptr)) { \
+ ZVAL_DUP(varptr, Z_REFVAL_P(varptr)); \
+ } else if (IS_REFCOUNTED(Z_TYPE_P(varptr))) { \
+ Z_ADDREF_P(varptr); \
}
#define READY_TO_DESTROY(zv) \
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index 4ffe6c4082..436fdae1b7 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -176,7 +176,9 @@ ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array TS
while (param_count-->0) {
zval *param = p-(arg_count--);
- Z_ADDREF_P(param);
+ if (Z_REFCOUNTED_P(param)) {
+ Z_ADDREF_P(param);
+ }
add_next_index_zval(argument_array, param);
}
@@ -3151,7 +3153,7 @@ ZEND_API zend_bool zend_is_callable_ex(zval *callable, zval *object_ptr, uint ch
}
} else {
- if (!!EG(objects_store).object_buckets ||
+ if (!EG(objects_store).object_buckets ||
!IS_VALID(EG(objects_store).object_buckets[Z_OBJ_HANDLE_P(obj)])) {
return 0;
}
diff --git a/Zend/zend_compile.c b/Zend/zend_compile.c
index c8c7b90adb..1ec8826136 100644
--- a/Zend/zend_compile.c
+++ b/Zend/zend_compile.c
@@ -1906,7 +1906,6 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ
cur_arg_info->allow_null = 1;
cur_arg_info->is_variadic = is_variadic;
cur_arg_info->class_name = NULL;
- cur_arg_info->class_name_len = 0;
if (class_type->op_type != IS_UNUSED) {
cur_arg_info->allow_null = 0;
@@ -1936,8 +1935,7 @@ void zend_do_receive_param(zend_uchar op, znode *varname, const znode *initializ
zend_resolve_class_name(class_type TSRMLS_CC);
}
Z_STR(class_type->u.constant) = zend_new_interned_string(Z_STR(class_type->u.constant) TSRMLS_CC);
- cur_arg_info->class_name = Z_STRVAL(class_type->u.constant);
- cur_arg_info->class_name_len = Z_STRLEN(class_type->u.constant);
+ cur_arg_info->class_name = STR_COPY(Z_STR(class_type->u.constant));
if (op == ZEND_RECV_INIT) {
if (Z_TYPE(initialization->u.constant) == IS_NULL || (Z_TYPE(initialization->u.constant) == IS_CONSTANT && !strcasecmp(Z_STRVAL(initialization->u.constant), "NULL")) || Z_TYPE(initialization->u.constant) == IS_CONSTANT_AST) {
cur_arg_info->allow_null = 1;
@@ -3283,32 +3281,20 @@ static zend_bool zend_do_perform_implementation_check(const zend_function *fe, c
if (fe_arg_info->class_name) {
zend_string *fe_class_name, *proto_class_name;
- if (!strcasecmp(fe_arg_info->class_name, "parent") && proto->common.scope) {
- fe_class_name = STR_INIT(
- proto->common.scope->name->val,
- proto->common.scope->name->len, 0);
- } else if (!strcasecmp(fe_arg_info->class_name, "self") && fe->common.scope) {
- fe_class_name = STR_INIT(
- fe->common.scope->name->val,
- fe->common.scope->name->len, 0);
+ if (!strcasecmp(fe_arg_info->class_name->val, "parent") && proto->common.scope) {
+ fe_class_name = proto->common.scope->name;
+ } else if (!strcasecmp(fe_arg_info->class_name->val, "self") && fe->common.scope) {
+ fe_class_name = fe->common.scope->name;
} else {
- fe_class_name = STR_INIT(
- fe_arg_info->class_name,
- fe_arg_info->class_name_len, 0);
+ fe_class_name = fe_arg_info->class_name;
}
- if (!strcasecmp(proto_arg_info->class_name, "parent") && proto->common.scope && proto->common.scope->parent) {
- proto_class_name = STR_INIT(
- proto->common.scope->parent->name->val,
- proto->common.scope->parent->name->len, 0);
- } else if (!strcasecmp(proto_arg_info->class_name, "self") && proto->common.scope) {
- proto_class_name = STR_INIT(
- proto->common.scope->name->val,
- proto->common.scope->name->len, 0);
+ if (!strcasecmp(proto_arg_info->class_name->val, "parent") && proto->common.scope && proto->common.scope->parent) {
+ proto_class_name = proto->common.scope->parent->name;
+ } else if (!strcasecmp(proto_arg_info->class_name->val, "self") && proto->common.scope) {
+ proto_class_name = proto->common.scope->name;
} else {
- proto_class_name = STR_INIT(
- proto_arg_info->class_name,
- proto_arg_info->class_name_len, 0);
+ proto_class_name = proto_arg_info->class_name;
}
if (strcasecmp(fe_class_name->val, proto_class_name->val)!=0) {
@@ -3388,21 +3374,17 @@ static char * zend_get_function_declaration(zend_function *fptr TSRMLS_DC) /* {{
required = fptr->common.required_num_args;
for (i = 0; i < fptr->common.num_args;) {
if (arg_info->class_name) {
- const char *class_name;
- zend_uint class_name_len;
- if (!strcasecmp(arg_info->class_name, "self") && fptr->common.scope ) {
- class_name = fptr->common.scope->name->val;
- class_name_len = fptr->common.scope->name->len;
- } else if (!strcasecmp(arg_info->class_name, "parent") && fptr->common.scope->parent) {
- class_name = fptr->common.scope->parent->name->val;
- class_name_len = fptr->common.scope->parent->name->len;
+ zend_string *class_name;
+ if (!strcasecmp(arg_info->class_name->val, "self") && fptr->common.scope ) {
+ class_name = fptr->common.scope->name;
+ } else if (!strcasecmp(arg_info->class_name->val, "parent") && fptr->common.scope->parent) {
+ class_name = fptr->common.scope->parent->name;
} else {
class_name = arg_info->class_name;
- class_name_len = arg_info->class_name_len;
}
- REALLOC_BUF_IF_EXCEED(buf, offset, length, class_name_len);
- memcpy(offset, class_name, class_name_len);
- offset += class_name_len;
+ REALLOC_BUF_IF_EXCEED(buf, offset, length, class_name->len);
+ memcpy(offset, class_name->val, class_name->len);
+ offset += class_name->len;
*(offset++) = ' ';
} else if (arg_info->type_hint) {
zend_uint type_name_len;
diff --git a/Zend/zend_compile.h b/Zend/zend_compile.h
index 050cc47993..990a34c67c 100644
--- a/Zend/zend_compile.h
+++ b/Zend/zend_compile.h
@@ -228,10 +228,10 @@ typedef struct _zend_property_info {
typedef struct _zend_arg_info {
const char *name;
zend_uint name_len;
- const char *class_name;
- zend_uint class_name_len;
-//??? zend_string *name;
-//??? zend_string *class_name;
+//??? const char *class_name;
+// zend_uint class_name_len;
+// zend_string *name;
+ zend_string *class_name;
zend_uchar type_hint;
zend_uchar pass_by_reference;
zend_bool allow_null;
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 21efb7fdd2..c1fe7ce49f 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -642,9 +642,8 @@ static inline void make_real_object(zval *object_ptr TSRMLS_DC)
ZEND_API char * zend_verify_arg_class_kind(const zend_arg_info *cur_arg_info, ulong fetch_type, char **class_name, zend_class_entry **pce TSRMLS_DC)
{
- zend_string *key = STR_INIT(cur_arg_info->class_name, cur_arg_info->class_name_len, 0);
+ zend_string *key = cur_arg_info->class_name;
*pce = zend_fetch_class(key, (fetch_type | ZEND_FETCH_CLASS_AUTO | ZEND_FETCH_CLASS_NO_AUTOLOAD) TSRMLS_CC);
- STR_FREE(key);
*class_name = (*pce) ? (*pce)->name->val : (char*)cur_arg_info->class_name;
if (*pce && (*pce)->ce_flags & ZEND_ACC_INTERFACE) {
return "implement interface ";
diff --git a/Zend/zend_execute_API.c b/Zend/zend_execute_API.c
index dc194d051d..e0dede14f5 100644
--- a/Zend/zend_execute_API.c
+++ b/Zend/zend_execute_API.c
@@ -831,31 +831,33 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
zval *param;
if (ARG_SHOULD_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
- if (!Z_ISREF(fci->params[i]) && Z_REFCOUNT(fci->params[i]) > 1) {
- zval new_zval;
-
- if (fci->no_separation &&
- !ARG_MAY_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
- if (i || UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == (EG(argument_stack)->top))) {
- /* hack to clean up the stack */
- ZVAL_LONG(&tmp, i);
- zend_vm_stack_push(&tmp TSRMLS_CC);
- zend_vm_stack_clear_multiple(0 TSRMLS_CC);
+ if (Z_REFCOUNTED(fci->params[i])) {
+ if (!Z_ISREF(fci->params[i]) && Z_REFCOUNT(fci->params[i]) > 1) {
+ zval new_zval;
+
+ if (fci->no_separation &&
+ !ARG_MAY_BE_SENT_BY_REF(EX(function_state).function, i + 1)) {
+ if (i || UNEXPECTED(ZEND_VM_STACK_ELEMETS(EG(argument_stack)) == (EG(argument_stack)->top))) {
+ /* hack to clean up the stack */
+ ZVAL_LONG(&tmp, i);
+ zend_vm_stack_push(&tmp TSRMLS_CC);
+ zend_vm_stack_clear_multiple(0 TSRMLS_CC);
+ }
+
+ zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
+ i+1,
+ EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name->val : "",
+ EX(function_state).function->common.scope ? "::" : "",
+ EX(function_state).function->common.function_name->val);
+ return FAILURE;
}
- zend_error(E_WARNING, "Parameter %d to %s%s%s() expected to be a reference, value given",
- i+1,
- EX(function_state).function->common.scope ? EX(function_state).function->common.scope->name->val : "",
- EX(function_state).function->common.scope ? "::" : "",
- EX(function_state).function->common.function_name->val);
- return FAILURE;
+ ZVAL_DUP(&new_zval, &fci->params[i]);
+ Z_DELREF(fci->params[i]);
+ ZVAL_COPY_VALUE(&fci->params[i], &new_zval);
}
-
- ZVAL_DUP(&new_zval, &fci->params[i]);
- Z_DELREF(fci->params[i]);
- ZVAL_COPY_VALUE(&fci->params[i], &new_zval);
+ Z_ADDREF(fci->params[i]);
}
- Z_ADDREF(fci->params[i]);
//??? Z_SET_ISREF_PP(fci->params[i]);
param = &fci->params[i];
} else if (Z_ISREF(fci->params[i]) &&
diff --git a/Zend/zend_interfaces.c b/Zend/zend_interfaces.c
index 75f6165c3b..ab23590960 100644
--- a/Zend/zend_interfaces.c
+++ b/Zend/zend_interfaces.c
@@ -62,6 +62,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
* needed later inside zend_call_function. */
fci.function_table = !object ? EG(function_table) : NULL;
result = zend_call_function(&fci, NULL TSRMLS_CC);
+ zval_ptr_dtor(&fci.function_name);
} else {
zend_fcall_info_cache fcic;
@@ -97,6 +98,7 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
}
fcic.object_ptr = object;
result = zend_call_function(&fci, &fcic TSRMLS_CC);
+ zval_ptr_dtor(&fci.function_name);
}
if (result == FAILURE) {
/* error at c-level */
diff --git a/Zend/zend_object_handlers.c b/Zend/zend_object_handlers.c
index 6acb504e5f..9029f45cc4 100644
--- a/Zend/zend_object_handlers.c
+++ b/Zend/zend_object_handlers.c
@@ -1527,9 +1527,9 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
if (EXPECTED(Z_TYPE(retval) == IS_STRING)) {
//??? INIT_PZVAL(writeobj);
if (readobj == writeobj) {
- zval_dtor(readobj);
+ zval_ptr_dtor(readobj);
}
- ZVAL_ZVAL(writeobj, &retval, 1, 1);
+ ZVAL_COPY_VALUE(writeobj, &retval);
if (Z_TYPE_P(writeobj) != type) {
convert_to_explicit_type(writeobj, type);
}
@@ -1538,7 +1538,7 @@ ZEND_API int zend_std_cast_object_tostring(zval *readobj, zval *writeobj, int ty
zval_ptr_dtor(&retval);
//??? INIT_PZVAL(writeobj);
if (readobj == writeobj) {
- zval_dtor(readobj);
+ zval_ptr_dtor(readobj);
}
ZVAL_EMPTY_STRING(writeobj);
zend_error(E_RECOVERABLE_ERROR, "Method %s::__toString() must return a string value", ce->name->val);
diff --git a/Zend/zend_opcode.c b/Zend/zend_opcode.c
index 4e25200e4a..98deca6206 100644
--- a/Zend/zend_opcode.c
+++ b/Zend/zend_opcode.c
@@ -412,7 +412,7 @@ ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC)
efree((char*)op_array->arg_info[i].name);
if (op_array->arg_info[i].class_name) {
//??? str_efree(op_array->arg_info[i].class_name);
- efree((char*)op_array->arg_info[i].class_name);
+ STR_RELEASE(op_array->arg_info[i].class_name);
}
}
efree(op_array->arg_info);
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 71e3cf4a1a..0ecc36e7cd 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -1025,7 +1025,9 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -1060,30 +1062,33 @@ ZEND_VM_HELPER_EX(zend_fetch_var_address_helper, CONST|TMP|VAR|CV, UNUSED|CONST|
if (OP1_TYPE != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
- }
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
+ }
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -3620,7 +3625,9 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=GET_OP1_ZVAL_PTR(BP_VAR_R);
if (IS_OP1_TMP_FREE()) { /* temporary variable */
@@ -3634,7 +3641,7 @@ ZEND_VM_HANDLER(72, ZEND_ADD_ARRAY_ELEMENT, CONST|TMP|VAR|CV, CONST|TMP|VAR|UNUS
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
FREE_OP1_IF_VAR();
- } else if (OP1_TYPE == IS_CV) {
+ } else if (OP1_TYPE == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 65b72e9109..fe0f5e0b69 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -3544,7 +3544,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -3579,30 +3581,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_CONST(int type
if (IS_CONST != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -3910,7 +3915,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=opline->op1.zv;
if (0) { /* temporary variable */
@@ -3924,7 +3931,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CONST_HANDLER(ZEND_O
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CONST == IS_CV) {
+ } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -4747,7 +4754,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=opline->op1.zv;
if (0) { /* temporary variable */
@@ -4761,7 +4770,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_TMP_HANDLER(ZEND_OPC
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CONST == IS_CV) {
+ } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -5292,7 +5301,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -5327,30 +5338,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_VAR(int type,
if (IS_CONST != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -5544,7 +5558,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=opline->op1.zv;
if (0) { /* temporary variable */
@@ -5558,7 +5574,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_VAR_HANDLER(ZEND_OPC
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CONST == IS_CV) {
+ } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -5973,7 +5989,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -6008,30 +6026,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CONST_UNUSED(int typ
if (IS_CONST != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -6193,7 +6214,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=opline->op1.zv;
if (0) { /* temporary variable */
@@ -6207,7 +6230,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_UNUSED_HANDLER(ZEND_
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CONST == IS_CV) {
+ } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -7073,7 +7096,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=opline->op1.zv;
if (0) { /* temporary variable */
@@ -7087,7 +7112,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CONST_CV_HANDLER(ZEND_OPCO
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CONST == IS_CV) {
+ } else if (IS_CONST == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -8564,7 +8589,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -8599,30 +8626,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_CONST(int type,
if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -8836,7 +8866,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (1) { /* temporary variable */
@@ -8850,7 +8882,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CONST_HANDLER(ZEND_OPC
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_TMP_VAR == IS_CV) {
+ } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -9648,7 +9680,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (1) { /* temporary variable */
@@ -9662,7 +9696,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_TMP_HANDLER(ZEND_OPCOD
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_TMP_VAR == IS_CV) {
+ } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -10193,7 +10227,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -10228,30 +10264,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_VAR(int type, ZE
if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10453,7 +10492,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (1) { /* temporary variable */
@@ -10467,7 +10508,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_VAR_HANDLER(ZEND_OPCOD
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_TMP_VAR == IS_CV) {
+ } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -10882,7 +10923,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -10917,30 +10960,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_TMP_UNUSED(int type,
if (IS_TMP_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -10991,7 +11037,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (1) { /* temporary variable */
@@ -11005,7 +11053,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_UNUSED_HANDLER(ZEND_OP
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_TMP_VAR == IS_CV) {
+ } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -11800,7 +11848,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_tmp(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (1) { /* temporary variable */
@@ -11814,7 +11864,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_TMP_CV_HANDLER(ZEND_OPCODE
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_TMP_VAR == IS_CV) {
+ } else if (IS_TMP_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -14110,7 +14160,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -14145,30 +14197,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_CONST(int type,
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -15053,7 +15108,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (0) { /* temporary variable */
@@ -15067,7 +15124,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CONST_HANDLER(ZEND_OPC
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
zval_ptr_dtor_nogc(free_op1.var);
- } else if (IS_VAR == IS_CV) {
+ } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -17181,7 +17238,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (0) { /* temporary variable */
@@ -17195,7 +17254,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_TMP_HANDLER(ZEND_OPCOD
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
zval_ptr_dtor_nogc(free_op1.var);
- } else if (IS_VAR == IS_CV) {
+ } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -18449,7 +18508,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -18484,30 +18545,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_VAR(int type, ZE
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -19356,7 +19420,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (0) { /* temporary variable */
@@ -19370,7 +19436,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_VAR_HANDLER(ZEND_OPCOD
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
zval_ptr_dtor_nogc(free_op1.var);
- } else if (IS_VAR == IS_CV) {
+ } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -20314,7 +20380,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -20349,30 +20417,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_VAR_UNUSED(int type,
if (IS_VAR != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20692,7 +20763,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (0) { /* temporary variable */
@@ -20706,7 +20779,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_UNUSED_HANDLER(ZEND_OP
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
zval_ptr_dtor_nogc(free_op1.var);
- } else if (IS_VAR == IS_CV) {
+ } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -22606,7 +22679,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_var(opline->op1.var, execute_data, &free_op1 TSRMLS_CC);
if (0) { /* temporary variable */
@@ -22620,7 +22695,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_VAR_CV_HANDLER(ZEND_OPCODE
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
zval_ptr_dtor_nogc(free_op1.var);
- } else if (IS_VAR == IS_CV) {
+ } else if (IS_VAR == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -30607,7 +30682,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -30642,30 +30719,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_CONST(int type, Z
if (IS_CV != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -31338,7 +31418,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (0) { /* temporary variable */
@@ -31352,7 +31434,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CONST_HANDLER(ZEND_OPCO
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CV == IS_CV) {
+ } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -33340,7 +33422,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (0) { /* temporary variable */
@@ -33354,7 +33438,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_TMP_HANDLER(ZEND_OPCODE
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CV == IS_CV) {
+ } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -34601,7 +34685,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -34636,30 +34722,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_VAR(int type, ZEN
if (IS_CV != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -35389,7 +35478,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (0) { /* temporary variable */
@@ -35403,7 +35494,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_VAR_HANDLER(ZEND_OPCODE
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CV == IS_CV) {
+ } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -36340,7 +36431,9 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
/* break missing intentionally */
case BP_VAR_IS:
- ZVAL_NULL(retval);
+ //???
+ //ZVAL_NULL(retval);
+ ZVAL_NULL(EX_VAR(opline->result.var));
break;
case BP_VAR_RW:
zend_error(E_NOTICE,"Undefined variable: %s", Z_STRVAL_P(varname));
@@ -36375,30 +36468,33 @@ static int ZEND_FASTCALL zend_fetch_var_address_helper_SPEC_CV_UNUSED(int type,
if (IS_CV != IS_CONST && varname == &tmp_varname) {
zval_dtor(&tmp_varname);
}
+
if (opline->extended_value & ZEND_FETCH_MAKE_REF) {
SEPARATE_ZVAL_TO_MAKE_IS_REF(retval);
}
- if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
- switch (type) {
- case BP_VAR_R:
- case BP_VAR_IS:
- ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
- break;
- case BP_VAR_UNSET: {
-//??? zend_free_op free_res;
-//???
-//??? PZVAL_UNLOCK(*retval, &free_res);
-//??? if (retval != &EG(uninitialized_zval_ptr)) {
-//??? SEPARATE_ZVAL_IF_NOT_REF(retval);
-//??? }
-//??? PZVAL_LOCK(*retval);
-//??? FREE_OP_VAR_PTR(free_res);
+ if (EXPECTED(retval)) {
+ if (IS_REFCOUNTED(Z_TYPE_P(retval))) Z_ADDREF_P(retval);
+ switch (type) {
+ case BP_VAR_R:
+ case BP_VAR_IS:
+ ZVAL_COPY_VALUE(EX_VAR(opline->result.var), retval);
+ break;
+ case BP_VAR_UNSET: {
+ //??? zend_free_op free_res;
+ //???
+ //??? PZVAL_UNLOCK(*retval, &free_res);
+ //??? if (retval != &EG(uninitialized_zval_ptr)) {
+ //??? SEPARATE_ZVAL_IF_NOT_REF(retval);
+ //??? }
+ //??? PZVAL_LOCK(*retval);
+ //??? FREE_OP_VAR_PTR(free_res);
+ }
+ /* break missing intentionally */
+ default:
+ ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
+ break;
}
- /* break missing intentionally */
- default:
- ZVAL_INDIRECT(EX_VAR(opline->result.var), retval);
- break;
}
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -36606,7 +36702,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (0) { /* temporary variable */
@@ -36620,7 +36718,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_UNUSED_HANDLER(ZEND_OPC
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CV == IS_CV) {
+ } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
@@ -38381,7 +38479,9 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
zend_error_noreturn(E_ERROR, "Cannot create references to/from string offsets");
}
SEPARATE_ZVAL_TO_MAKE_IS_REF(expr_ptr);
- Z_ADDREF_P(expr_ptr);
+ if (Z_COUNTED_P(expr_ptr)) {
+ Z_ADDREF_P(expr_ptr);
+ }
} else {
expr_ptr=_get_zval_ptr_cv_BP_VAR_R(execute_data, opline->op1.var TSRMLS_CC);
if (0) { /* temporary variable */
@@ -38395,7 +38495,7 @@ static int ZEND_FASTCALL ZEND_ADD_ARRAY_ELEMENT_SPEC_CV_CV_HANDLER(ZEND_OPCODE_
ZVAL_DUP(&new_expr, expr_ptr);
expr_ptr = &new_expr;
- } else if (IS_CV == IS_CV) {
+ } else if (IS_CV == IS_CV && Z_COUNTED_P(expr_ptr)) {
Z_ADDREF_P(expr_ptr);
}
}
diff --git a/ext/standard/string.c b/ext/standard/string.c
index 6a96b3cecd..8aa0d5970c 100644
--- a/ext/standard/string.c
+++ b/ext/standard/string.c
@@ -3318,8 +3318,8 @@ PHP_FUNCTION(addcslashes)
Escapes single quote, double quotes and backslash characters in a string with backslashes */
PHP_FUNCTION(addslashes)
{
- char *str;
- int str_len;
+ char *str, *new_str;
+ int str_len, new_len;
if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "s", &str, &str_len) == FAILURE) {
return;
@@ -3333,10 +3333,9 @@ PHP_FUNCTION(addslashes)
//??? str_len,
//??? &Z_STRLEN_P(return_value), 0
//??? TSRMLS_CC), 0);
- RETURN_STRING(php_addslashes(str,
- str_len,
- &Z_STRLEN_P(return_value), 0
- TSRMLS_CC));
+ new_str = php_addslashes(str, str_len, &new_len, 0 TSRMLS_CC);
+ RETVAL_STRINGL(new_str, new_len);
+ efree(new_str);
}
/* }}} */