1999-04-08 02:10:10 +08:00
/*
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
| Zend Engine |
+ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - +
2002-12-31 23:59:15 +08:00
| Copyright ( c ) 1998 - 2003 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 , |
1999-07-16 22:58:16 +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"
1999-12-28 03:07:33 +08:00
# include "zend_fast_cache.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 {
char * fname ;
void ( * handler ) ( INTERNAL_FUNCTION_PARAMETERS ) ;
struct _zend_arg_info * arg_info ;
zend_uint num_args ;
zend_uint flags ;
} zend_function_entry ;
# define ZEND_FN(name) zif_##name
# define ZEND_NAMED_FUNCTION(name) void name(INTERNAL_FUNCTION_PARAMETERS)
# define ZEND_FUNCTION(name) ZEND_NAMED_FUNCTION(ZEND_FN(name))
# define ZEND_METHOD(classname, name) ZEND_NAMED_FUNCTION(ZEND_FN(classname##_##name))
# define ZEND_NAMED_FE(zend_name, name, arg_info) { #zend_name, name, arg_info, sizeof(arg_info) / sizeof(struct _zend_arg_info)-1, 0 },
# define ZEND_FE(name, arg_info) ZEND_NAMED_FE(name, ZEND_FN(name), arg_info)
# define ZEND_FALIAS(name, alias, arg_info) ZEND_NAMED_FE(name, ZEND_FN(alias), arg_info)
# define ZEND_ME(classname, name, arg_info, flags) { #name, ZEND_FN(classname##_##name), arg_info, sizeof(arg_info) / sizeof(struct _zend_arg_info)-1, flags },
# define ZEND_ARG_INFO(pass_by_ref, name) { #name, sizeof(#name)-1, NULL, 0, 0, pass_by_ref },
# define ZEND_ARG_PASS_INFO(pass_by_ref) { NULL, 0, NULL, 0, 0, pass_by_ref },
# define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null) { #name, sizeof(#name)-1, #classname, sizeof(#classname)-1, allow_null, pass_by_ref },
# define ZEND_BEGIN_ARG_INFO(name, pass_rest_by_reference) \
zend_arg_info name [ ] = { \
ZEND_ARG_PASS_INFO ( pass_rest_by_reference )
# 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
2003-07-31 00:13:52 +08:00
# define ZEND_MODULE_EXEC_FINISHED_N(module) zm_exec_finished_##module
2001-08-11 00:19:49 +08:00
# define ZEND_MODULE_INFO_N(module) zm_info_##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)
2003-07-31 00:13:52 +08:00
# define ZEND_MODULE_EXEC_FINISHED_D(module) int ZEND_MODULE_EXEC_FINISHED_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)
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
2002-06-09 22:20:37 +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
# define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
{ \
class_container . name = strdup ( class_name ) ; \
2003-05-24 02:37:36 +08:00
class_container . name_length = sizeof ( class_name ) - 1 ; \
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 ; \
2002-02-07 22:08:43 +08:00
class_container . create_object = NULL ; \
2003-01-13 01:22:35 +08:00
class_container . __call = handle_fcall ; \
class_container . __get = handle_propget ; \
class_container . __set = handle_propset ; \
2003-04-04 20:25:47 +08:00
class_container . num_interfaces = 0 ; \
1999-05-28 20:06:59 +08:00
}
1999-04-08 02:10:10 +08:00
int zend_next_free_module ( void ) ;
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 ) ;
# 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 )
1999-04-15 03:53:33 +08:00
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 , . . . ) ;
2003-02-03 07:30:14 +08:00
ZEND_API int zend_parse_method_parameters_ex ( int flags , int num_args TSRMLS_DC , zval * this_ptr , char * type_spec , zend_class_entry * ce , void * * object , . . . ) ;
2001-07-30 13:34:21 +08:00
/* End of parameter parsing API -- andrei */
1999-04-15 03:53:33 +08:00
2002-11-24 04:44:12 +08:00
int zend_register_functions ( zend_class_entry * scope , zend_function_entry * functions , HashTable * function_table , int type TSRMLS_DC ) ;
2001-07-30 09:48:22 +08:00
void zend_unregister_functions ( zend_function_entry * functions , int count , HashTable * function_table TSRMLS_DC ) ;
1999-04-21 11:49:09 +08:00
ZEND_API int zend_register_module ( zend_module_entry * module_entry ) ;
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 ) ;
2000-06-09 22:40:14 +08:00
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 ) ;
2001-03-12 11:08:28 +08:00
ZEND_API zend_bool zend_is_callable ( zval * callable , zend_bool syntax_only , char * * callable_name ) ;
2001-10-13 02:40:30 +08:00
ZEND_API char * zend_get_module_version ( char * module_name ) ;
2003-07-08 00:22:56 +08:00
ZEND_API int zend_declare_property ( zend_class_entry * ce , char * name , int name_length , zval * property , int access_type ) ;
1999-04-08 02:10:10 +08:00
2003-03-26 15:44:11 +08:00
ZEND_API zend_class_entry * zend_get_class_entry ( zval * zobject TSRMLS_DC ) ;
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
2000-02-04 02:51:33 +08:00
ZEND_API int zend_startup_module ( zend_module_entry * module ) ;
1999-04-08 02:10:10 +08:00
2000-02-20 03:21:45 +08:00
# define array_init(arg) _array_init((arg) 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)
2000-02-20 03:21:45 +08:00
ZEND_API int _array_init ( zval * arg 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
/* no longer supported */
2001-08-11 23:56:40 +08:00
ZEND_API int add_assoc_function ( zval * arg , char * key , void ( * function_ptr ) ( INTERNAL_FUNCTION_PARAMETERS ) ) ;
1999-10-04 19:42:46 +08:00
2001-01-21 03:16:38 +08:00
ZEND_API int add_assoc_long_ex ( zval * arg , char * key , uint key_len , long n ) ;
2001-02-01 05:53:30 +08:00
ZEND_API int add_assoc_null_ex ( zval * arg , char * key , uint key_len ) ;
2001-01-21 03:16:38 +08:00
ZEND_API int add_assoc_bool_ex ( zval * arg , char * key , uint key_len , int b ) ;
ZEND_API int add_assoc_resource_ex ( zval * arg , char * key , uint key_len , int r ) ;
ZEND_API int add_assoc_double_ex ( zval * arg , char * key , uint key_len , double d ) ;
ZEND_API int add_assoc_string_ex ( zval * arg , char * key , uint key_len , char * str , int duplicate ) ;
ZEND_API int add_assoc_stringl_ex ( zval * arg , char * key , uint key_len , char * str , uint length , int duplicate ) ;
ZEND_API int add_assoc_zval_ex ( zval * arg , char * key , uint key_len , zval * value ) ;
# 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)
1999-04-08 02:10:10 +08:00
ZEND_API int add_index_long ( zval * arg , uint idx , long n ) ;
2001-02-01 05:53:30 +08:00
ZEND_API int add_index_null ( zval * arg , uint idx ) ;
1999-10-04 19:42:46 +08:00
ZEND_API int add_index_bool ( zval * arg , uint idx , int b ) ;
ZEND_API int add_index_resource ( zval * arg , uint idx , int r ) ;
1999-04-08 02:10:10 +08:00
ZEND_API int add_index_double ( zval * arg , uint idx , double d ) ;
ZEND_API int add_index_string ( zval * arg , uint idx , char * str , int duplicate ) ;
ZEND_API int add_index_stringl ( zval * arg , uint idx , char * str , uint length , int duplicate ) ;
2001-01-23 04:40:41 +08:00
ZEND_API int add_index_zval ( zval * arg , uint 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 ) ;
ZEND_API int add_next_index_string ( zval * arg , char * str , int duplicate ) ;
ZEND_API int add_next_index_stringl ( zval * arg , 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 ) ;
ZEND_API int add_get_assoc_string_ex ( zval * arg , char * key , uint key_len , char * str , void * * dest , int duplicate ) ;
ZEND_API int add_get_assoc_stringl_ex ( zval * arg , char * key , uint key_len , char * str , uint length , void * * dest , int duplicate ) ;
# 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
ZEND_API int add_get_index_long ( zval * arg , uint idx , long l , void * * dest ) ;
ZEND_API int add_get_index_double ( zval * arg , uint idx , double d , void * * dest ) ;
ZEND_API int add_get_index_string ( zval * arg , uint idx , char * str , void * * dest , int duplicate ) ;
ZEND_API int add_get_index_stringl ( zval * arg , uint idx , char * str , uint length , void * * dest , int duplicate ) ;
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)
# define add_property_double(__arg, __key, __d) add_property_double_ex(__arg, __key, strlen(__key)+1, __d TSRMLS_CC)
# 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
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 ) ;
ZEND_API int fast_call_user_function ( 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 , zend_function * * function_pointer TSRMLS_DC ) ;
1999-04-08 02:10:10 +08:00
1999-12-05 00:50:18 +08:00
ZEND_API int zend_set_hash_symbol ( zval * symbol , char * name , int name_length ,
2002-04-24 02:06:54 +08:00
zend_bool is_ref , int num_symbol_tables , . . . ) ;
1999-12-05 00:50:18 +08:00
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 ) ;
2002-09-16 09:36:48 +08:00
2001-07-10 16:20:20 +08:00
# if ZEND_DEBUG
# define CHECK_ZVAL_STRING(z) \
2003-01-09 23:32:22 +08:00
if ( ( z ) - > value . str . val [ ( z ) - > value . str . len ] ! = ' \0 ' ) { zend_error ( E_WARNING , " String is not zero-terminated (%s) " , ( z ) - > value . str . val ) ; }
2001-07-16 23:48:31 +08:00
# define CHECK_ZVAL_STRING_REL(z) \
2003-01-09 23:32:22 +08:00
if ( ( z ) - > value . str . val [ ( z ) - > value . str . len ] ! = ' \0 ' ) { zend_error ( E_WARNING , " String is not zero-terminated (%s) (source: %s:%d) " , ( z ) - > value . str . val 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
2001-08-11 23:56:40 +08:00
# define ZVAL_RESOURCE(z, l) { \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_RESOURCE ; \
( z ) - > value . lval = l ; \
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_BOOL(z, b) { \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_BOOL ; \
( z ) - > value . lval = b ; \
}
2001-07-10 16:20:20 +08:00
2000-01-04 21:56:17 +08:00
# define ZVAL_NULL(z) { \
( z ) - > type = IS_NULL ; \
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_LONG(z, l) { \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_LONG ; \
( z ) - > value . lval = l ; \
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_DOUBLE(z, d) { \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_DOUBLE ; \
( z ) - > value . dval = d ; \
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_STRING(z, s, duplicate) { \
2000-01-04 21:56:17 +08:00
char * __s = ( s ) ; \
( z ) - > value . str . len = strlen ( __s ) ; \
2001-08-11 23:56:40 +08:00
( z ) - > value . str . val = ( duplicate ? estrndup ( __s , ( z ) - > value . str . len ) : __s ) ; \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_STRING ; \
}
2001-07-10 16:20:20 +08:00
2001-08-11 23:56:40 +08:00
# define ZVAL_STRINGL(z, s, l, duplicate) { \
2000-01-04 21:56:17 +08:00
char * __s = ( s ) ; int __l = l ; \
( z ) - > value . str . len = __l ; \
2001-08-11 23:56:40 +08:00
( z ) - > value . str . val = ( duplicate ? estrndup ( __s , __l ) : __s ) ; \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_STRING ; \
}
# define ZVAL_EMPTY_STRING(z) { \
( z ) - > value . str . len = 0 ; \
2000-08-17 16:48:16 +08:00
( z ) - > value . str . val = empty_string ; \
2000-01-04 21:56:17 +08:00
( z ) - > type = IS_STRING ; \
}
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)
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; }
# 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 ) ) { \
1999-12-02 05:47:47 +08:00
( var ) - > refcount = ( * orig_var ) - > refcount ; \
1999-10-18 22:17:36 +08:00
( var ) - > is_ref = 1 ; \
1999-07-30 10:49:12 +08:00
\
1999-12-02 06:00:58 +08:00
if ( _refcount ) { \
( var ) - > refcount + = _refcount - 1 ; \
} \
1999-07-30 10:49:12 +08:00
zval_dtor ( * orig_var ) ; \
1999-12-02 05:47:47 +08:00
* * orig_var = * ( var ) ; \
1999-12-24 23:22:11 +08:00
FREE_ZVAL ( var ) ; \
1999-07-30 10:49:12 +08:00
} else { \
1999-12-03 04:38:41 +08:00
( var ) - > is_ref = _is_ref ; \
1999-12-02 05:47:47 +08:00
if ( _refcount ) { \
( var ) - > refcount = _refcount ; \
} \
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 )
1999-12-04 01:03:35 +08:00
# define ZEND_SET_GLOBAL_VAR_WITH_LENGTH(name, name_length, var, _refcount, _is_ref) \
ZEND_SET_SYMBOL_WITH_LENGTH ( & EG ( symbol_table ) , name , name_length , var , _refcount , _is_ref )
1999-12-04 00:59:04 +08:00
2003-07-21 14:05:58 +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-07-21 14:05:58 +08:00
zend_declare_property ( class_ptr , _name , namelen , value , mask ) ; \
2003-07-07 03:55:20 +08:00
}
2002-02-07 22:08:43 +08:00
# define HASH_OF(p) ((p)->type==IS_ARRAY ? (p)->value.ht : (((p)->type==IS_OBJECT ? Z_OBJ_HT_P(p)->get_properties((p) TSRMLS_CC) : NULL)))
2000-01-04 21:56:17 +08:00
# define ZVAL_IS_NULL(z) ((z)->type==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
# 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
2001-08-11 00:19:49 +08:00
2002-05-20 15:17:30 +08:00
END_EXTERN_C ( )
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 :
*/