summaryrefslogtreecommitdiff
path: root/Zend/zend_execute.c
diff options
context:
space:
mode:
Diffstat (limited to 'Zend/zend_execute.c')
-rw-r--r--Zend/zend_execute.c35
1 files changed, 24 insertions, 11 deletions
diff --git a/Zend/zend_execute.c b/Zend/zend_execute.c
index a65f5331de..048c1fc184 100644
--- a/Zend/zend_execute.c
+++ b/Zend/zend_execute.c
@@ -183,8 +183,7 @@ static zend_always_inline zval *_get_zval_ptr_var(zend_uint var, const zend_exec
{
zval *ptr = EX_T(var).var.ptr;
- PZVAL_UNLOCK(ptr, should_free);
- return ptr;
+ return should_free->var = ptr;
}
static zend_never_inline zval **_get_zval_cv_lookup(zval ***ptr, zend_uint var, int type TSRMLS_DC)
@@ -386,6 +385,19 @@ static zend_always_inline zval **_get_zval_ptr_ptr_var(zend_uint var, const zend
return ptr_ptr;
}
+static zend_always_inline zval **_get_zval_ptr_ptr_var_fast(zend_uint var, const zend_execute_data *execute_data, zend_free_op *should_free TSRMLS_DC)
+{
+ zval** ptr_ptr = EX_T(var).var.ptr_ptr;
+
+ if (EXPECTED(ptr_ptr != NULL)) {
+ should_free->var = *ptr_ptr;
+ } else {
+ /* string offset */
+ should_free->var = EX_T(var).str_offset.str;
+ }
+ return ptr_ptr;
+}
+
static zend_always_inline zval **_get_zval_ptr_ptr_cv(zend_uint var, int type TSRMLS_DC)
{
zval ***ptr = EX_CV_NUM(EG(current_execute_data), var);
@@ -909,7 +921,7 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
} else { /* we need to split */
Z_DELREF_P(variable_ptr);
GC_ZVAL_CHECK_POSSIBLE_ROOT(variable_ptr);
- if (PZVAL_IS_REF(value) && Z_REFCOUNT_P(value) > 0) {
+ if (PZVAL_IS_REF(value)) {
ALLOC_ZVAL(variable_ptr);
*variable_ptr_ptr = variable_ptr;
INIT_PZVAL_COPY(variable_ptr, value);
@@ -918,7 +930,6 @@ static inline zval* zend_assign_to_variable(zval **variable_ptr_ptr, zval *value
} else {
*variable_ptr_ptr = value;
Z_ADDREF_P(value);
- Z_UNSET_ISREF_P(value);
return value;
}
}
@@ -1476,15 +1487,17 @@ ZEND_API opcode_handler_t *zend_opcode_handlers;
ZEND_API void execute_internal(zend_execute_data *execute_data_ptr, zend_fcall_info *fci, int return_value_used TSRMLS_DC)
{
- if(fci != NULL) {
- ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(fci->param_count,
- *fci->retval_ptr_ptr, fci->retval_ptr_ptr, fci->object_ptr, 1 TSRMLS_CC);
-
+ if (fci != NULL) {
+ execute_data_ptr->function_state.function->internal_function.handler(
+ fci->param_count, *fci->retval_ptr_ptr, fci->retval_ptr_ptr,
+ fci->object_ptr, 1 TSRMLS_CC
+ );
} else {
zval **return_value_ptr = &EX_TMP_VAR(execute_data_ptr, execute_data_ptr->opline->result.var)->var.ptr;
- ((zend_internal_function *) execute_data_ptr->function_state.function)->handler(execute_data_ptr->opline->extended_value, *return_value_ptr,
- (execute_data_ptr->function_state.function->common.fn_flags & ZEND_ACC_RETURN_REFERENCE)?return_value_ptr:NULL,
- execute_data_ptr->object, return_value_used TSRMLS_CC);
+ execute_data_ptr->function_state.function->internal_function.handler(
+ execute_data_ptr->opline->extended_value, *return_value_ptr, return_value_ptr,
+ execute_data_ptr->object, return_value_used TSRMLS_CC
+ );
}
}