summaryrefslogtreecommitdiff
path: root/Zend/zend_vm_execute.h
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_vm_execute.h')
-rw-r--r--Zend/zend_vm_execute.h92
1 files changed, 49 insertions, 43 deletions
diff --git a/Zend/zend_vm_execute.h b/Zend/zend_vm_execute.h
index 8c5223cc47..69688177d7 100644
--- a/Zend/zend_vm_execute.h
+++ b/Zend/zend_vm_execute.h
@@ -214,7 +214,7 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
zend_hash_init(EG(active_symbol_table), 0, NULL, ZVAL_PTR_DTOR, 0);
/*printf("Cache miss! Initialized %x\n", EG(active_symbol_table));*/
}
- EG(return_value_ptr_ptr) = &EX_T(opline->result.u.var).var.ptr;
+ EG(return_value_ptr_ptr) = RETURN_VALUE_USED(opline) ? &EX_T(opline->result.u.var).var.ptr : NULL;
EG(active_op_array) = (zend_op_array *) EX(function_state).function;
zend_execute(EG(active_op_array) TSRMLS_CC);
@@ -224,8 +224,6 @@ static int zend_do_fcall_common_helper_SPEC(ZEND_OPCODE_HANDLER_ARGS)
if (!EX_T(opline->result.u.var).var.ptr && !EG(exception)) {
ALLOC_INIT_ZVAL(EX_T(opline->result.u.var).var.ptr);
}
- } else if (EX_T(opline->result.u.var).var.ptr) {
- zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
}
EG(opline_ptr) = &EX(opline);
@@ -1445,16 +1443,22 @@ static int ZEND_RETURN_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
- Z_ADDREF_PP(retval_ptr_ptr);
+ if (EG(return_value_ptr_ptr)) {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
+ Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ }
} else {
return_by_value:
retval_ptr = &opline->op1.u.constant;
- if (!0) { /* Not a temp var */
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CONST == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
if (EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
(PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
zval *ret;
@@ -1737,7 +1741,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *saved_object;
zend_function *saved_function;
- EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;
+ EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
EG(active_op_array) = new_op_array;
EX_T(opline->result.u.var).var.ptr = NULL;
@@ -1752,11 +1756,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CONST_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
EX(function_state).function = saved_function;
EX(object) = saved_object;
- if (!return_value_used) {
- if (EX_T(opline->result.u.var).var.ptr) {
- zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
- }
- } else { /* return value is used */
+ if (return_value_used) {
if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
@@ -4603,16 +4603,22 @@ static int ZEND_RETURN_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
- Z_ADDREF_PP(retval_ptr_ptr);
+ if (EG(return_value_ptr_ptr)) {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
+ Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ }
} else {
return_by_value:
retval_ptr = _get_zval_ptr_tmp(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!1) { /* Not a temp var */
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_TMP_VAR == IS_TMP_VAR) {
+ zval_dtor(free_op1.var);
+ }
+ } else if (!1) { /* Not a temp var */
if (EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
(PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
zval *ret;
@@ -4904,7 +4910,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *saved_object;
zend_function *saved_function;
- EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;
+ EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
EG(active_op_array) = new_op_array;
EX_T(opline->result.u.var).var.ptr = NULL;
@@ -4919,11 +4925,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_TMP_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
EX(function_state).function = saved_function;
EX(object) = saved_object;
- if (!return_value_used) {
- if (EX_T(opline->result.u.var).var.ptr) {
- zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
- }
- } else { /* return value is used */
+ if (return_value_used) {
if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
@@ -7696,16 +7698,22 @@ static int ZEND_RETURN_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
- Z_ADDREF_PP(retval_ptr_ptr);
+ if (EG(return_value_ptr_ptr)) {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
+ Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ }
} else {
return_by_value:
retval_ptr = _get_zval_ptr_var(&opline->op1, EX(Ts), &free_op1 TSRMLS_CC);
- if (!0) { /* Not a temp var */
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_VAR == IS_TMP_VAR) {
+ if (free_op1.var) {zval_ptr_dtor(&free_op1.var);};
+ }
+ } else if (!0) { /* Not a temp var */
if (EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
(PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
zval *ret;
@@ -8102,7 +8110,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *saved_object;
zend_function *saved_function;
- EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;
+ EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
EG(active_op_array) = new_op_array;
EX_T(opline->result.u.var).var.ptr = NULL;
@@ -8117,11 +8125,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_VAR_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
EX(function_state).function = saved_function;
EX(object) = saved_object;
- if (!return_value_used) {
- if (EX_T(opline->result.u.var).var.ptr) {
- zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
- }
- } else { /* return value is used */
+ if (return_value_used) {
if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);
@@ -21368,16 +21372,22 @@ static int ZEND_RETURN_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
}
}
- SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
- Z_ADDREF_PP(retval_ptr_ptr);
+ if (EG(return_value_ptr_ptr)) {
+ SEPARATE_ZVAL_TO_MAKE_IS_REF(retval_ptr_ptr);
+ Z_ADDREF_PP(retval_ptr_ptr);
- (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ (*EG(return_value_ptr_ptr)) = (*retval_ptr_ptr);
+ }
} else {
return_by_value:
retval_ptr = _get_zval_ptr_cv(&opline->op1, EX(Ts), BP_VAR_R TSRMLS_CC);
- if (!0) { /* Not a temp var */
+ if (!EG(return_value_ptr_ptr)) {
+ if (IS_CV == IS_TMP_VAR) {
+
+ }
+ } else if (!0) { /* Not a temp var */
if (EG(active_op_array)->return_reference == ZEND_RETURN_REF ||
(PZVAL_IS_REF(retval_ptr) && Z_REFCOUNT_P(retval_ptr) > 0)) {
zval *ret;
@@ -21764,7 +21774,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
zval *saved_object;
zend_function *saved_function;
- EG(return_value_ptr_ptr) = EX_T(opline->result.u.var).var.ptr_ptr;
+ EG(return_value_ptr_ptr) = return_value_used ? EX_T(opline->result.u.var).var.ptr_ptr : NULL;
EG(active_op_array) = new_op_array;
EX_T(opline->result.u.var).var.ptr = NULL;
@@ -21779,11 +21789,7 @@ static int ZEND_INCLUDE_OR_EVAL_SPEC_CV_HANDLER(ZEND_OPCODE_HANDLER_ARGS)
EX(function_state).function = saved_function;
EX(object) = saved_object;
- if (!return_value_used) {
- if (EX_T(opline->result.u.var).var.ptr) {
- zval_ptr_dtor(&EX_T(opline->result.u.var).var.ptr);
- }
- } else { /* return value is used */
+ if (return_value_used) {
if (!EX_T(opline->result.u.var).var.ptr) { /* there was no return statement */
ALLOC_ZVAL(EX_T(opline->result.u.var).var.ptr);
INIT_PZVAL(EX_T(opline->result.u.var).var.ptr);