summaryrefslogtreecommitdiff
path: root/Zend/zend_API.c
diff options
context:
space:
mode:
authorZeev Suraski <zeev@php.net>2003-08-03 17:40:44 +0000
committerZeev Suraski <zeev@php.net>2003-08-03 17:40:44 +0000
commitf8bbafd604528c7162b7b1706a09e12545fb2dcb (patch)
tree9e65cf36603173dc4aebc1fb2971b79cb1b7e7b1 /Zend/zend_API.c
parentf05452fbcdceac2d1d8176d2c1b69c741af54ae9 (diff)
downloadphp-git-f8bbafd604528c7162b7b1706a09e12545fb2dcb.tar.gz
ntroduce infrastructure for supplying information about arguments,
including: - Whether or not to pass by ref (replaces the old arg_types, with arg_info) - Argument name (for future use, maybe introspection) - Class/Interface name (for type hints) - If a class/interface name is available, whether to allow a null instance Both user and builtin functions share the same data structures. To declare a builtin function that expects its first arg to be an instance of class 'Person', its second argument as a regular arg, and its third by reference, use: ZEND_BEGIN_ARG_INFO(my_func_arg_info, 0) ZEND_ARG_OBJ_INFO(0, someone, Person, 1) ZEND_ARG_PASS_INFO(0) ZEND_ARG_PASS_INFO(1) ZEND_END_ARG_INFO(); and use my_func_arg_info as the arg_info parameter to the ZEND_FE() family of macros. The first arg to each ZEND_ARG_*() macro is whether or not to pass by ref. The boolean arg to ZEND_BEGIN_ARG_INFO() tells the engine whether to treat the arguments for which there's no explicit information as pass by reference or not. The boolean argument to ZEND_ARG_OBJ_INFO() (4th arg) is whether or not to allownull values.
Diffstat (limited to 'Zend/zend_API.c')
-rw-r--r--Zend/zend_API.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/Zend/zend_API.c b/Zend/zend_API.c
index c22cef4708..88faa34bd5 100644
--- a/Zend/zend_API.c
+++ b/Zend/zend_API.c
@@ -1158,11 +1158,20 @@ int zend_register_functions(zend_class_entry *scope, zend_function_entry *functi
while (ptr->fname) {
internal_function->handler = ptr->handler;
- internal_function->arg_types = ptr->func_arg_types;
internal_function->function_name = ptr->fname;
internal_function->scope = scope;
internal_function->fn_flags = ZEND_ACC_PUBLIC;
internal_function->prototype = NULL;
+ if (ptr->arg_info) {
+ internal_function->arg_info = ptr->arg_info+1;
+ internal_function->num_args = ptr->num_args;
+ internal_function->pass_rest_by_reference = ptr->arg_info[0].pass_by_reference;
+ } else {
+ internal_function->arg_info = NULL;
+ internal_function->num_args = 0;
+ internal_function->pass_rest_by_reference = 0;
+ }
+ internal_function->fn_flags = ptr->flags;
if (!internal_function->handler) {
zend_error(error_type, "Null function defined as active function");
zend_unregister_functions(functions, count, target_function_table TSRMLS_CC);