diff options
author | Nikita Popov <nikita.ppv@gmail.com> | 2020-06-08 17:10:24 +0200 |
---|---|---|
committer | Nikita Popov <nikita.ppv@gmail.com> | 2020-06-09 16:21:54 +0200 |
commit | 257dbb04501391e0ac57e66aebe2e4d25dcc5c91 (patch) | |
tree | 2ea10373c366bc81468d3172ed49fb4860741a90 /Zend/zend_API.h | |
parent | bcada03f48b242930ded84d66c1f0b826176f696 (diff) | |
download | php-git-257dbb04501391e0ac57e66aebe2e4d25dcc5c91.tar.gz |
Add zend_call_known_function() API family
This adds the following APIs:
void zend_call_known_function(
zend_function *fn, zend_object *object, zend_class_entry *called_scope,
zval *retval_ptr, int param_count, zval *params);
void zend_call_known_instance_method(
zend_function *fn, zend_object *object, zval *retval_ptr, int param_count, zval *params);
void zend_call_known_instance_method_with_0_params(
zend_function *fn, zend_object *object, zval *retval_ptr);
void zend_call_known_instance_method_with_1_params(
zend_function *fn, zend_object *object, zval *retval_ptr, zval *param);
void zend_call_known_instance_method_with_2_params(
zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2);
These are used to perform a call if you already have the
zend_function you want to call. zend_call_known_function()
is the base API, the rest are just really thin wrappers around
it for the common case of instance method calls.
Closes GH-5692.
Diffstat (limited to 'Zend/zend_API.h')
-rw-r--r-- | Zend/zend_API.h | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/Zend/zend_API.h b/Zend/zend_API.h index 944bef850d..ae391d98e5 100644 --- a/Zend/zend_API.h +++ b/Zend/zend_API.h @@ -563,6 +563,37 @@ ZEND_API int zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache *f ZEND_API int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache); +/* Call the provided zend_function with the given params. + * If retval_ptr is NULL, the return value is discarded. + * If object is NULL, this must be a free function or static call. + * called_scope must be provided for instance and static method calls. */ +ZEND_API void zend_call_known_function( + zend_function *fn, zend_object *object, zend_class_entry *called_scope, zval *retval_ptr, + uint32_t param_count, zval *params); + +/* Call the provided zend_function instance method on an object. */ +static zend_always_inline void zend_call_known_instance_method( + zend_function *fn, zend_object *object, zval *retval_ptr, + uint32_t param_count, zval *params) +{ + zend_call_known_function(fn, object, object->ce, retval_ptr, param_count, params); +} + +static zend_always_inline void zend_call_known_instance_method_with_0_params( + zend_function *fn, zend_object *object, zval *retval_ptr) +{ + zend_call_known_instance_method(fn, object, retval_ptr, 0, NULL); +} + +static zend_always_inline void zend_call_known_instance_method_with_1_params( + zend_function *fn, zend_object *object, zval *retval_ptr, zval *param) +{ + zend_call_known_instance_method(fn, object, retval_ptr, 1, param); +} + +ZEND_API void zend_call_known_instance_method_with_2_params( + zend_function *fn, zend_object *object, zval *retval_ptr, zval *param1, zval *param2); + ZEND_API int zend_set_hash_symbol(zval *symbol, const char *name, int name_length, zend_bool is_ref, int num_symbol_tables, ...); ZEND_API int zend_delete_global_variable(zend_string *name); |