summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--Zend/zend_execute.c83
-rw-r--r--Zend/zend_vm_def.h7
-rw-r--r--Zend/zend_vm_execute.h57
-rw-r--r--main/main.c2
4 files changed, 99 insertions, 50 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index 68b6bef360..a3f99a2f1a 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -760,63 +760,60 @@ static inline zval* zend_assign_const_to_variable(zval *variable_ptr, zval *valu
static inline zval* zend_assign_to_variable(zval *variable_ptr, zval *value TSRMLS_DC)
{
- if (Z_ISREF_P(variable_ptr)) {
+ zval garbage;
+
+ if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+ ZVAL_COPY(variable_ptr, value);
+ return variable_ptr;
+ } else if (Z_ISREF_P(variable_ptr)) {
variable_ptr = Z_REFVAL_P(variable_ptr);
}
- if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
+ if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(variable_ptr)))) {
+ ZVAL_COPY(variable_ptr, value);
+ } else if (Z_TYPE_P(variable_ptr) == IS_OBJECT &&
UNEXPECTED(Z_OBJ_HANDLER_P(variable_ptr, set) != NULL)) {
Z_OBJ_HANDLER_P(variable_ptr, set)(variable_ptr, value TSRMLS_CC);
- return variable_ptr;
- }
-
-//???
-#if 0
- if (EXPECTED(!PZVAL_IS_REF(variable_ptr))) {
+ } else if (EXPECTED(variable_ptr != value)) {
if (Z_REFCOUNT_P(variable_ptr)==1) {
- if (UNEXPECTED(variable_ptr == value)) {
- return variable_ptr;
- } else if (EXPECTED(!PZVAL_IS_REF(value))) {
- Z_ADDREF_P(value);
- *variable_ptr_ptr = value;
- ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval));
- GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
- zval_dtor(variable_ptr);
- efree(variable_ptr);
- return value;
- } else {
- goto copy_value;
- }
+//??? if (EXPECTED(!IS_REFCOUNTED(Z_TYPE_P(value)))) {
+//??? _zval_dtor_func(variable_ptr ZEND_FILE_LINE_CC);
+//??? ZVAL_COPY(variable_ptr, value);
+//??? } else if (EXPECTED(!Z_ISREF_P(value))) {
+//??? Z_ADDREF_P(value);
+//??? *variable_ptr_ptr = value;
+//??? ZEND_ASSERT(variable_ptr != &EG(uninitialized_zval));
+//??? GC_REMOVE_ZVAL_FROM_BUFFER(variable_ptr);
+//??? zval_dtor(variable_ptr);
+//??? ZVAL_COPY(variable_ptr, value);
+//??? } else {
+ ZVAL_COPY_VALUE(&garbage, variable_ptr);
+ ZVAL_DUP(variable_ptr, value);
+ _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+//??? }
} else { /* we need to split */
Z_DELREF_P(variable_ptr);
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
- if (PZVAL_IS_REF(value)) {
- ALLOC_ZVAL(variable_ptr);
- *variable_ptr_ptr = variable_ptr;
- INIT_PZVAL_COPY(variable_ptr, value);
- zval_copy_ctor(variable_ptr);
- return variable_ptr;
+ if (Z_ISREF_P(value)) {
+ ZVAL_DUP(variable_ptr, Z_REFVAL_P(value));
} else {
- *variable_ptr_ptr = value;
- Z_ADDREF_P(value);
- return value;
- }
- }
- } else {
- if (EXPECTED(variable_ptr != value)) {
-copy_value:
- if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) {
- /* nothing to destroy */
- ZVAL_DUP(variable_ptr, value);
- } else {
- ZVAL_COPY_VALUE(&garbage, variable_ptr);
- ZVAL_DUP(variable_ptr, value);
- _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+ ZVAL_COPY(variable_ptr, value);
}
}
+//??? } else {
+//??? if (EXPECTED(variable_ptr != value)) {
+//???copy_value:
+//??? if (EXPECTED(Z_TYPE_P(variable_ptr) <= IS_BOOL)) {
+//??? /* nothing to destroy */
+//??? ZVAL_DUP(variable_ptr, value);
+//??? } else {
+//??? ZVAL_COPY_VALUE(&garbage, variable_ptr);
+//??? ZVAL_DUP(variable_ptr, value);
+//??? _zval_dtor_func(&garbage ZEND_FILE_LINE_CC);
+//??? }
+//??? }
return variable_ptr;
}
-#endif
return variable_ptr;
}
diff --git a/Zend/zend_vm_def.h b/Zend/zend_vm_def.h
index 647efe4231..9dc9f91d16 100644
--- a/Zend/zend_vm_def.h
+++ b/Zend/zend_vm_def.h
@@ -495,6 +495,9 @@ ZEND_VM_HELPER_EX(zend_binary_assign_op_helper, VAR|UNUSED|CV, CONST|TMP|VAR|UNU
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -1729,8 +1732,8 @@ ZEND_VM_HANDLER(39, ZEND_ASSIGN_REF, VAR|CV, VAR|CV)
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
- FREE_OP1_VAR_PTR();
- FREE_OP2_VAR_PTR();
+//??? FREE_OP1_VAR_PTR();
+//??? FREE_OP2_VAR_PTR();
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 6f6746c3bc..5420c8e418 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -13759,6 +13759,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CONST(int (*binar
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -16118,6 +16121,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_TMP(int (*binary_
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -18079,6 +18085,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_VAR(int (*binary_
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -19089,8 +19098,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_VAR_HANDLER(ZEND_OPCODE_HANDL
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
- if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
+//??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -20128,6 +20137,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_UNUSED(int (*bina
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -21470,6 +21482,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_VAR_CV(int (*binary_o
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -22327,7 +22342,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_VAR_CV_HANDLER(ZEND_OPCODE_HANDLE
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
- if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//??? if (free_op1.var) {zval_ptr_dtor_nogc(free_op1.var);};
+//??? ;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -23283,6 +23299,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CONST(int (*bi
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -24611,6 +24630,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_TMP(int (*bina
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -25851,6 +25873,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_VAR(int (*bina
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -27092,6 +27117,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_UNUSED(int (*b
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -27487,6 +27515,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_UNUSED_CV(int (*binar
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -30163,6 +30194,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CONST(int (*binary
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -32303,6 +32337,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_TMP(int (*binary_o
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -34138,6 +34175,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_VAR(int (*binary_o
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -35141,7 +35181,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_VAR_HANDLER(ZEND_OPCODE_HANDLE
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
- if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
+//??? ;
+//??? if (free_op2.var) {zval_ptr_dtor_nogc(free_op2.var);};
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
@@ -36060,6 +36101,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_UNUSED(int (*binar
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -37270,6 +37314,9 @@ static int ZEND_FASTCALL zend_binary_assign_op_helper_SPEC_CV_CV(int (*binary_op
Z_OBJ_HANDLER_P(var_ptr, set)(var_ptr, objval TSRMLS_CC);
zval_ptr_dtor(objval);
} else {
+ if (Z_ISREF_P(var_ptr)) {
+ var_ptr = Z_REFVAL_P(var_ptr);
+ }
binary_op(var_ptr, var_ptr, value TSRMLS_CC);
}
@@ -38120,6 +38167,8 @@ static int ZEND_FASTCALL ZEND_ASSIGN_REF_SPEC_CV_CV_HANDLER(ZEND_OPCODE_HANDLER
ZVAL_COPY(EX_VAR(opline->result.var), variable_ptr);
}
+//??? ;
+//??? ;
CHECK_EXCEPTION();
ZEND_VM_NEXT_OPCODE();
diff --git a/main/main.c b/main/main.c
index b3dbfa0f8b..b2068cd137 100644
--- a/main/main.c
+++ b/main/main.c
@@ -1090,7 +1090,7 @@ static void php_error_cb(int type, const char *error_filename, const uint error_
if (PG(html_errors)) {
if (type == E_ERROR || type == E_PARSE) {
zend_string *buf = php_escape_html_entities(buffer, buffer_len, 0, ENT_COMPAT, NULL TSRMLS_CC);
- php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf, error_filename, error_lineno, STR_PRINT(append_string));
+ php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buf->val, error_filename, error_lineno, STR_PRINT(append_string));
STR_FREE(buf);
} else {
php_printf("%s<br />\n<b>%s</b>: %s in <b>%s</b> on line <b>%d</b><br />\n%s", STR_PRINT(prepend_string), error_type_str, buffer, error_filename, error_lineno, STR_PRINT(append_string));