mirror of
https://github.com/php/php-src.git
synced 2024-11-23 18:04:36 +08:00
Fixed passing argument by refefence from internal functions
This commit is contained in:
parent
1968e6be65
commit
36cd92a7d3
@ -867,10 +867,8 @@ int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache TS
|
||||
ZVAL_NEW_REF(&fci->params[i], &tmp);
|
||||
Z_ADDREF(fci->params[i]);
|
||||
} else if (!Z_ISREF(fci->params[i])) {
|
||||
if (Z_REFCOUNTED(fci->params[i])) {
|
||||
Z_ADDREF(fci->params[i]);
|
||||
}
|
||||
ZVAL_NEW_REF(&fci->params[i], &fci->params[i]);
|
||||
Z_ADDREF(fci->params[i]);
|
||||
} else if (Z_REFCOUNTED(fci->params[i])) {
|
||||
Z_ADDREF(fci->params[i]);
|
||||
}
|
||||
|
@ -113,6 +113,13 @@ ZEND_API zval* zend_call_method(zval *object, zend_class_entry *obj_ce, zend_fun
|
||||
zend_error(E_CORE_ERROR, "Couldn't execute method %s%s%s", obj_ce ? obj_ce->name->val : "", obj_ce ? "::" : "", function_name);
|
||||
}
|
||||
}
|
||||
/* copy arguments back, they might be changed by references */
|
||||
if (param_count > 0) {
|
||||
ZVAL_COPY_VALUE(arg1, ¶ms[0]);
|
||||
}
|
||||
if (param_count > 1) {
|
||||
ZVAL_COPY_VALUE(arg2, ¶ms[1]);
|
||||
}
|
||||
if (!retval_ptr) {
|
||||
zval_ptr_dtor(&retval);
|
||||
return NULL;
|
||||
|
@ -78,7 +78,7 @@ ZEND_API void _zval_dtor_func(zend_refcounted *p ZEND_FILE_LINE_DC)
|
||||
case IS_REFERENCE: {
|
||||
zend_reference *ref = (zend_reference*)p;
|
||||
if (--ref->gc.refcount == 0) {
|
||||
zval_dtor(&ref->val);
|
||||
zval_ptr_dtor(&ref->val);
|
||||
goto gc_exit;
|
||||
}
|
||||
goto exit;
|
||||
@ -142,7 +142,7 @@ ZEND_API void _zval_dtor_func_for_ptr(zend_refcounted *p ZEND_FILE_LINE_DC)
|
||||
case IS_REFERENCE: {
|
||||
zend_reference *ref = (zend_reference*)p;
|
||||
|
||||
zval_dtor(&ref->val);
|
||||
zval_ptr_dtor(&ref->val);
|
||||
goto gc_exit;
|
||||
}
|
||||
default:
|
||||
|
Loading…
Reference in New Issue
Block a user