Avoid some unnecessary uses of no_separation=0

For the rare cases where references are part of the API,
construct them explicitly. Otherwise do not allow separation.
This commit is contained in:
Nikita Popov 2020-07-06 18:57:41 +02:00
parent 4a0d6901bb
commit 0280b83e11
8 changed files with 41 additions and 52 deletions

View file

@ -500,9 +500,9 @@ ZEND_API int add_property_zval_ex(zval *arg, const char *key, size_t key_len, zv
ZEND_API int _call_user_function_ex(zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[], int no_separation); ZEND_API int _call_user_function_ex(zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[], int no_separation);
#define call_user_function(function_table, object, function_name, retval_ptr, param_count, params) \ #define call_user_function(_unused, object, function_name, retval_ptr, param_count, params) \
_call_user_function_ex(object, function_name, retval_ptr, param_count, params, 1) _call_user_function_ex(object, function_name, retval_ptr, param_count, params, 1)
#define call_user_function_ex(function_table, object, function_name, retval_ptr, param_count, params, no_separation, symbol_table) \ #define call_user_function_ex(_unused, object, function_name, retval_ptr, param_count, params, no_separation, _unused2) \
_call_user_function_ex(object, function_name, retval_ptr, param_count, params, no_separation) _call_user_function_ex(object, function_name, retval_ptr, param_count, params, no_separation)
ZEND_API extern const zend_fcall_info empty_fcall_info; ZEND_API extern const zend_fcall_info empty_fcall_info;

View file

@ -3748,7 +3748,7 @@ int _ldap_rebind_proc(LDAP *ldap, const char *url, ber_tag_t req, ber_int_t msgi
/* callback */ /* callback */
ZVAL_COPY_VALUE(&cb_args[0], cb_link); ZVAL_COPY_VALUE(&cb_args[0], cb_link);
ZVAL_STRING(&cb_args[1], url); ZVAL_STRING(&cb_args[1], url);
if (call_user_function_ex(EG(function_table), NULL, &ld->rebindproc, &cb_retval, 2, cb_args, 0, NULL) == SUCCESS && !Z_ISUNDEF(cb_retval)) { if (call_user_function(EG(function_table), NULL, &ld->rebindproc, &cb_retval, 2, cb_args) == SUCCESS && !Z_ISUNDEF(cb_retval)) {
retval = zval_get_long(&cb_retval); retval = zval_get_long(&cb_retval);
zval_ptr_dtor(&cb_retval); zval_ptr_dtor(&cb_retval);
} else { } else {

View file

@ -1149,7 +1149,7 @@ static void php_openssl_limit_handshake_reneg(const SSL *ssl) /* {{{ */
/* Closing the stream inside this callback would segfault! */ /* Closing the stream inside this callback would segfault! */
stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE; stream->flags |= PHP_STREAM_FLAG_NO_FCLOSE;
if (FAILURE == call_user_function_ex(NULL, NULL, val, &retval, 1, &param, 0, NULL)) { if (FAILURE == call_user_function(NULL, NULL, val, &retval, 1, &param)) {
php_error(E_WARNING, "SSL: failed invoking reneg limit notification callback"); php_error(E_WARNING, "SSL: failed invoking reneg limit notification callback");
} }
stream->flags ^= PHP_STREAM_FLAG_NO_FCLOSE; stream->flags ^= PHP_STREAM_FLAG_NO_FCLOSE;

View file

@ -859,7 +859,7 @@ static void user_space_stream_notifier(php_stream_context *context, int notifyco
ZVAL_LONG(&zvs[4], bytes_sofar); ZVAL_LONG(&zvs[4], bytes_sofar);
ZVAL_LONG(&zvs[5], bytes_max); ZVAL_LONG(&zvs[5], bytes_max);
if (FAILURE == call_user_function_ex(NULL, NULL, callback, &retval, 6, zvs, 0, NULL)) { if (FAILURE == call_user_function(NULL, NULL, callback, &retval, 6, zvs)) {
php_error_docref(NULL, E_WARNING, "Failed to call user notifier"); php_error_docref(NULL, E_WARNING, "Failed to call user notifier");
} }
for (i = 0; i < 6; i++) { for (i = 0; i < 6; i++) {

View file

@ -174,15 +174,15 @@ php_stream_filter_status_t userfilter_filter(
} else { } else {
ZVAL_NULL(&args[2]); ZVAL_NULL(&args[2]);
} }
ZVAL_MAKE_REF(&args[2]);
ZVAL_BOOL(&args[3], flags & PSFS_FLAG_FLUSH_CLOSE); ZVAL_BOOL(&args[3], flags & PSFS_FLAG_FLUSH_CLOSE);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
obj, obj,
&func_name, &func_name,
&retval, &retval,
4, args, 4, args);
0, NULL);
zval_ptr_dtor(&func_name); zval_ptr_dtor(&func_name);

View file

@ -1097,7 +1097,7 @@ object ":" uiv ":" ["] {
ZVAL_STR_COPY(&args[0], class_name); ZVAL_STR_COPY(&args[0], class_name);
BG(serialize_lock)++; BG(serialize_lock)++;
if (call_user_function_ex(NULL, NULL, &user_func, &retval, 1, args, 0, NULL) != SUCCESS) { if (call_user_function(NULL, NULL, &user_func, &retval, 1, args) != SUCCESS) {
BG(serialize_lock)--; BG(serialize_lock)--;
if (EG(exception)) { if (EG(exception)) {
zend_string_release_ex(class_name, 0); zend_string_release_ex(class_name, 0);

View file

@ -2929,7 +2929,7 @@ static void _php_zip_progress_callback(zip_t *arch, double state, void *ptr)
ze_zip_object *obj = ptr; ze_zip_object *obj = ptr;
ZVAL_DOUBLE(&cb_args[0], state); ZVAL_DOUBLE(&cb_args[0], state);
if (call_user_function_ex(EG(function_table), NULL, &obj->progress_callback, &cb_retval, 1, cb_args, 0, NULL) == SUCCESS && !Z_ISUNDEF(cb_retval)) { if (call_user_function(EG(function_table), NULL, &obj->progress_callback, &cb_retval, 1, cb_args) == SUCCESS && !Z_ISUNDEF(cb_retval)) {
zval_ptr_dtor(&cb_retval); zval_ptr_dtor(&cb_retval);
} }
} }
@ -2985,7 +2985,7 @@ static int _php_zip_cancel_callback(zip_t *arch, void *ptr)
int retval = 0; int retval = 0;
ze_zip_object *obj = ptr; ze_zip_object *obj = ptr;
if (call_user_function_ex(EG(function_table), NULL, &obj->cancel_callback, &cb_retval, 0, NULL, 0, NULL) == SUCCESS && !Z_ISUNDEF(cb_retval)) { if (call_user_function(EG(function_table), NULL, &obj->cancel_callback, &cb_retval, 0, NULL) == SUCCESS && !Z_ISUNDEF(cb_retval)) {
retval = zval_get_long(&cb_retval); retval = zval_get_long(&cb_retval);
zval_ptr_dtor(&cb_retval); zval_ptr_dtor(&cb_retval);
} }

View file

@ -373,12 +373,11 @@ static php_stream *user_wrapper_opener(php_stream_wrapper *wrapper, const char *
ZVAL_STRING(&zfuncname, USERSTREAM_OPEN); ZVAL_STRING(&zfuncname, USERSTREAM_OPEN);
zend_try { zend_try {
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&zfuncname, &zfuncname,
&zretval, &zretval,
4, args, 4, args);
0, NULL );
} zend_catch { } zend_catch {
FG(user_stream_current_filename) = NULL; FG(user_stream_current_filename) = NULL;
zend_bailout(); zend_bailout();
@ -452,12 +451,11 @@ static php_stream *user_wrapper_opendir(php_stream_wrapper *wrapper, const char
ZVAL_STRING(&zfuncname, USERSTREAM_DIR_OPEN); ZVAL_STRING(&zfuncname, USERSTREAM_DIR_OPEN);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&zfuncname, &zfuncname,
&zretval, &zretval,
2, args, 2, args);
0, NULL );
if (call_result == SUCCESS && Z_TYPE(zretval) != IS_UNDEF && zval_is_true(&zretval)) { if (call_result == SUCCESS && Z_TYPE(zretval) != IS_UNDEF && zval_is_true(&zretval)) {
/* the stream is now open! */ /* the stream is now open! */
@ -601,12 +599,11 @@ static ssize_t php_userstreamop_write(php_stream *stream, const char *buf, size_
ZVAL_STRINGL(&args[0], (char*)buf, count); ZVAL_STRINGL(&args[0], (char*)buf, count);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
1, args, 1, args);
0, NULL);
zval_ptr_dtor(&args[0]); zval_ptr_dtor(&args[0]);
zval_ptr_dtor(&func_name); zval_ptr_dtor(&func_name);
@ -655,12 +652,11 @@ static ssize_t php_userstreamop_read(php_stream *stream, char *buf, size_t count
ZVAL_LONG(&args[0], count); ZVAL_LONG(&args[0], count);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
1, args, 1, args);
0, NULL);
zval_ptr_dtor(&args[0]); zval_ptr_dtor(&args[0]);
zval_ptr_dtor(&func_name); zval_ptr_dtor(&func_name);
@ -796,12 +792,11 @@ static int php_userstreamop_seek(php_stream *stream, zend_off_t offset, int when
ZVAL_LONG(&args[0], offset); ZVAL_LONG(&args[0], offset);
ZVAL_LONG(&args[1], whence); ZVAL_LONG(&args[1], whence);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
2, args, 2, args);
0, NULL);
zval_ptr_dtor(&args[0]); zval_ptr_dtor(&args[0]);
zval_ptr_dtor(&args[1]); zval_ptr_dtor(&args[1]);
@ -969,11 +964,11 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value
/* TODO wouldblock */ /* TODO wouldblock */
ZVAL_STRINGL(&func_name, USERSTREAM_LOCK, sizeof(USERSTREAM_LOCK)-1); ZVAL_STRINGL(&func_name, USERSTREAM_LOCK, sizeof(USERSTREAM_LOCK)-1);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
1, args, 0, NULL); 1, args);
if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE)) {
ret = (Z_TYPE(retval) == IS_FALSE); ret = (Z_TYPE(retval) == IS_FALSE);
@ -1010,11 +1005,11 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value
ptrdiff_t new_size = *(ptrdiff_t*) ptrparam; ptrdiff_t new_size = *(ptrdiff_t*) ptrparam;
if (new_size >= 0 && new_size <= (ptrdiff_t)LONG_MAX) { if (new_size >= 0 && new_size <= (ptrdiff_t)LONG_MAX) {
ZVAL_LONG(&args[0], (zend_long)new_size); ZVAL_LONG(&args[0], (zend_long)new_size);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
1, args, 0, NULL); 1, args);
if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) { if (call_result == SUCCESS && Z_TYPE(retval) != IS_UNDEF) {
if (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE) { if (Z_TYPE(retval) == IS_FALSE || Z_TYPE(retval) == IS_TRUE) {
ret = (Z_TYPE(retval) == IS_TRUE) ? PHP_STREAM_OPTION_RETURN_OK : ret = (Z_TYPE(retval) == IS_TRUE) ? PHP_STREAM_OPTION_RETURN_OK :
@ -1074,11 +1069,11 @@ static int php_userstreamop_set_option(php_stream *stream, int option, int value
break; break;
} }
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
3, args, 0, NULL); 3, args);
if (call_result == FAILURE) { if (call_result == FAILURE) {
php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_SET_OPTION " is not implemented!", php_error_docref(NULL, E_WARNING, "%s::" USERSTREAM_SET_OPTION " is not implemented!",
@ -1124,12 +1119,11 @@ static int user_wrapper_unlink(php_stream_wrapper *wrapper, const char *url, int
ZVAL_STRING(&zfuncname, USERSTREAM_UNLINK); ZVAL_STRING(&zfuncname, USERSTREAM_UNLINK);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
1, args, 1, args);
0, NULL );
if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) {
ret = (Z_TYPE(zretval) == IS_TRUE); ret = (Z_TYPE(zretval) == IS_TRUE);
@ -1169,12 +1163,11 @@ static int user_wrapper_rename(php_stream_wrapper *wrapper, const char *url_from
ZVAL_STRING(&zfuncname, USERSTREAM_RENAME); ZVAL_STRING(&zfuncname, USERSTREAM_RENAME);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
2, args, 2, args);
0, NULL );
if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) {
ret = (Z_TYPE(zretval) == IS_TRUE); ret = (Z_TYPE(zretval) == IS_TRUE);
@ -1216,12 +1209,11 @@ static int user_wrapper_mkdir(php_stream_wrapper *wrapper, const char *url, int
ZVAL_STRING(&zfuncname, USERSTREAM_MKDIR); ZVAL_STRING(&zfuncname, USERSTREAM_MKDIR);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
3, args, 3, args);
0, NULL );
if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) {
ret = (Z_TYPE(zretval) == IS_TRUE); ret = (Z_TYPE(zretval) == IS_TRUE);
@ -1263,12 +1255,11 @@ static int user_wrapper_rmdir(php_stream_wrapper *wrapper, const char *url,
ZVAL_STRING(&zfuncname, USERSTREAM_RMDIR); ZVAL_STRING(&zfuncname, USERSTREAM_RMDIR);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
2, args, 2, args);
0, NULL );
if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) {
ret = (Z_TYPE(zretval) == IS_TRUE); ret = (Z_TYPE(zretval) == IS_TRUE);
@ -1334,12 +1325,11 @@ static int user_wrapper_metadata(php_stream_wrapper *wrapper, const char *url, i
ZVAL_STRING(&zfuncname, USERSTREAM_METADATA); ZVAL_STRING(&zfuncname, USERSTREAM_METADATA);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
3, args, 3, args);
0, NULL );
if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) { if (call_result == SUCCESS && (Z_TYPE(zretval) == IS_FALSE || Z_TYPE(zretval) == IS_TRUE)) {
ret = Z_TYPE(zretval) == IS_TRUE; ret = Z_TYPE(zretval) == IS_TRUE;
@ -1382,12 +1372,11 @@ static int user_wrapper_stat_url(php_stream_wrapper *wrapper, const char *url, i
ZVAL_STRING(&zfuncname, USERSTREAM_STATURL); ZVAL_STRING(&zfuncname, USERSTREAM_STATURL);
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
&object, &object,
&zfuncname, &zfuncname,
&zretval, &zretval,
2, args, 2, args);
0, NULL );
if (call_result == SUCCESS && Z_TYPE(zretval) == IS_ARRAY) { if (call_result == SUCCESS && Z_TYPE(zretval) == IS_ARRAY) {
/* We got the info we needed */ /* We got the info we needed */
@ -1517,11 +1506,11 @@ static int php_userstreamop_cast(php_stream *stream, int castas, void **retptr)
break; break;
} }
call_result = call_user_function_ex(NULL, call_result = call_user_function(NULL,
Z_ISUNDEF(us->object)? NULL : &us->object, Z_ISUNDEF(us->object)? NULL : &us->object,
&func_name, &func_name,
&retval, &retval,
1, args, 0, NULL); 1, args);
do { do {
if (call_result == FAILURE) { if (call_result == FAILURE) {