1999-04-08 02:10:10 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Zend Engine |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2007-12-31 15:17:19 +08:00
| Copyright ( c ) 1998 - 2008 Zend Technologies Ltd . ( http : //www.zend.com) |
1999-04-08 02:10:10 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2001-12-11 23:16:21 +08:00
| This source file is subject to version 2.00 of the Zend license , |
2007-11-03 03:40:39 +08:00
| that is bundled with this package in the file LICENSE , and is |
2003-06-11 04:04:29 +08:00
| available through the world - wide - web at the following url : |
2001-12-11 23:16:21 +08:00
| http : //www.zend.com/license/2_00.txt. |
1999-07-16 22:58:16 +08:00
| If you did not receive a copy of the Zend license and are unable to |
| obtain it through the world - wide - web , please send a note to |
| license @ zend . com so we can mail you a copy immediately . |
1999-04-08 02:10:10 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Authors : Andi Gutmans < andi @ zend . com > |
| Zeev Suraski < zeev @ zend . com > |
2001-07-10 02:51:29 +08:00
| Andrei Zmievski < andrei @ php . net > |
1999-04-08 02:10:10 +08:00
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
*/
2003-02-01 09:49:15 +08:00
/* $Id$ */
1999-07-16 22:58:16 +08:00
2000-07-03 07:54:19 +08:00
# ifndef ZEND_API_H
# define ZEND_API_H
1999-04-08 02:10:10 +08:00
2001-02-27 02:18:34 +08:00
# include "zend_modules.h"
1999-04-08 02:10:10 +08:00
# include "zend_list.h"
2000-03-26 03:10:07 +08:00
# include "zend_operators.h"
# include "zend_variables.h"
2000-06-14 01:58:33 +08:00
# include "zend_execute.h"
1999-04-08 02:10:10 +08:00
2002-05-20 15:17:30 +08:00
BEGIN_EXTERN_C ( )
2000-03-30 01:13:16 +08:00
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.
2003-08-04 01:40:44 +08:00
typedef struct _zend_function_entry {
2007-09-28 02:00:48 +08:00
const char * fname ;
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.
2003-08-04 01:40:44 +08:00
void ( * handler ) ( INTERNAL_FUNCTION_PARAMETERS ) ;
2007-09-28 02:00:48 +08:00
const struct _zend_arg_info * arg_info ;
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.
2003-08-04 01:40:44 +08:00
zend_uint num_args ;
zend_uint flags ;
} zend_function_entry ;
2008-05-12 15:11:55 +08:00
# define ZEND_NS_NAME(ns, name) ns"::"name
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.
2003-08-04 01:40:44 +08:00
# define ZEND_FN(name) zif_##name
2006-05-10 07:53:23 +08:00
# define ZEND_MN(name) zim_##name
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.
2003-08-04 01:40:44 +08:00
# define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
# define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
2006-05-10 07:53:23 +08:00
# define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))
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.
2003-08-04 01:40:44 +08:00
2003-08-24 19:09:45 +08:00
# define ZEND_FENTRY(zend_name, name, arg_info, flags) { #zend_name, name, arg_info, (zend_uint) (sizeof(arg_info) / sizeof(struct _zend_arg_info)-1), flags },
2006-12-20 18:34:36 +08:00
# define ZEND_RAW_FENTRY(zend_name, name, arg_info, flags) { zend_name, name, arg_info, (zend_uint) (sizeof(arg_info) / sizeof(struct _zend_arg_info)-1), flags },
# define ZEND_RAW_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0)
2003-08-24 19:09:45 +08:00
# define ZEND_NAMED_FE(zend_name, name, arg_info) ZEND_FENTRY(zend_name, name, arg_info, 0)
# define ZEND_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
2006-02-26 02:25:45 +08:00
# define ZEND_DEP_FE(name, arg_info) ZEND_FENTRY(name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
2003-08-25 00:35:58 +08:00
# define ZEND_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)
2006-02-26 02:25:45 +08:00
# define ZEND_DEP_FALIAS(name, alias, arg_info) ZEND_FENTRY(name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
2006-05-10 07:53:23 +08:00
# define ZEND_NAMED_ME(zend_name, name, arg_info, flags) ZEND_FENTRY(zend_name, name, arg_info, flags)
# define ZEND_ME(classname, name, arg_info, flags) ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags)
2003-08-24 19:09:45 +08:00
# define ZEND_ABSTRACT_ME(classname, name, arg_info) ZEND_FENTRY(name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
2004-04-12 21:02:54 +08:00
# define ZEND_MALIAS(classname, name, alias, arg_info, flags) \
2006-05-10 07:53:23 +08:00
ZEND_FENTRY ( name , ZEND_MN ( classname # # _ # # alias ) , arg_info , flags )
# define ZEND_ME_MAPPING(name, func_name, arg_types, flags) ZEND_NAMED_ME(name, ZEND_FN(func_name), arg_types, flags)
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.
2003-08-04 01:40:44 +08:00
2008-05-12 15:11:55 +08:00
# define ZEND_NS_FENTRY(ns, zend_name, name, arg_info, flags) ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, #zend_name), name, arg_info, flags)
# define ZEND_NS_RAW_FENTRY(ns, zend_name, name, arg_info, flags) ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, zend_name), name, arg_info, flags)
# define ZEND_NS_RAW_NAMED_FE(ns, zend_name, name, arg_info) ZEND_NS_RAW_FENTRY(ns, #zend_name, name, arg_info, 0)
# define ZEND_NS_NAMED_FE(ns, zend_name, name, arg_info)
# define ZEND_NS_FE(ns, name, arg_info) ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, 0)
# define ZEND_NS_DEP_FE(ns, name, arg_info) ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
# define ZEND_NS_FALIAS(ns, name, alias, arg_info) ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, 0)
# define ZEND_NS_DEP_FALIAS(ns, name, alias, arg_info) ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
2005-05-26 21:46:17 +08:00
# define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, 0, pass_by_ref, 0, 0 },
# define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, 0, pass_by_ref, 0, 0 },
# define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, 0, allow_null, pass_by_ref, 0, 0 },
# define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null) { #name, sizeof(#name)-1, NULL, 0, 1, allow_null, pass_by_ref, 0, 0 },
2004-02-25 22:56:45 +08:00
# define ZEND_BEGIN_ARG_INFO_EX(name, pass_rest_by_reference, return_reference, required_num_args) \
2007-09-28 02:00:48 +08:00
const zend_arg_info name [ ] = { \
2005-05-26 21:46:17 +08:00
{ NULL , 0 , NULL , 0 , 0 , 0 , pass_rest_by_reference , return_reference , required_num_args } ,
2004-02-12 21:49:55 +08:00
# define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
2005-06-16 22:56:13 +08:00
ZEND_BEGIN_ARG_INFO_EX ( name , pass_rest_by_reference , ZEND_RETURN_VALUE , - 1 )
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.
2003-08-04 01:40:44 +08:00
# define ZEND_END_ARG_INFO() };
1999-04-18 23:11:52 +08:00
2001-08-11 00:19:49 +08:00
/* Name macros */
# define ZEND_MODULE_STARTUP_N(module) zm_startup_##module
# define ZEND_MODULE_SHUTDOWN_N(module) zm_shutdown_##module
# define ZEND_MODULE_ACTIVATE_N(module) zm_activate_##module
# define ZEND_MODULE_DEACTIVATE_N(module) zm_deactivate_##module
2004-03-17 06:27:26 +08:00
# define ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module) zm_post_zend_deactivate_##module
2001-08-11 00:19:49 +08:00
# define ZEND_MODULE_INFO_N(module) zm_info_##module
2006-06-15 22:03:21 +08:00
# define ZEND_MODULE_GLOBALS_CTOR_N(module) zm_globals_ctor_##module
# define ZEND_MODULE_GLOBALS_DTOR_N(module) zm_globals_dtor_##module
1999-04-18 23:11:52 +08:00
2001-08-11 00:19:49 +08:00
/* Declaration macros */
# define ZEND_MODULE_STARTUP_D(module) int ZEND_MODULE_STARTUP_N(module)(INIT_FUNC_ARGS)
# define ZEND_MODULE_SHUTDOWN_D(module) int ZEND_MODULE_SHUTDOWN_N(module)(SHUTDOWN_FUNC_ARGS)
# define ZEND_MODULE_ACTIVATE_D(module) int ZEND_MODULE_ACTIVATE_N(module)(INIT_FUNC_ARGS)
# define ZEND_MODULE_DEACTIVATE_D(module) int ZEND_MODULE_DEACTIVATE_N(module)(SHUTDOWN_FUNC_ARGS)
2004-03-17 06:27:26 +08:00
# define ZEND_MODULE_POST_ZEND_DEACTIVATE_D(module) int ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module)(void)
2001-08-11 00:19:49 +08:00
# define ZEND_MODULE_INFO_D(module) void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)
2006-06-15 22:03:21 +08:00
# define ZEND_MODULE_GLOBALS_CTOR_D(module) void ZEND_MODULE_GLOBALS_CTOR_N(module)(zend_##module##_globals *module##_globals TSRMLS_DC)
# define ZEND_MODULE_GLOBALS_DTOR_D(module) void ZEND_MODULE_GLOBALS_DTOR_N(module)(zend_##module##_globals *module##_globals TSRMLS_DC)
1999-04-18 23:11:52 +08:00
2000-05-02 09:33:18 +08:00
# define ZEND_GET_MODULE(name) \
2003-05-20 21:21:26 +08:00
BEGIN_EXTERN_C ( ) \
ZEND_DLEXPORT zend_module_entry * get_module ( void ) { return & name # # _module_entry ; } \
END_EXTERN_C ( )
2000-04-01 22:15:20 +08:00
# define ZEND_BEGIN_MODULE_GLOBALS(module_name) \
typedef struct _zend_ # # module_name # # _globals {
# define ZEND_END_MODULE_GLOBALS(module_name) \
} zend_ # # module_name # # _globals ;
# ifdef ZTS
# define ZEND_DECLARE_MODULE_GLOBALS(module_name) \
2001-04-20 01:51:23 +08:00
ts_rsrc_id module_name # # _globals_id ;
# define ZEND_EXTERN_MODULE_GLOBALS(module_name) \
extern ts_rsrc_id module_name # # _globals_id ;
2000-04-01 22:15:20 +08:00
# define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \
2001-07-27 18:10:39 +08:00
ts_allocate_id ( & module_name # # _globals_id , sizeof ( zend_ # # module_name # # _globals ) , ( ts_allocate_ctor ) globals_ctor , ( ts_allocate_dtor ) globals_dtor ) ;
2000-04-01 22:15:20 +08:00
# else
# define ZEND_DECLARE_MODULE_GLOBALS(module_name) \
2001-04-20 01:51:23 +08:00
zend_ # # module_name # # _globals module_name # # _globals ;
# define ZEND_EXTERN_MODULE_GLOBALS(module_name) \
extern zend_ # # module_name # # _globals module_name # # _globals ;
2000-04-01 22:15:20 +08:00
# define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor) \
globals_ctor ( & module_name # # _globals ) ;
# endif
2007-11-03 03:40:39 +08:00
# define INIT_CLASS_ENTRY(class_container, class_name, functions) \
INIT_OVERLOADED_CLASS_ENTRY ( class_container , class_name , functions , NULL , NULL , NULL )
1999-05-28 20:06:59 +08:00
2007-11-03 03:40:39 +08:00
# define INIT_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions) \
INIT_OVERLOADED_CLASS_ENTRY_EX ( class_container , class_name , class_name_len , functions , NULL , NULL , NULL , NULL , NULL )
# define INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
1999-05-28 20:06:59 +08:00
{ \
2007-11-03 03:40:39 +08:00
int _len = class_name_len ; \
class_container . name = zend_strndup ( class_name , _len ) ; \
class_container . name_length = _len ; \
1999-05-28 20:06:59 +08:00
class_container . builtin_functions = functions ; \
2001-11-03 20:19:52 +08:00
class_container . constructor = NULL ; \
2001-12-27 22:35:09 +08:00
class_container . destructor = NULL ; \
2001-12-27 03:54:20 +08:00
class_container . clone = NULL ; \
2006-05-10 07:53:23 +08:00
class_container . serialize = NULL ; \
class_container . unserialize = NULL ; \
class_container . create_object = NULL ; \
2003-10-23 03:59:58 +08:00
class_container . interface_gets_implemented = NULL ; \
2007-09-29 17:34:24 +08:00
class_container . get_static_method = NULL ; \
2006-05-10 07:53:23 +08:00
class_container . __call = handle_fcall ; \
2007-11-03 03:40:39 +08:00
class_container . __callstatic = NULL ; \
2006-05-10 07:53:23 +08:00
class_container . __tostring = NULL ; \
class_container . __get = handle_propget ; \
class_container . __set = handle_propset ; \
class_container . __unset = handle_propunset ; \
class_container . __isset = handle_propisset ; \
class_container . serialize_func = NULL ; \
class_container . unserialize_func = NULL ; \
class_container . serialize = NULL ; \
class_container . unserialize = NULL ; \
class_container . parent = NULL ; \
class_container . num_interfaces = 0 ; \
class_container . interfaces = NULL ; \
class_container . get_iterator = NULL ; \
class_container . iterator_funcs . funcs = NULL ; \
class_container . module = NULL ; \
1999-05-28 20:06:59 +08:00
}
2005-07-08 00:07:09 +08:00
# define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
2007-11-03 03:40:39 +08:00
INIT_OVERLOADED_CLASS_ENTRY_EX ( class_container , class_name , sizeof ( class_name ) - 1 , functions , handle_fcall , handle_propget , handle_propset , NULL , NULL )
2005-07-08 00:07:09 +08:00
2008-05-12 15:11:55 +08:00
# define INIT_NS_CLASS_ENTRY(class_container, ns, class_name, functions) \
INIT_CLASS_ENTRY ( class_container , ZEND_NS_NAME ( ns , class_name ) , functions )
# define INIT_OVERLOADED_NS_CLASS_ENTRY_EX(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
INIT_OVERLOADED_CLASS_ENTRY_EX ( class_container , ZEND_NS_NAME ( ns , class_name ) , sizeof ( ZEND_NS_NAME ( ns , class_name ) ) - 1 , functions , handle_fcall , handle_propget , handle_propset , handle_propunset , handle_propisset )
# define INIT_OVERLOADED_NS_CLASS_ENTRY(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset) \
INIT_OVERLOADED_CLASS_ENTRY ( class_container , ZEND_NS_NAME ( ns , class_name ) , functions , handle_fcall , handle_propget , handle_propset )
2005-12-01 19:48:17 +08:00
# ifdef ZTS
2007-04-16 16:09:56 +08:00
# define CE_STATIC_MEMBERS(ce) (((ce)->type==ZEND_USER_CLASS)?(ce)->static_members:CG(static_members)[(zend_intptr_t)(ce)->static_members])
2005-12-01 19:48:17 +08:00
# else
# define CE_STATIC_MEMBERS(ce) ((ce)->static_members)
# endif
2007-11-03 03:40:39 +08:00
# define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0)
1999-04-08 02:10:10 +08:00
int zend_next_free_module ( void ) ;
2004-02-20 16:03:27 +08:00
BEGIN_EXTERN_C ( )
2000-02-19 21:11:39 +08:00
ZEND_API int zend_get_parameters ( int ht , int param_count , . . . ) ;
2001-07-30 10:07:52 +08:00
ZEND_API int _zend_get_parameters_array ( int ht , int param_count , zval * * argument_array TSRMLS_DC ) ;
2000-02-19 21:11:39 +08:00
ZEND_API int zend_get_parameters_ex ( int param_count , . . . ) ;
2001-07-30 10:07:52 +08:00
ZEND_API int _zend_get_parameters_array_ex ( int param_count , zval * * * argument_array TSRMLS_DC ) ;
2004-09-29 06:55:22 +08:00
/* internal function to efficiently copy parameters when executing __call() */
ZEND_API int zend_copy_parameters_array ( int param_count , zval * argument_array TSRMLS_DC ) ;
2001-07-30 10:07:52 +08:00
# define zend_get_parameters_array(ht, param_count, argument_array) \
_zend_get_parameters_array ( ht , param_count , argument_array TSRMLS_CC )
# define zend_get_parameters_array_ex(param_count, argument_array) \
_zend_get_parameters_array_ex ( param_count , argument_array TSRMLS_CC )
2008-03-11 06:02:41 +08:00
# define zend_parse_parameters_none() \
zend_parse_parameters ( ZEND_NUM_ARGS ( ) TSRMLS_CC , " " )
2001-07-10 02:51:29 +08:00
/* Parameter parsing API -- andrei */
# define ZEND_PARSE_PARAMS_QUIET 1<<1
2001-07-30 12:54:16 +08:00
ZEND_API int zend_parse_parameters ( int num_args TSRMLS_DC , char * type_spec , . . . ) ;
2001-07-30 13:05:26 +08:00
ZEND_API int zend_parse_parameters_ex ( int flags , int num_args TSRMLS_DC , char * type_spec , . . . ) ;
2002-01-03 22:19:13 +08:00
ZEND_API char * zend_zval_type_name ( zval * arg ) ;
2001-07-10 02:51:29 +08:00
2003-02-09 04:54:02 +08:00
ZEND_API int zend_parse_method_parameters ( int num_args TSRMLS_DC , zval * this_ptr , char * type_spec , . . . ) ;
2004-03-03 00:17:58 +08:00
ZEND_API int zend_parse_method_parameters_ex ( int flags , int num_args TSRMLS_DC , zval * this_ptr , char * type_spec , . . . ) ;
2003-02-03 07:30:14 +08:00
2001-07-30 13:34:21 +08:00
/* End of parameter parsing API -- andrei */
1999-04-15 03:53:33 +08:00
2007-09-28 02:00:48 +08:00
ZEND_API int zend_register_functions ( zend_class_entry * scope , const zend_function_entry * functions , HashTable * function_table , int type TSRMLS_DC ) ;
ZEND_API void zend_unregister_functions ( const zend_function_entry * functions , int count , HashTable * function_table TSRMLS_DC ) ;
2005-06-30 21:43:00 +08:00
ZEND_API int zend_startup_module ( zend_module_entry * module_entry ) ;
2005-07-19 00:20:08 +08:00
ZEND_API zend_module_entry * zend_register_internal_module ( zend_module_entry * module_entry TSRMLS_DC ) ;
ZEND_API zend_module_entry * zend_register_module_ex ( zend_module_entry * module TSRMLS_DC ) ;
2005-06-30 21:43:00 +08:00
ZEND_API int zend_startup_module_ex ( zend_module_entry * module TSRMLS_DC ) ;
2005-06-17 17:36:26 +08:00
ZEND_API int zend_startup_modules ( TSRMLS_D ) ;
2004-09-10 00:51:45 +08:00
ZEND_API void zend_check_magic_method_implementation ( zend_class_entry * ce , zend_function * fptr , int error_type TSRMLS_DC ) ;
2000-06-09 22:40:14 +08:00
2001-07-30 09:48:22 +08:00
ZEND_API zend_class_entry * zend_register_internal_class ( zend_class_entry * class_entry TSRMLS_DC ) ;
ZEND_API zend_class_entry * zend_register_internal_class_ex ( zend_class_entry * class_entry , zend_class_entry * parent_ce , char * parent_name TSRMLS_DC ) ;
2003-10-23 03:59:58 +08:00
ZEND_API zend_class_entry * zend_register_internal_interface ( zend_class_entry * orig_class_entry TSRMLS_DC ) ;
2003-10-15 14:24:17 +08:00
ZEND_API void zend_class_implements ( zend_class_entry * class_entry TSRMLS_DC , int num_interfaces , . . . ) ;
2000-06-09 22:40:14 +08:00
2008-05-12 15:11:55 +08:00
ZEND_API int zend_register_class_alias_ex ( char * name , int name_len , zend_class_entry * ce TSRMLS_DC ) ;
# define zend_register_class_alias(name, ce) \
zend_register_class_alias_ex ( name , sizeof ( name ) - 1 , ce TSRMLS_DC )
# define zend_register_ns_class_alias(ns, name, ce) \
zend_register_class_alias_ex ( ZEND_NS_NAME ( ns , name ) , sizeof ( ZEND_NS_NAME ( ns , name ) ) - 1 , ce TSRMLS_DC )
2001-07-31 12:53:54 +08:00
ZEND_API int zend_disable_function ( char * function_name , uint function_name_length TSRMLS_DC ) ;
2003-03-03 09:22:43 +08:00
ZEND_API int zend_disable_class ( char * class_name , uint class_name_length TSRMLS_DC ) ;
1999-04-08 02:10:10 +08:00
2001-07-30 15:43:02 +08:00
ZEND_API void zend_wrong_param_count ( TSRMLS_D ) ;
2005-04-27 23:45:36 +08:00
# define IS_CALLABLE_CHECK_SYNTAX_ONLY (1<<0)
# define IS_CALLABLE_CHECK_NO_ACCESS (1<<1)
2005-07-29 04:55:50 +08:00
# define IS_CALLABLE_CHECK_IS_STATIC (1<<2)
2005-04-27 23:45:36 +08:00
2005-12-17 06:15:41 +08:00
# define IS_CALLABLE_STRICT (IS_CALLABLE_CHECK_IS_STATIC)
2008-02-02 05:27:55 +08:00
ZEND_API zend_bool zend_is_callable_ex ( zval * callable , uint check_flags , char * * callable_name , int * callable_name_len , zend_class_entry * * ce_ptr , zend_function * * fptr_ptr , zval * * * zobj_ptr_ptr , char * * error TSRMLS_DC ) ;
2005-04-27 23:45:36 +08:00
ZEND_API zend_bool zend_is_callable ( zval * callable , uint check_flags , char * * callable_name ) ;
2003-10-26 06:58:06 +08:00
ZEND_API zend_bool zend_make_callable ( zval * callable , char * * callable_name TSRMLS_DC ) ;
2007-09-28 02:00:48 +08:00
ZEND_API const char * zend_get_module_version ( const char * module_name ) ;
2004-01-19 08:39:29 +08:00
ZEND_API int zend_get_module_started ( char * module_name ) ;
2003-09-04 02:01:22 +08:00
ZEND_API int zend_declare_property ( zend_class_entry * ce , char * name , int name_length , zval * property , int access_type TSRMLS_DC ) ;
2005-04-20 06:04:59 +08:00
ZEND_API int zend_declare_property_ex ( zend_class_entry * ce , char * name , int name_length , zval * property , int access_type , char * doc_comment , int doc_comment_len TSRMLS_DC ) ;
2003-09-04 02:01:22 +08:00
ZEND_API int zend_declare_property_null ( zend_class_entry * ce , char * name , int name_length , int access_type TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API int zend_declare_property_bool ( zend_class_entry * ce , char * name , int name_length , long value , int access_type TSRMLS_DC ) ;
2003-09-04 02:01:22 +08:00
ZEND_API int zend_declare_property_long ( zend_class_entry * ce , char * name , int name_length , long value , int access_type TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API int zend_declare_property_double ( zend_class_entry * ce , char * name , int name_length , double value , int access_type TSRMLS_DC ) ;
2003-09-04 02:01:22 +08:00
ZEND_API int zend_declare_property_string ( zend_class_entry * ce , char * name , int name_length , char * value , int access_type TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API int zend_declare_property_stringl ( zend_class_entry * ce , char * name , int name_length , char * value , int value_len , int access_type TSRMLS_DC ) ;
2003-07-08 00:22:56 +08:00
2005-09-01 18:05:32 +08:00
ZEND_API int zend_declare_class_constant ( zend_class_entry * ce , char * name , size_t name_length , zval * value TSRMLS_DC ) ;
2006-03-06 00:12:24 +08:00
ZEND_API int zend_declare_class_constant_null ( zend_class_entry * ce , char * name , size_t name_length TSRMLS_DC ) ;
2005-09-01 18:05:32 +08:00
ZEND_API int zend_declare_class_constant_long ( zend_class_entry * ce , char * name , size_t name_length , long value TSRMLS_DC ) ;
ZEND_API int zend_declare_class_constant_bool ( zend_class_entry * ce , char * name , size_t name_length , zend_bool value TSRMLS_DC ) ;
ZEND_API int zend_declare_class_constant_double ( zend_class_entry * ce , char * name , size_t name_length , double value TSRMLS_DC ) ;
ZEND_API int zend_declare_class_constant_stringl ( zend_class_entry * ce , char * name , size_t name_length , char * value , size_t value_length TSRMLS_DC ) ;
ZEND_API int zend_declare_class_constant_string ( zend_class_entry * ce , char * name , size_t name_length , char * value TSRMLS_DC ) ;
2005-01-22 20:23:01 +08:00
ZEND_API void zend_update_class_constants ( zend_class_entry * class_type TSRMLS_DC ) ;
2003-08-24 03:37:39 +08:00
ZEND_API void zend_update_property ( zend_class_entry * scope , zval * object , char * name , int name_length , zval * value TSRMLS_DC ) ;
ZEND_API void zend_update_property_null ( zend_class_entry * scope , zval * object , char * name , int name_length TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API void zend_update_property_bool ( zend_class_entry * scope , zval * object , char * name , int name_length , long value TSRMLS_DC ) ;
2003-08-24 03:37:39 +08:00
ZEND_API void zend_update_property_long ( zend_class_entry * scope , zval * object , char * name , int name_length , long value TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API void zend_update_property_double ( zend_class_entry * scope , zval * object , char * name , int name_length , double value TSRMLS_DC ) ;
2003-08-24 03:37:39 +08:00
ZEND_API void zend_update_property_string ( zend_class_entry * scope , zval * object , char * name , int name_length , char * value TSRMLS_DC ) ;
2005-02-05 04:24:21 +08:00
ZEND_API void zend_update_property_stringl ( zend_class_entry * scope , zval * object , char * name , int name_length , char * value , int value_length TSRMLS_DC ) ;
1999-04-08 02:10:10 +08:00
2005-09-01 18:05:32 +08:00
ZEND_API int zend_update_static_property ( zend_class_entry * scope , char * name , int name_length , zval * value TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_null ( zend_class_entry * scope , char * name , int name_length TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_bool ( zend_class_entry * scope , char * name , int name_length , long value TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_long ( zend_class_entry * scope , char * name , int name_length , long value TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_double ( zend_class_entry * scope , char * name , int name_length , double value TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_string ( zend_class_entry * scope , char * name , int name_length , char * value TSRMLS_DC ) ;
ZEND_API int zend_update_static_property_stringl ( zend_class_entry * scope , char * name , int name_length , char * value , int value_length TSRMLS_DC ) ;
2003-08-24 08:36:53 +08:00
ZEND_API zval * zend_read_property ( zend_class_entry * scope , zval * object , char * name , int name_length , zend_bool silent TSRMLS_DC ) ;
2005-09-01 18:05:32 +08:00
ZEND_API zval * zend_read_static_property ( zend_class_entry * scope , char * name , int name_length , zend_bool silent TSRMLS_DC ) ;
2003-03-26 15:44:11 +08:00
ZEND_API zend_class_entry * zend_get_class_entry ( zval * zobject TSRMLS_DC ) ;
2005-06-28 02:13:13 +08:00
ZEND_API int zend_get_object_classname ( zval * object , char * * class_name , zend_uint * class_name_len TSRMLS_DC ) ;
2006-05-25 18:01:06 +08:00
ZEND_API char * zend_get_type_by_const ( int type ) ;
2002-04-22 22:22:27 +08:00
1999-05-28 20:06:59 +08:00
# define getThis() (this_ptr)
2000-04-02 00:23:13 +08:00
# define WRONG_PARAM_COUNT ZEND_WRONG_PARAM_COUNT()
# define WRONG_PARAM_COUNT_WITH_RETVAL(ret) ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
1999-12-19 06:40:35 +08:00
# define ARG_COUNT(dummy) (ht)
# define ZEND_NUM_ARGS() (ht)
2001-07-30 15:43:02 +08:00
# define ZEND_WRONG_PARAM_COUNT() { zend_wrong_param_count(TSRMLS_C); return; }
# define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret) { zend_wrong_param_count(TSRMLS_C); return ret; }
1999-04-08 02:10:10 +08:00
2000-02-11 23:59:30 +08:00
# ifndef ZEND_WIN32
1999-04-08 02:10:10 +08:00
# define DLEXPORT
# endif
2008-05-27 18:29:33 +08:00
# define array_init(arg) _array_init((arg), 0 ZEND_FILE_LINE_CC)
# define array_init_size(arg, size) _array_init((arg), (size) ZEND_FILE_LINE_CC)
2001-08-05 09:37:10 +08:00
# define object_init(arg) _object_init((arg) ZEND_FILE_LINE_CC TSRMLS_CC)
# define object_init_ex(arg, ce) _object_init_ex((arg), (ce) ZEND_FILE_LINE_CC TSRMLS_CC)
2001-08-12 02:26:47 +08:00
# define object_and_properties_init(arg, ce, properties) _object_and_properties_init((arg), (ce), (properties) ZEND_FILE_LINE_CC TSRMLS_CC)
2008-05-27 18:29:33 +08:00
ZEND_API int _array_init ( zval * arg , uint size ZEND_FILE_LINE_DC ) ;
2001-08-05 09:37:10 +08:00
ZEND_API int _object_init ( zval * arg ZEND_FILE_LINE_DC TSRMLS_DC ) ;
ZEND_API int _object_init_ex ( zval * arg , zend_class_entry * ce ZEND_FILE_LINE_DC TSRMLS_DC ) ;
2001-08-12 02:26:47 +08:00
ZEND_API int _object_and_properties_init ( zval * arg , zend_class_entry * ce , HashTable * properties ZEND_FILE_LINE_DC TSRMLS_DC ) ;
1999-10-04 19:42:46 +08:00
2003-08-30 07:27:22 +08:00
ZEND_API void zend_merge_properties ( zval * obj , HashTable * properties , int destroy_ht TSRMLS_DC ) ;
1999-10-04 19:42:46 +08:00
/* no longer supported */
2007-09-28 02:00:48 +08:00
ZEND_API int add_assoc_function ( zval * arg , const char * key , void ( * function_ptr ) ( INTERNAL_FUNCTION_PARAMETERS ) ) ;
1999-10-04 19:42:46 +08:00
2007-09-28 02:00:48 +08:00
ZEND_API int add_assoc_long_ex ( zval * arg , const char * key , uint key_len , long n ) ;
ZEND_API int add_assoc_null_ex ( zval * arg , const char * key , uint key_len ) ;
ZEND_API int add_assoc_bool_ex ( zval * arg , const char * key , uint key_len , int b ) ;
ZEND_API int add_assoc_resource_ex ( zval * arg , const char * key , uint key_len , int r ) ;
ZEND_API int add_assoc_double_ex ( zval * arg , const char * key , uint key_len , double d ) ;
ZEND_API int add_assoc_string_ex ( zval * arg , const char * key , uint key_len , char * str , int duplicate ) ;
ZEND_API int add_assoc_stringl_ex ( zval * arg , const char * key , uint key_len , char * str , uint length , int duplicate ) ;
ZEND_API int add_assoc_zval_ex ( zval * arg , const char * key , uint key_len , zval * value ) ;
2001-01-21 03:16:38 +08:00
# define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key)+1, __n)
2001-02-01 05:53:30 +08:00
# define add_assoc_null(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key) + 1)
2001-01-21 03:16:38 +08:00
# define add_assoc_bool(__arg, __key, __b) add_assoc_bool_ex(__arg, __key, strlen(__key)+1, __b)
# define add_assoc_resource(__arg, __key, __r) add_assoc_resource_ex(__arg, __key, strlen(__key)+1, __r)
# define add_assoc_double(__arg, __key, __d) add_assoc_double_ex(__arg, __key, strlen(__key)+1, __d)
# define add_assoc_string(__arg, __key, __str, __duplicate) add_assoc_string_ex(__arg, __key, strlen(__key)+1, __str, __duplicate)
# define add_assoc_stringl(__arg, __key, __str, __length, __duplicate) add_assoc_stringl_ex(__arg, __key, strlen(__key)+1, __str, __length, __duplicate)
# define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key)+1, __value)
1999-10-04 19:42:46 +08:00
2001-02-01 05:53:30 +08:00
/* unset() functions are only suported for legacy modules and null() functions should be used */
# define add_assoc_unset(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key) + 1)
# define add_index_unset(__arg, __key) add_index_null(__arg, __key)
# define add_next_index_unset(__arg) add_next_index_null(__arg)
# define add_property_unset(__arg, __key) add_property_null(__arg, __key)
2005-10-28 22:46:30 +08:00
ZEND_API int add_index_long ( zval * arg , ulong idx , long n ) ;
ZEND_API int add_index_null ( zval * arg , ulong idx ) ;
ZEND_API int add_index_bool ( zval * arg , ulong idx , int b ) ;
ZEND_API int add_index_resource ( zval * arg , ulong idx , int r ) ;
ZEND_API int add_index_double ( zval * arg , ulong idx , double d ) ;
2007-09-28 02:00:48 +08:00
ZEND_API int add_index_string ( zval * arg , ulong idx , const char * str , int duplicate ) ;
ZEND_API int add_index_stringl ( zval * arg , ulong idx , const char * str , uint length , int duplicate ) ;
2005-10-28 22:46:30 +08:00
ZEND_API int add_index_zval ( zval * arg , ulong index , zval * value ) ;
1999-10-04 19:42:46 +08:00
1999-04-08 02:10:10 +08:00
ZEND_API int add_next_index_long ( zval * arg , long n ) ;
2001-02-01 05:53:30 +08:00
ZEND_API int add_next_index_null ( zval * arg ) ;
1999-10-04 19:42:46 +08:00
ZEND_API int add_next_index_bool ( zval * arg , int b ) ;
ZEND_API int add_next_index_resource ( zval * arg , int r ) ;
1999-04-08 02:10:10 +08:00
ZEND_API int add_next_index_double ( zval * arg , double d ) ;
2007-09-28 02:00:48 +08:00
ZEND_API int add_next_index_string ( zval * arg , const char * str , int duplicate ) ;
ZEND_API int add_next_index_stringl ( zval * arg , const char * str , uint length , int duplicate ) ;
2001-01-21 03:16:38 +08:00
ZEND_API int add_next_index_zval ( zval * arg , zval * value ) ;
2007-09-28 02:00:48 +08:00
ZEND_API int add_get_assoc_string_ex ( zval * arg , const char * key , uint key_len , const char * str , void * * dest , int duplicate ) ;
ZEND_API int add_get_assoc_stringl_ex ( zval * arg , const char * key , uint key_len , const char * str , uint length , void * * dest , int duplicate ) ;
2001-01-21 03:16:38 +08:00
# define add_get_assoc_string(__arg, __key, __str, __dest, __duplicate) add_get_assoc_string_ex(__arg, __key, strlen(__key)+1, __str, __dest, __duplicate)
# define add_get_assoc_stringl(__arg, __key, __str, __length, __dest, __duplicate) add_get_assoc_stringl_ex(__arg, __key, strlen(__key)+1, __str, __length, __dest, __duplicate)
1999-04-08 02:10:10 +08:00
2005-10-28 22:46:30 +08:00
ZEND_API int add_get_index_long ( zval * arg , ulong idx , long l , void * * dest ) ;
ZEND_API int add_get_index_double ( zval * arg , ulong idx , double d , void * * dest ) ;
2007-09-28 02:00:48 +08:00
ZEND_API int add_get_index_string ( zval * arg , ulong idx , const char * str , void * * dest , int duplicate ) ;
ZEND_API int add_get_index_stringl ( zval * arg , ulong idx , const char * str , uint length , void * * dest , int duplicate ) ;
1999-04-08 02:10:10 +08:00
2003-01-14 20:15:09 +08:00
ZEND_API int add_property_long_ex ( zval * arg , char * key , uint key_len , long l TSRMLS_DC ) ;
ZEND_API int add_property_null_ex ( zval * arg , char * key , uint key_len TSRMLS_DC ) ;
ZEND_API int add_property_bool_ex ( zval * arg , char * key , uint key_len , int b TSRMLS_DC ) ;
ZEND_API int add_property_resource_ex ( zval * arg , char * key , uint key_len , long r TSRMLS_DC ) ;
ZEND_API int add_property_double_ex ( zval * arg , char * key , uint key_len , double d TSRMLS_DC ) ;
ZEND_API int add_property_string_ex ( zval * arg , char * key , uint key_len , char * str , int duplicate TSRMLS_DC ) ;
ZEND_API int add_property_stringl_ex ( zval * arg , char * key , uint key_len , char * str , uint length , int duplicate TSRMLS_DC ) ;
ZEND_API int add_property_zval_ex ( zval * arg , char * key , uint key_len , zval * value TSRMLS_DC ) ;
# define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key)+1, __n TSRMLS_CC)
# define add_property_null(__arg, __key) add_property_null_ex(__arg, __key, strlen(__key) + 1 TSRMLS_CC)
# define add_property_bool(__arg, __key, __b) add_property_bool_ex(__arg, __key, strlen(__key)+1, __b TSRMLS_CC)
# define add_property_resource(__arg, __key, __r) add_property_resource_ex(__arg, __key, strlen(__key)+1, __r TSRMLS_CC)
2006-05-10 07:53:23 +08:00
# define add_property_double(__arg, __key, __d) add_property_double_ex(__arg, __key, strlen(__key)+1, __d TSRMLS_CC)
2003-01-14 20:15:09 +08:00
# define add_property_string(__arg, __key, __str, __duplicate) add_property_string_ex(__arg, __key, strlen(__key)+1, __str, __duplicate TSRMLS_CC)
# define add_property_stringl(__arg, __key, __str, __length, __duplicate) add_property_stringl_ex(__arg, __key, strlen(__key)+1, __str, __length, __duplicate TSRMLS_CC)
# define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key)+1, __value TSRMLS_CC)
2001-01-21 03:16:38 +08:00
2003-08-05 18:24:40 +08:00
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.
2003-08-04 01:40:44 +08:00
ZEND_API int call_user_function ( HashTable * function_table , zval * * object_pp , zval * function_name , zval * retval_ptr , zend_uint param_count , zval * params [ ] TSRMLS_DC ) ;
ZEND_API int call_user_function_ex ( HashTable * function_table , zval * * object_pp , zval * function_name , zval * * retval_ptr_ptr , zend_uint param_count , zval * * params [ ] , int no_separation , HashTable * symbol_table TSRMLS_DC ) ;
2004-02-20 16:03:27 +08:00
END_EXTERN_C ( )
2003-08-05 18:24:40 +08:00
typedef struct _zend_fcall_info {
size_t size ;
HashTable * function_table ;
zval * function_name ;
HashTable * symbol_table ;
zval * * retval_ptr_ptr ;
zend_uint param_count ;
zval * * * params ;
zval * * object_pp ;
zend_bool no_separation ;
} zend_fcall_info ;
typedef struct _zend_fcall_info_cache {
zend_bool initialized ;
zend_function * function_handler ;
zend_class_entry * calling_scope ;
zval * * object_pp ;
} zend_fcall_info_cache ;
2004-02-20 16:03:27 +08:00
BEGIN_EXTERN_C ( )
2007-11-03 03:40:39 +08:00
ZEND_API extern zend_fcall_info empty_fcall_info ;
2003-08-05 18:24:40 +08:00
ZEND_API extern zend_fcall_info_cache empty_fcall_info_cache ;
2006-06-07 17:43:54 +08:00
/** Build zend_call_info/cache from a zval*
*
* Caller is responsible to provide a return value , otherwise the we will crash .
* fci - > retval_ptr_ptr = NULL ;
* In order to pass parameters the following members need to be set :
* fci - > param_count = 0 ;
* fci - > params = NULL ;
2007-11-03 03:40:39 +08:00
* The callable_name argument may be NULL .
2008-02-02 05:27:55 +08:00
* Set check_flags to IS_CALLABLE_STRICT for every new usage !
2007-11-03 03:40:39 +08:00
*/
2008-02-02 05:27:55 +08:00
ZEND_API int zend_fcall_info_init ( zval * callable , uint check_flags , zend_fcall_info * fci , zend_fcall_info_cache * fcc , char * * callable_name , char * * error TSRMLS_DC ) ;
2007-11-03 03:40:39 +08:00
/** Clear argumens connected with zend_fcall_info *fci
* If free_mem is not zero then the params array gets free ' d as well
*/
ZEND_API void zend_fcall_info_args_clear ( zend_fcall_info * fci , int free_mem ) ;
/** Save current arguments from zend_fcall_info *fci
* params array will be set to NULL
*/
ZEND_API void zend_fcall_info_args_save ( zend_fcall_info * fci , int * param_count , zval * * * * params ) ;
/** Free arguments connected with zend_fcall_info *fci andset back saved ones.
2006-06-07 17:43:54 +08:00
*/
2007-11-03 03:40:39 +08:00
ZEND_API void zend_fcall_info_args_restore ( zend_fcall_info * fci , int param_count , zval * * * params ) ;
2006-06-07 17:43:54 +08:00
/** Set or clear the arguments in the zend_call_info struct taking care of
* refcount . If args is NULL and arguments are set then those are cleared .
*/
ZEND_API int zend_fcall_info_args ( zend_fcall_info * fci , zval * args TSRMLS_DC ) ;
2007-11-03 03:40:39 +08:00
/** Set arguments in the zend_fcall_info struct taking care of refcount.
* If argc is 0 the arguments which are set will be cleared , else pass
* a variable amount of zval * * arguments .
*/
ZEND_API int zend_fcall_info_argp ( zend_fcall_info * fci TSRMLS_DC , int argc , zval * * * argv ) ;
/** Set arguments in the zend_fcall_info struct taking care of refcount.
* If argc is 0 the arguments which are set will be cleared , else pass
* a variable amount of zval * * arguments .
*/
ZEND_API int zend_fcall_info_argv ( zend_fcall_info * fci TSRMLS_DC , int argc , va_list * argv ) ;
/** Set arguments in the zend_fcall_info struct taking care of refcount.
* If argc is 0 the arguments which are set will be cleared , else pass
* a variable amount of zval * * arguments .
*/
ZEND_API int zend_fcall_info_argn ( zend_fcall_info * fci TSRMLS_DC , int argc , . . . ) ;
2006-06-07 17:43:54 +08:00
/** Call a function using information created by zend_fcall_info_init()/args().
* If args is given then those replace the arguement info in fci is temporarily .
*/
ZEND_API int zend_fcall_info_call ( zend_fcall_info * fci , zend_fcall_info_cache * fcc , zval * * retval , zval * args TSRMLS_DC ) ;
2003-08-05 18:24:40 +08:00
ZEND_API int zend_call_function ( zend_fcall_info * fci , zend_fcall_info_cache * fci_cache TSRMLS_DC ) ;
2007-11-03 03:40:39 +08:00
ZEND_API int zend_set_hash_symbol ( zval * symbol , char * name , int name_length , zend_bool is_ref , int num_symbol_tables , . . . ) ;
1999-12-05 00:50:18 +08:00
2004-10-05 04:17:06 +08:00
ZEND_API int zend_delete_global_variable ( char * name , int name_len TSRMLS_DC ) ;
2004-10-05 03:54:35 +08:00
2005-07-04 18:01:10 +08:00
ZEND_API void zend_reset_all_cv ( HashTable * symbol_table TSRMLS_DC ) ;
2008-04-29 16:15:20 +08:00
ZEND_API void zend_rebuild_symbol_table ( TSRMLS_D ) ;
2001-08-11 23:56:40 +08:00
# define add_method(arg, key, method) add_assoc_function((arg), (key), (method))
1999-04-08 02:10:10 +08:00
2002-09-16 09:36:48 +08:00
ZEND_API ZEND_FUNCTION ( display_disabled_function ) ;
2003-03-03 09:22:43 +08:00
ZEND_API ZEND_FUNCTION ( display_disabled_class ) ;
2004-02-20 16:03:27 +08:00
END_EXTERN_C ( )
2002-09-16 09:36:48 +08:00
2001-07-10 16:20:20 +08:00
# if ZEND_DEBUG
# define CHECK_ZVAL_STRING(z) \
2007-11-03 03:40:39 +08:00
if ( Z_STRVAL_P ( z ) [ Z_STRLEN_P ( z ) ] ! = ' \0 ' ) { zend_error ( E_WARNING , " String is not zero-terminated (%s) " , Z_STRVAL_P ( z ) ) ; }
2001-07-16 23:48:31 +08:00
# define CHECK_ZVAL_STRING_REL(z) \
2007-11-03 03:40:39 +08:00
if ( Z_STRVAL_P ( z ) [ Z_STRLEN_P ( z ) ] ! = ' \0 ' ) { zend_error ( E_WARNING , " String is not zero-terminated (%s) (source: %s:%d) " , Z_STRVAL_P ( z ) ZEND_FILE_LINE_RELAY_CC ) ; }
2001-07-10 16:20:20 +08:00
# else
# define CHECK_ZVAL_STRING(z)
2001-07-16 23:48:31 +08:00
# define CHECK_ZVAL_STRING_REL(z)
2001-07-10 16:20:20 +08:00
# endif
2006-05-10 07:53:23 +08:00
# define ZVAL_RESOURCE(z, l) { \
Z_TYPE_P ( z ) = IS_RESOURCE ; \
Z_LVAL_P ( z ) = l ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2006-05-10 07:53:23 +08:00
# define ZVAL_BOOL(z, b) { \
Z_TYPE_P ( z ) = IS_BOOL ; \
Z_LVAL_P ( z ) = ( ( b ) ! = 0 ) ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2006-05-10 07:53:23 +08:00
# define ZVAL_NULL(z) { \
Z_TYPE_P ( z ) = IS_NULL ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2006-05-10 07:53:23 +08:00
# define ZVAL_LONG(z, l) { \
Z_TYPE_P ( z ) = IS_LONG ; \
Z_LVAL_P ( z ) = l ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2006-05-10 07:53:23 +08:00
# define ZVAL_DOUBLE(z, d) { \
Z_TYPE_P ( z ) = IS_DOUBLE ; \
Z_DVAL_P ( z ) = d ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_STRING(z, s, duplicate) { \
2007-11-03 03:40:39 +08:00
const char * __s = ( s ) ; \
Z_STRLEN_P ( z ) = strlen ( __s ) ; \
Z_STRVAL_P ( z ) = ( duplicate ? estrndup ( __s , Z_STRLEN_P ( z ) ) : ( char * ) __s ) ; \
Z_TYPE_P ( z ) = IS_STRING ; \
2000-01-04 21:56:17 +08:00
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_STRINGL(z, s, l, duplicate) { \
2007-11-03 03:40:39 +08:00
const char * __s = ( s ) ; int __l = l ; \
Z_STRLEN_P ( z ) = __l ; \
Z_STRVAL_P ( z ) = ( duplicate ? estrndup ( __s , __l ) : ( char * ) __s ) ; \
Z_TYPE_P ( z ) = IS_STRING ; \
2000-01-04 21:56:17 +08:00
}
2007-11-03 03:40:39 +08:00
# define ZVAL_EMPTY_STRING(z) { \
Z_STRLEN_P ( z ) = 0 ; \
Z_STRVAL_P ( z ) = STR_EMPTY_ALLOC ( ) ; \
Z_TYPE_P ( z ) = IS_STRING ; \
2000-01-04 21:56:17 +08:00
}
2008-01-25 02:07:45 +08:00
# define ZVAL_ZVAL(z, zv, copy, dtor) { \
zend_uchar is_ref = Z_ISREF_P ( z ) ; \
zend_uint refcount = Z_REFCOUNT_P ( z ) ; \
* ( z ) = * ( zv ) ; \
if ( copy ) { \
zval_copy_ctor ( z ) ; \
} \
if ( dtor ) { \
if ( ! copy ) { \
ZVAL_NULL ( zv ) ; \
} \
zval_ptr_dtor ( & zv ) ; \
} \
Z_SET_ISREF_TO_P ( z , is_ref ) ; \
Z_SET_REFCOUNT_P ( z , refcount ) ; \
2003-11-30 02:15:11 +08:00
}
2001-08-11 23:56:40 +08:00
# define ZVAL_FALSE(z) ZVAL_BOOL(z, 0)
# define ZVAL_TRUE(z) ZVAL_BOOL(z, 1)
2000-01-04 21:56:17 +08:00
2001-08-11 23:56:40 +08:00
# define RETVAL_RESOURCE(l) ZVAL_RESOURCE(return_value, l)
# define RETVAL_BOOL(b) ZVAL_BOOL(return_value, b)
2001-07-10 16:20:20 +08:00
# define RETVAL_NULL() ZVAL_NULL(return_value)
2001-08-11 23:56:40 +08:00
# define RETVAL_LONG(l) ZVAL_LONG(return_value, l)
# define RETVAL_DOUBLE(d) ZVAL_DOUBLE(return_value, d)
# define RETVAL_STRING(s, duplicate) ZVAL_STRING(return_value, s, duplicate)
# define RETVAL_STRINGL(s, l, duplicate) ZVAL_STRINGL(return_value, s, l, duplicate)
2001-07-10 16:20:20 +08:00
# define RETVAL_EMPTY_STRING() ZVAL_EMPTY_STRING(return_value)
2003-11-30 02:15:11 +08:00
# define RETVAL_ZVAL(zv, copy, dtor) ZVAL_ZVAL(return_value, zv, copy, dtor)
2001-08-11 23:56:40 +08:00
# define RETVAL_FALSE ZVAL_BOOL(return_value, 0)
# define RETVAL_TRUE ZVAL_BOOL(return_value, 1)
2001-07-10 16:20:20 +08:00
# define RETURN_RESOURCE(l) { RETVAL_RESOURCE(l); return; }
# define RETURN_BOOL(b) { RETVAL_BOOL(b); return; }
# define RETURN_NULL() { RETVAL_NULL(); return;}
# define RETURN_LONG(l) { RETVAL_LONG(l); return; }
# define RETURN_DOUBLE(d) { RETVAL_DOUBLE(d); return; }
2001-08-11 23:56:40 +08:00
# define RETURN_STRING(s, duplicate) { RETVAL_STRING(s, duplicate); return; }
# define RETURN_STRINGL(s, l, duplicate) { RETVAL_STRINGL(s, l, duplicate); return; }
2001-07-10 16:20:20 +08:00
# define RETURN_EMPTY_STRING() { RETVAL_EMPTY_STRING(); return; }
2003-11-30 02:15:11 +08:00
# define RETURN_ZVAL(zv, copy, dtor) { RETVAL_ZVAL(zv, copy, dtor); return; }
2001-07-10 16:20:20 +08:00
# define RETURN_FALSE { RETVAL_FALSE; return; }
# define RETURN_TRUE { RETVAL_TRUE; return; }
1999-05-27 09:44:17 +08:00
2001-08-11 23:56:40 +08:00
# define SET_VAR_STRING(n, v) { \
1999-07-30 10:49:12 +08:00
{ \
1999-12-27 05:21:33 +08:00
zval * var ; \
ALLOC_ZVAL ( var ) ; \
2001-08-11 23:56:40 +08:00
ZVAL_STRING ( var , v , 0 ) ; \
1999-08-07 00:54:32 +08:00
ZEND_SET_GLOBAL_VAR ( n , var ) ; \
1999-07-30 10:49:12 +08:00
} \
1999-05-27 09:44:17 +08:00
}
1999-07-30 10:49:12 +08:00
2001-08-11 23:56:40 +08:00
# define SET_VAR_STRINGL(n, v, l) { \
1999-07-30 10:49:12 +08:00
{ \
1999-12-27 05:21:33 +08:00
zval * var ; \
ALLOC_ZVAL ( var ) ; \
2001-08-11 23:56:40 +08:00
ZVAL_STRINGL ( var , v , l , 0 ) ; \
1999-07-30 10:49:12 +08:00
ZEND_SET_GLOBAL_VAR ( n , var ) ; \
} \
1999-05-27 09:44:17 +08:00
}
1999-07-30 10:49:12 +08:00
2001-08-11 23:56:40 +08:00
# define SET_VAR_LONG(n, v) { \
1999-07-30 10:49:12 +08:00
{ \
1999-12-27 05:21:33 +08:00
zval * var ; \
ALLOC_ZVAL ( var ) ; \
2001-08-11 23:56:40 +08:00
ZVAL_LONG ( var , v ) ; \
1999-07-30 10:49:12 +08:00
ZEND_SET_GLOBAL_VAR ( n , var ) ; \
} \
1999-05-27 09:44:17 +08:00
}
1999-07-30 10:49:12 +08:00
2001-08-11 23:56:40 +08:00
# define SET_VAR_DOUBLE(n, v) { \
1999-07-30 10:49:12 +08:00
{ \
1999-12-27 05:21:33 +08:00
zval * var ; \
ALLOC_ZVAL ( var ) ; \
2001-08-11 23:56:40 +08:00
ZVAL_DOUBLE ( var , v ) ; \
1999-07-30 10:49:12 +08:00
ZEND_SET_GLOBAL_VAR ( n , var ) ; \
} \
1999-05-27 09:44:17 +08:00
}
1999-12-03 15:54:17 +08:00
# define ZEND_SET_SYMBOL(symtable, name, var) \
{ \
char * _name = ( name ) ; \
\
1999-12-04 22:56:44 +08:00
ZEND_SET_SYMBOL_WITH_LENGTH ( symtable , _name , strlen ( _name ) + 1 , var , 1 , 0 ) ; \
1999-07-30 10:49:12 +08:00
}
1999-12-03 15:54:17 +08:00
# define ZEND_SET_SYMBOL_WITH_LENGTH(symtable, name, name_length, var, _refcount, _is_ref) \
1999-07-30 10:49:12 +08:00
{ \
zval * * orig_var ; \
\
1999-07-30 22:17:08 +08:00
if ( zend_hash_find ( symtable , ( name ) , ( name_length ) , ( void * * ) & orig_var ) = = SUCCESS \
1999-07-30 10:49:12 +08:00
& & PZVAL_IS_REF ( * orig_var ) ) { \
2007-11-03 03:40:39 +08:00
Z_SET_REFCOUNT_P ( var , Z_REFCOUNT_PP ( orig_var ) ) ; \
Z_SET_ISREF_P ( var ) ; \
1999-07-30 10:49:12 +08:00
\
1999-12-02 06:00:58 +08:00
if ( _refcount ) { \
2007-11-03 03:40:39 +08:00
Z_SET_REFCOUNT_P ( var , Z_REFCOUNT_P ( var ) + _refcount - 1 ) ; \
1999-12-02 06:00:58 +08:00
} \
1999-07-30 10:49:12 +08:00
zval_dtor ( * orig_var ) ; \
1999-12-02 05:47:47 +08:00
* * orig_var = * ( var ) ; \
2007-11-03 03:40:39 +08:00
FREE_ZVAL ( var ) ; \
1999-07-30 10:49:12 +08:00
} else { \
2007-11-03 03:40:39 +08:00
Z_SET_ISREF_TO_P ( var , _is_ref ) ; \
1999-12-02 05:47:47 +08:00
if ( _refcount ) { \
2007-11-03 03:40:39 +08:00
Z_SET_REFCOUNT_P ( var , _refcount ) ; \
1999-12-02 05:47:47 +08:00
} \
zend_hash_update ( symtable , ( name ) , ( name_length ) , & ( var ) , sizeof ( zval * ) , NULL ) ; \
1999-07-30 10:49:12 +08:00
} \
}
1999-07-30 22:17:08 +08:00
# define ZEND_SET_GLOBAL_VAR(name, var) \
ZEND_SET_SYMBOL ( & EG ( symbol_table ) , name , var )
2007-11-03 03:40:39 +08:00
# define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var, _refcount, _is_ref) \
1999-12-04 01:03:35 +08:00
ZEND_SET_SYMBOL_WITH_LENGTH ( & EG ( symbol_table ) , name , name_length , var , _refcount , _is_ref )
1999-12-04 00:59:04 +08:00
2007-11-03 03:40:39 +08:00
# define ZEND_DEFINE_PROPERTY(class_ptr, name, value, mask) \
2003-07-08 00:22:56 +08:00
{ \
char * _name = ( name ) ; \
int namelen = strlen ( _name ) ; \
2003-09-04 02:01:22 +08:00
zend_declare_property ( class_ptr , _name , namelen , value , mask TSRMLS_CC ) ; \
2003-07-07 03:55:20 +08:00
}
2006-05-10 07:53:23 +08:00
# define HASH_OF(p) (Z_TYPE_P(p)==IS_ARRAY ? Z_ARRVAL_P(p) : ((Z_TYPE_P(p)==IS_OBJECT ? Z_OBJ_HT_P(p)->get_properties((p) TSRMLS_CC) : NULL)))
# define ZVAL_IS_NULL(z) (Z_TYPE_P(z)==IS_NULL)
1999-09-21 00:56:09 +08:00
2001-08-11 00:19:49 +08:00
/* For compatibility */
# define ZEND_MINIT ZEND_MODULE_STARTUP_N
# define ZEND_MSHUTDOWN ZEND_MODULE_SHUTDOWN_N
# define ZEND_RINIT ZEND_MODULE_ACTIVATE_N
# define ZEND_RSHUTDOWN ZEND_MODULE_DEACTIVATE_N
# define ZEND_MINFO ZEND_MODULE_INFO_N
2006-06-15 22:03:21 +08:00
# define ZEND_GINIT(module) ((void (*)(void* TSRMLS_DC))(ZEND_MODULE_GLOBALS_CTOR_N(module)))
# define ZEND_GSHUTDOWN(module) ((void (*)(void* TSRMLS_DC))(ZEND_MODULE_GLOBALS_DTOR_N(module)))
2001-08-11 00:19:49 +08:00
# define ZEND_MINIT_FUNCTION ZEND_MODULE_STARTUP_D
2001-08-12 22:58:57 +08:00
# define ZEND_MSHUTDOWN_FUNCTION ZEND_MODULE_SHUTDOWN_D
# define ZEND_RINIT_FUNCTION ZEND_MODULE_ACTIVATE_D
# define ZEND_RSHUTDOWN_FUNCTION ZEND_MODULE_DEACTIVATE_D
# define ZEND_MINFO_FUNCTION ZEND_MODULE_INFO_D
2006-06-15 22:03:21 +08:00
# define ZEND_GINIT_FUNCTION ZEND_MODULE_GLOBALS_CTOR_D
# define ZEND_GSHUTDOWN_FUNCTION ZEND_MODULE_GLOBALS_DTOR_D
2001-08-11 00:19:49 +08:00
2002-05-20 15:17:30 +08:00
END_EXTERN_C ( )
2006-05-10 07:53:23 +08:00
2000-07-03 07:54:19 +08:00
# endif /* ZEND_API_H */
1999-04-08 02:10:10 +08:00
2001-08-11 00:19:49 +08:00
1999-04-08 02:10:10 +08:00
/*
* Local variables :
* tab - width : 4
* c - basic - offset : 4
2003-02-01 09:49:15 +08:00
* indent - tabs - mode : t
1999-04-08 02:10:10 +08:00
* End :
*/