root/Zend/zend_API.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. BEGIN_EXTERN_C
  2. Z_EXPECTED_TYPES
  3. zend_parse_arg_bool
  4. zend_parse_arg_long
  5. zend_parse_arg_double
  6. zend_parse_arg_str
  7. zend_parse_arg_string
  8. zend_parse_arg_path_str
  9. zend_parse_arg_path
  10. zend_parse_arg_array
  11. zend_parse_arg_array_ht
  12. zend_parse_arg_object
  13. zend_parse_arg_resource
  14. zend_parse_arg_func
  15. zend_parse_arg_zval
  16. zend_parse_arg_zval_deref

   1 /*
   2    +----------------------------------------------------------------------+
   3    | Zend Engine                                                          |
   4    +----------------------------------------------------------------------+
   5    | Copyright (c) 1998-2016 Zend Technologies Ltd. (http://www.zend.com) |
   6    +----------------------------------------------------------------------+
   7    | This source file is subject to version 2.00 of the Zend license,     |
   8    | that is bundled with this package in the file LICENSE, and is        |
   9    | available through the world-wide-web at the following url:           |
  10    | http://www.zend.com/license/2_00.txt.                                |
  11    | If you did not receive a copy of the Zend license and are unable to  |
  12    | obtain it through the world-wide-web, please send a note to          |
  13    | license@zend.com so we can mail you a copy immediately.              |
  14    +----------------------------------------------------------------------+
  15    | Authors: Andi Gutmans <andi@zend.com>                                |
  16    |          Zeev Suraski <zeev@zend.com>                                |
  17    |          Andrei Zmievski <andrei@php.net>                            |
  18    |          Dmitry Stogov <dmitry@zend.com>                             |
  19    +----------------------------------------------------------------------+
  20 */
  21 
  22 /* $Id$ */
  23 
  24 #ifndef ZEND_API_H
  25 #define ZEND_API_H
  26 
  27 #include "zend_modules.h"
  28 #include "zend_list.h"
  29 #include "zend_operators.h"
  30 #include "zend_variables.h"
  31 #include "zend_execute.h"
  32 
  33 
  34 BEGIN_EXTERN_C()
  35 
  36 typedef struct _zend_function_entry {
  37         const char *fname;
  38         void (*handler)(INTERNAL_FUNCTION_PARAMETERS);
  39         const struct _zend_internal_arg_info *arg_info;
  40         uint32_t num_args;
  41         uint32_t flags;
  42 } zend_function_entry;
  43 
  44 typedef struct _zend_fcall_info {
  45         size_t size;
  46         HashTable *function_table;
  47         zval function_name;
  48         zend_array *symbol_table;
  49         zval *retval;
  50         zval *params;
  51         zend_object *object;
  52         zend_bool no_separation;
  53         uint32_t param_count;
  54 } zend_fcall_info;
  55 
  56 typedef struct _zend_fcall_info_cache {
  57         zend_bool initialized;
  58         zend_function *function_handler;
  59         zend_class_entry *calling_scope;
  60         zend_class_entry *called_scope;
  61         zend_object *object;
  62 } zend_fcall_info_cache;
  63 
  64 #define ZEND_NS_NAME(ns, name)                  ns "\\" name
  65 
  66 #define ZEND_FN(name) zif_##name
  67 #define ZEND_MN(name) zim_##name
  68 #define ZEND_NAMED_FUNCTION(name)               void name(INTERNAL_FUNCTION_PARAMETERS)
  69 #define ZEND_FUNCTION(name)                             ZEND_NAMED_FUNCTION(ZEND_FN(name))
  70 #define ZEND_METHOD(classname, name)    ZEND_NAMED_FUNCTION(ZEND_MN(classname##_##name))
  71 
  72 #define ZEND_FENTRY(zend_name, name, arg_info, flags)   { #zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags },
  73 
  74 #define ZEND_RAW_FENTRY(zend_name, name, arg_info, flags)   { zend_name, name, arg_info, (uint32_t) (sizeof(arg_info)/sizeof(struct _zend_internal_arg_info)-1), flags },
  75 #define ZEND_RAW_NAMED_FE(zend_name, name, arg_info) ZEND_RAW_FENTRY(#zend_name, name, arg_info, 0)
  76 
  77 #define ZEND_NAMED_FE(zend_name, name, arg_info)        ZEND_FENTRY(zend_name, name, arg_info, 0)
  78 #define ZEND_FE(name, arg_info)                                         ZEND_FENTRY(name, ZEND_FN(name), arg_info, 0)
  79 #define ZEND_DEP_FE(name, arg_info)                 ZEND_FENTRY(name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
  80 #define ZEND_FALIAS(name, alias, arg_info)                      ZEND_FENTRY(name, ZEND_FN(alias), arg_info, 0)
  81 #define ZEND_DEP_FALIAS(name, alias, arg_info)          ZEND_FENTRY(name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
  82 #define ZEND_NAMED_ME(zend_name, name, arg_info, flags) ZEND_FENTRY(zend_name, name, arg_info, flags)
  83 #define ZEND_ME(classname, name, arg_info, flags)       ZEND_FENTRY(name, ZEND_MN(classname##_##name), arg_info, flags)
  84 #define ZEND_ABSTRACT_ME(classname, name, arg_info)     ZEND_FENTRY(name, NULL, arg_info, ZEND_ACC_PUBLIC|ZEND_ACC_ABSTRACT)
  85 #define ZEND_MALIAS(classname, name, alias, arg_info, flags) \
  86                                                     ZEND_FENTRY(name, ZEND_MN(classname##_##alias), arg_info, flags)
  87 #define ZEND_ME_MAPPING(name, func_name, arg_types, flags) ZEND_NAMED_ME(name, ZEND_FN(func_name), arg_types, flags)
  88 
  89 #define ZEND_NS_FENTRY(ns, zend_name, name, arg_info, flags)            ZEND_RAW_FENTRY(ZEND_NS_NAME(ns, #zend_name), name, arg_info, flags)
  90 
  91 #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)
  92 #define ZEND_NS_RAW_NAMED_FE(ns, zend_name, name, arg_info)                     ZEND_NS_RAW_FENTRY(ns, #zend_name, name, arg_info, 0)
  93 
  94 #define ZEND_NS_NAMED_FE(ns, zend_name, name, arg_info) ZEND_NS_FENTRY(ns, zend_name, name, arg_info, 0)
  95 #define ZEND_NS_FE(ns, name, arg_info)                                  ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, 0)
  96 #define ZEND_NS_DEP_FE(ns, name, arg_info)                              ZEND_NS_FENTRY(ns, name, ZEND_FN(name), arg_info, ZEND_ACC_DEPRECATED)
  97 #define ZEND_NS_FALIAS(ns, name, alias, arg_info)               ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, 0)
  98 #define ZEND_NS_DEP_FALIAS(ns, name, alias, arg_info)   ZEND_NS_FENTRY(ns, name, ZEND_FN(alias), arg_info, ZEND_ACC_DEPRECATED)
  99 
 100 #define ZEND_FE_END            { NULL, NULL, NULL, 0, 0 }
 101 
 102 #define ZEND_ARG_INFO(pass_by_ref, name)                             { #name, NULL, 0, pass_by_ref, 0, 0 },
 103 #define ZEND_ARG_PASS_INFO(pass_by_ref)                              { NULL,  NULL, 0, pass_by_ref, 0, 0 },
 104 #define ZEND_ARG_OBJ_INFO(pass_by_ref, name, classname, allow_null)  { #name, #classname, IS_OBJECT, pass_by_ref, allow_null, 0 },
 105 #define ZEND_ARG_ARRAY_INFO(pass_by_ref, name, allow_null)           { #name, NULL, IS_ARRAY, pass_by_ref, allow_null, 0 },
 106 #define ZEND_ARG_CALLABLE_INFO(pass_by_ref, name, allow_null)        { #name, NULL, IS_CALLABLE, pass_by_ref, allow_null, 0 },
 107 #define ZEND_ARG_TYPE_INFO(pass_by_ref, name, type_hint, allow_null) { #name, NULL, type_hint, pass_by_ref, allow_null, 0 },
 108 #define ZEND_ARG_VARIADIC_INFO(pass_by_ref, name)                    { #name, NULL, 0, pass_by_ref, 0, 1 },
 109 
 110 
 111 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, return_reference, required_num_args, type, class_name, allow_null) \
 112         static const zend_internal_arg_info name[] = { \
 113                 { (const char*)(zend_uintptr_t)(required_num_args), class_name, type, return_reference, allow_null, 0 },
 114 #define ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO(name, type, class_name, allow_null) \
 115         ZEND_BEGIN_ARG_WITH_RETURN_TYPE_INFO_EX(name, 0, -1, type, class_name, allow_null)
 116 
 117 #define ZEND_BEGIN_ARG_INFO_EX(name, _unused, return_reference, required_num_args)      \
 118         static const zend_internal_arg_info name[] = { \
 119                 { (const char*)(zend_uintptr_t)(required_num_args), NULL, 0, return_reference, 0, 0 },
 120 #define ZEND_BEGIN_ARG_INFO(name, _unused)      \
 121         ZEND_BEGIN_ARG_INFO_EX(name, 0, ZEND_RETURN_VALUE, -1)
 122 #define ZEND_END_ARG_INFO()             };
 123 
 124 /* Name macros */
 125 #define ZEND_MODULE_STARTUP_N(module)       zm_startup_##module
 126 #define ZEND_MODULE_SHUTDOWN_N(module)          zm_shutdown_##module
 127 #define ZEND_MODULE_ACTIVATE_N(module)          zm_activate_##module
 128 #define ZEND_MODULE_DEACTIVATE_N(module)        zm_deactivate_##module
 129 #define ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module)      zm_post_zend_deactivate_##module
 130 #define ZEND_MODULE_INFO_N(module)                      zm_info_##module
 131 #define ZEND_MODULE_GLOBALS_CTOR_N(module)  zm_globals_ctor_##module
 132 #define ZEND_MODULE_GLOBALS_DTOR_N(module)  zm_globals_dtor_##module
 133 
 134 /* Declaration macros */
 135 #define ZEND_MODULE_STARTUP_D(module)           int ZEND_MODULE_STARTUP_N(module)(INIT_FUNC_ARGS)
 136 #define ZEND_MODULE_SHUTDOWN_D(module)          int ZEND_MODULE_SHUTDOWN_N(module)(SHUTDOWN_FUNC_ARGS)
 137 #define ZEND_MODULE_ACTIVATE_D(module)          int ZEND_MODULE_ACTIVATE_N(module)(INIT_FUNC_ARGS)
 138 #define ZEND_MODULE_DEACTIVATE_D(module)        int ZEND_MODULE_DEACTIVATE_N(module)(SHUTDOWN_FUNC_ARGS)
 139 #define ZEND_MODULE_POST_ZEND_DEACTIVATE_D(module)      int ZEND_MODULE_POST_ZEND_DEACTIVATE_N(module)(void)
 140 #define ZEND_MODULE_INFO_D(module)                      void ZEND_MODULE_INFO_N(module)(ZEND_MODULE_INFO_FUNC_ARGS)
 141 #define ZEND_MODULE_GLOBALS_CTOR_D(module)  void ZEND_MODULE_GLOBALS_CTOR_N(module)(zend_##module##_globals *module##_globals)
 142 #define ZEND_MODULE_GLOBALS_DTOR_D(module)  void ZEND_MODULE_GLOBALS_DTOR_N(module)(zend_##module##_globals *module##_globals)
 143 
 144 #define ZEND_GET_MODULE(name) \
 145     BEGIN_EXTERN_C()\
 146         ZEND_DLEXPORT zend_module_entry *get_module(void) { return &name##_module_entry; }\
 147     END_EXTERN_C()
 148 
 149 #define ZEND_BEGIN_MODULE_GLOBALS(module_name)          \
 150         typedef struct _zend_##module_name##_globals {
 151 #define ZEND_END_MODULE_GLOBALS(module_name)            \
 152         } zend_##module_name##_globals;
 153 
 154 #ifdef ZTS
 155 
 156 #define ZEND_DECLARE_MODULE_GLOBALS(module_name)                                                        \
 157         ts_rsrc_id module_name##_globals_id;
 158 #define ZEND_EXTERN_MODULE_GLOBALS(module_name)                                                         \
 159         extern ts_rsrc_id module_name##_globals_id;
 160 #define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor)       \
 161         ts_allocate_id(&module_name##_globals_id, sizeof(zend_##module_name##_globals), (ts_allocate_ctor) globals_ctor, (ts_allocate_dtor) globals_dtor);
 162 #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) ZEND_TSRMG(module_name##_globals_id, zend_##module_name##_globals *, v)
 163 #define ZEND_MODULE_GLOBALS_BULK(module_name) TSRMG_BULK(module_name##_globals_id, zend_##module_name##_globals *)
 164 
 165 #else
 166 
 167 #define ZEND_DECLARE_MODULE_GLOBALS(module_name)                                                        \
 168         zend_##module_name##_globals module_name##_globals;
 169 #define ZEND_EXTERN_MODULE_GLOBALS(module_name)                                                         \
 170         extern zend_##module_name##_globals module_name##_globals;
 171 #define ZEND_INIT_MODULE_GLOBALS(module_name, globals_ctor, globals_dtor)       \
 172         globals_ctor(&module_name##_globals);
 173 #define ZEND_MODULE_GLOBALS_ACCESSOR(module_name, v) (module_name##_globals.v)
 174 #define ZEND_MODULE_GLOBALS_BULK(module_name) (&module_name##_globals)
 175 
 176 #endif
 177 
 178 #define INIT_CLASS_ENTRY(class_container, class_name, functions) \
 179         INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, NULL, NULL, NULL)
 180 
 181 #define INIT_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions) \
 182         INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, NULL, NULL, NULL, NULL, NULL)
 183 
 184 #define INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, class_name_len, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
 185         {                                                                                                                       \
 186                 zend_string *cl_name;                                                                   \
 187                 cl_name = zend_string_init(class_name, class_name_len, 1);              \
 188                 class_container.name = zend_new_interned_string(cl_name);       \
 189                 INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
 190         }
 191 
 192 #define INIT_CLASS_ENTRY_INIT_METHODS(class_container, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
 193         {                                                                                                                       \
 194                 class_container.constructor = NULL;                                             \
 195                 class_container.destructor = NULL;                                              \
 196                 class_container.clone = NULL;                                                   \
 197                 class_container.serialize = NULL;                                               \
 198                 class_container.unserialize = NULL;                                             \
 199                 class_container.create_object = NULL;                                   \
 200                 class_container.interface_gets_implemented = NULL;              \
 201                 class_container.get_static_method = NULL;                               \
 202                 class_container.__call = handle_fcall;                                  \
 203                 class_container.__callstatic = NULL;                                    \
 204                 class_container.__tostring = NULL;                                              \
 205                 class_container.__get = handle_propget;                                 \
 206                 class_container.__set = handle_propset;                                 \
 207                 class_container.__unset = handle_propunset;                             \
 208                 class_container.__isset = handle_propisset;                             \
 209                 class_container.__debugInfo = NULL;                                     \
 210                 class_container.serialize_func = NULL;                                  \
 211                 class_container.unserialize_func = NULL;                                \
 212                 class_container.serialize = NULL;                                               \
 213                 class_container.unserialize = NULL;                                             \
 214                 class_container.parent = NULL;                                                  \
 215                 class_container.num_interfaces = 0;                                             \
 216                 class_container.traits = NULL;                                                  \
 217                 class_container.num_traits = 0;                                                 \
 218                 class_container.trait_aliases = NULL;                                   \
 219                 class_container.trait_precedences = NULL;                               \
 220                 class_container.interfaces = NULL;                                              \
 221                 class_container.get_iterator = NULL;                                    \
 222                 class_container.iterator_funcs.funcs = NULL;                    \
 223                 class_container.info.internal.module = NULL;                    \
 224                 class_container.info.internal.builtin_functions = functions;    \
 225         }
 226 
 227 #define INIT_OVERLOADED_CLASS_ENTRY(class_container, class_name, functions, handle_fcall, handle_propget, handle_propset) \
 228         INIT_OVERLOADED_CLASS_ENTRY_EX(class_container, class_name, sizeof(class_name)-1, functions, handle_fcall, handle_propget, handle_propset, NULL, NULL)
 229 
 230 #define INIT_NS_CLASS_ENTRY(class_container, ns, class_name, functions) \
 231         INIT_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions)
 232 #define INIT_OVERLOADED_NS_CLASS_ENTRY_EX(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset, handle_propunset, handle_propisset) \
 233         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)
 234 #define INIT_OVERLOADED_NS_CLASS_ENTRY(class_container, ns, class_name, functions, handle_fcall, handle_propget, handle_propset) \
 235         INIT_OVERLOADED_CLASS_ENTRY(class_container, ZEND_NS_NAME(ns, class_name), functions, handle_fcall, handle_propget, handle_propset)
 236 
 237 #ifdef ZTS
 238 #       define CE_STATIC_MEMBERS(ce) (((ce)->type==ZEND_USER_CLASS)?(ce)->static_members_table:CG(static_members_table)[(zend_intptr_t)(ce)->static_members_table])
 239 #else
 240 #       define CE_STATIC_MEMBERS(ce) ((ce)->static_members_table)
 241 #endif
 242 
 243 #define ZEND_FCI_INITIALIZED(fci) ((fci).size != 0)
 244 
 245 ZEND_API int zend_next_free_module(void);
 246 
 247 BEGIN_EXTERN_C()
 248 ZEND_API int zend_get_parameters(int ht, int param_count, ...);
 249 ZEND_API ZEND_ATTRIBUTE_DEPRECATED int zend_get_parameters_ex(int param_count, ...);
 250 ZEND_API int _zend_get_parameters_array_ex(int param_count, zval *argument_array);
 251 
 252 /* internal function to efficiently copy parameters when executing __call() */
 253 ZEND_API int zend_copy_parameters_array(int param_count, zval *argument_array);
 254 
 255 #define zend_get_parameters_array(ht, param_count, argument_array) \
 256         _zend_get_parameters_array_ex(param_count, argument_array)
 257 #define zend_get_parameters_array_ex(param_count, argument_array) \
 258         _zend_get_parameters_array_ex(param_count, argument_array)
 259 #define zend_parse_parameters_none() \
 260         (EXPECTED(ZEND_NUM_ARGS() == 0) ? SUCCESS : zend_parse_parameters(ZEND_NUM_ARGS(), ""))
 261 
 262 /* Parameter parsing API -- andrei */
 263 
 264 #define ZEND_PARSE_PARAMS_QUIET (1<<1)
 265 #define ZEND_PARSE_PARAMS_THROW (1<<2)
 266 ZEND_API int zend_parse_parameters(int num_args, const char *type_spec, ...);
 267 ZEND_API int zend_parse_parameters_ex(int flags, int num_args, const char *type_spec, ...);
 268 ZEND_API int zend_parse_parameters_throw(int num_args, const char *type_spec, ...);
 269 ZEND_API char *zend_zval_type_name(const zval *arg);
 270 
 271 ZEND_API int zend_parse_method_parameters(int num_args, zval *this_ptr, const char *type_spec, ...);
 272 ZEND_API int zend_parse_method_parameters_ex(int flags, int num_args, zval *this_ptr, const char *type_spec, ...);
 273 
 274 ZEND_API int zend_parse_parameter(int flags, int arg_num, zval *arg, const char *spec, ...);
 275 
 276 /* End of parameter parsing API -- andrei */
 277 
 278 ZEND_API int zend_register_functions(zend_class_entry *scope, const zend_function_entry *functions, HashTable *function_table, int type);
 279 ZEND_API void zend_unregister_functions(const zend_function_entry *functions, int count, HashTable *function_table);
 280 ZEND_API int zend_startup_module(zend_module_entry *module_entry);
 281 ZEND_API zend_module_entry* zend_register_internal_module(zend_module_entry *module_entry);
 282 ZEND_API zend_module_entry* zend_register_module_ex(zend_module_entry *module);
 283 ZEND_API int zend_startup_module_ex(zend_module_entry *module);
 284 ZEND_API int zend_startup_modules(void);
 285 ZEND_API void zend_collect_module_handlers(void);
 286 ZEND_API void zend_destroy_modules(void);
 287 ZEND_API void zend_check_magic_method_implementation(const zend_class_entry *ce, const zend_function *fptr, int error_type);
 288 
 289 ZEND_API zend_class_entry *zend_register_internal_class(zend_class_entry *class_entry);
 290 ZEND_API zend_class_entry *zend_register_internal_class_ex(zend_class_entry *class_entry, zend_class_entry *parent_ce);
 291 ZEND_API zend_class_entry *zend_register_internal_interface(zend_class_entry *orig_class_entry);
 292 ZEND_API void zend_class_implements(zend_class_entry *class_entry, int num_interfaces, ...);
 293 
 294 ZEND_API int zend_register_class_alias_ex(const char *name, size_t name_len, zend_class_entry *ce);
 295 
 296 #define zend_register_class_alias(name, ce) \
 297         zend_register_class_alias_ex(name, sizeof(name)-1, ce)
 298 #define zend_register_ns_class_alias(ns, name, ce) \
 299         zend_register_class_alias_ex(ZEND_NS_NAME(ns, name), sizeof(ZEND_NS_NAME(ns, name))-1, ce)
 300 
 301 ZEND_API int zend_disable_function(char *function_name, size_t function_name_length);
 302 ZEND_API int zend_disable_class(char *class_name, size_t class_name_length);
 303 
 304 ZEND_API ZEND_COLD void zend_wrong_param_count(void);
 305 
 306 #define IS_CALLABLE_CHECK_SYNTAX_ONLY (1<<0)
 307 #define IS_CALLABLE_CHECK_NO_ACCESS   (1<<1)
 308 #define IS_CALLABLE_CHECK_IS_STATIC   (1<<2)
 309 #define IS_CALLABLE_CHECK_SILENT      (1<<3)
 310 
 311 #define IS_CALLABLE_STRICT  (IS_CALLABLE_CHECK_IS_STATIC)
 312 
 313 ZEND_API zend_bool zend_is_callable_ex(zval *callable, zend_object *object, uint check_flags, zend_string **callable_name, zend_fcall_info_cache *fcc, char **error);
 314 ZEND_API zend_bool zend_is_callable(zval *callable, uint check_flags, zend_string **callable_name);
 315 ZEND_API zend_bool zend_make_callable(zval *callable, zend_string **callable_name);
 316 ZEND_API const char *zend_get_module_version(const char *module_name);
 317 ZEND_API int zend_get_module_started(const char *module_name);
 318 ZEND_API int zend_declare_property_ex(zend_class_entry *ce, zend_string *name, zval *property, int access_type, zend_string *doc_comment);
 319 ZEND_API int zend_declare_property(zend_class_entry *ce, const char *name, size_t name_length, zval *property, int access_type);
 320 ZEND_API int zend_declare_property_null(zend_class_entry *ce, const char *name, size_t name_length, int access_type);
 321 ZEND_API int zend_declare_property_bool(zend_class_entry *ce, const char *name, size_t name_length, zend_long value, int access_type);
 322 ZEND_API int zend_declare_property_long(zend_class_entry *ce, const char *name, size_t name_length, zend_long value, int access_type);
 323 ZEND_API int zend_declare_property_double(zend_class_entry *ce, const char *name, size_t name_length, double value, int access_type);
 324 ZEND_API int zend_declare_property_string(zend_class_entry *ce, const char *name, size_t name_length, const char *value, int access_type);
 325 ZEND_API int zend_declare_property_stringl(zend_class_entry *ce, const char *name, size_t name_length, const char *value, size_t value_len, int access_type);
 326 
 327 ZEND_API int zend_declare_class_constant(zend_class_entry *ce, const char *name, size_t name_length, zval *value);
 328 ZEND_API int zend_declare_class_constant_null(zend_class_entry *ce, const char *name, size_t name_length);
 329 ZEND_API int zend_declare_class_constant_long(zend_class_entry *ce, const char *name, size_t name_length, zend_long value);
 330 ZEND_API int zend_declare_class_constant_bool(zend_class_entry *ce, const char *name, size_t name_length, zend_bool value);
 331 ZEND_API int zend_declare_class_constant_double(zend_class_entry *ce, const char *name, size_t name_length, double value);
 332 ZEND_API int zend_declare_class_constant_stringl(zend_class_entry *ce, const char *name, size_t name_length, const char *value, size_t value_length);
 333 ZEND_API int zend_declare_class_constant_string(zend_class_entry *ce, const char *name, size_t name_length, const char *value);
 334 
 335 ZEND_API int zend_update_class_constants(zend_class_entry *class_type);
 336 
 337 ZEND_API void zend_update_property_ex(zend_class_entry *scope, zval *object, zend_string *name, zval *value);
 338 ZEND_API void zend_update_property(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zval *value);
 339 ZEND_API void zend_update_property_null(zend_class_entry *scope, zval *object, const char *name, size_t name_length);
 340 ZEND_API void zend_update_property_bool(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_long value);
 341 ZEND_API void zend_update_property_long(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_long value);
 342 ZEND_API void zend_update_property_double(zend_class_entry *scope, zval *object, const char *name, size_t name_length, double value);
 343 ZEND_API void zend_update_property_str(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_string *value);
 344 ZEND_API void zend_update_property_string(zend_class_entry *scope, zval *object, const char *name, size_t name_length, const char *value);
 345 ZEND_API void zend_update_property_stringl(zend_class_entry *scope, zval *object, const char *name, size_t name_length, const char *value, size_t value_length);
 346 
 347 ZEND_API int zend_update_static_property(zend_class_entry *scope, const char *name, size_t name_length, zval *value);
 348 ZEND_API int zend_update_static_property_null(zend_class_entry *scope, const char *name, size_t name_length);
 349 ZEND_API int zend_update_static_property_bool(zend_class_entry *scope, const char *name, size_t name_length, zend_long value);
 350 ZEND_API int zend_update_static_property_long(zend_class_entry *scope, const char *name, size_t name_length, zend_long value);
 351 ZEND_API int zend_update_static_property_double(zend_class_entry *scope, const char *name, size_t name_length, double value);
 352 ZEND_API int zend_update_static_property_string(zend_class_entry *scope, const char *name, size_t name_length, const char *value);
 353 ZEND_API int zend_update_static_property_stringl(zend_class_entry *scope, const char *name, size_t name_length, const char *value, size_t value_length);
 354 
 355 ZEND_API zval *zend_read_property(zend_class_entry *scope, zval *object, const char *name, size_t name_length, zend_bool silent, zval *rv);
 356 
 357 ZEND_API zval *zend_read_static_property(zend_class_entry *scope, const char *name, size_t name_length, zend_bool silent);
 358 
 359 ZEND_API char *zend_get_type_by_const(int type);
 360 
 361 #define getThis()                                                       (Z_OBJ(EX(This)) ? &EX(This) : NULL)
 362 #define ZEND_IS_METHOD_CALL()                           (EX(func)->common.scope != NULL)
 363 
 364 #define WRONG_PARAM_COUNT                                       ZEND_WRONG_PARAM_COUNT()
 365 #define WRONG_PARAM_COUNT_WITH_RETVAL(ret)      ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)
 366 #define ARG_COUNT(dummy)                                        EX_NUM_ARGS()
 367 #define ZEND_NUM_ARGS()                                         EX_NUM_ARGS()
 368 #define ZEND_WRONG_PARAM_COUNT()                                        { zend_wrong_param_count(); return; }
 369 #define ZEND_WRONG_PARAM_COUNT_WITH_RETVAL(ret)         { zend_wrong_param_count(); return ret; }
 370 
 371 #ifndef ZEND_WIN32
 372 #define DLEXPORT
 373 #endif
 374 
 375 #define array_init(arg)                 _array_init((arg), 0 ZEND_FILE_LINE_CC)
 376 #define array_init_size(arg, size) _array_init((arg), (size) ZEND_FILE_LINE_CC)
 377 #define object_init(arg)                _object_init((arg) ZEND_FILE_LINE_CC)
 378 #define object_init_ex(arg, ce) _object_init_ex((arg), (ce) ZEND_FILE_LINE_CC)
 379 #define object_and_properties_init(arg, ce, properties) _object_and_properties_init((arg), (ce), (properties) ZEND_FILE_LINE_CC)
 380 ZEND_API int _array_init(zval *arg, uint32_t size ZEND_FILE_LINE_DC);
 381 ZEND_API int _object_init(zval *arg ZEND_FILE_LINE_DC);
 382 ZEND_API int _object_init_ex(zval *arg, zend_class_entry *ce ZEND_FILE_LINE_DC);
 383 ZEND_API int _object_and_properties_init(zval *arg, zend_class_entry *ce, HashTable *properties ZEND_FILE_LINE_DC);
 384 ZEND_API void object_properties_init(zend_object *object, zend_class_entry *class_type);
 385 ZEND_API void object_properties_init_ex(zend_object *object, HashTable *properties);
 386 ZEND_API void object_properties_load(zend_object *object, HashTable *properties);
 387 
 388 ZEND_API void zend_merge_properties(zval *obj, HashTable *properties);
 389 
 390 ZEND_API int add_assoc_long_ex(zval *arg, const char *key, size_t key_len, zend_long n);
 391 ZEND_API int add_assoc_null_ex(zval *arg, const char *key, size_t key_len);
 392 ZEND_API int add_assoc_bool_ex(zval *arg, const char *key, size_t key_len, int b);
 393 ZEND_API int add_assoc_resource_ex(zval *arg, const char *key, size_t key_len, zend_resource *r);
 394 ZEND_API int add_assoc_double_ex(zval *arg, const char *key, size_t key_len, double d);
 395 ZEND_API int add_assoc_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
 396 ZEND_API int add_assoc_string_ex(zval *arg, const char *key, size_t key_len, char *str);
 397 ZEND_API int add_assoc_stringl_ex(zval *arg, const char *key, size_t key_len, char *str, size_t length);
 398 ZEND_API int add_assoc_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
 399 
 400 #define add_assoc_long(__arg, __key, __n) add_assoc_long_ex(__arg, __key, strlen(__key), __n)
 401 #define add_assoc_null(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key))
 402 #define add_assoc_bool(__arg, __key, __b) add_assoc_bool_ex(__arg, __key, strlen(__key), __b)
 403 #define add_assoc_resource(__arg, __key, __r) add_assoc_resource_ex(__arg, __key, strlen(__key), __r)
 404 #define add_assoc_double(__arg, __key, __d) add_assoc_double_ex(__arg, __key, strlen(__key), __d)
 405 #define add_assoc_str(__arg, __key, __str) add_assoc_str_ex(__arg, __key, strlen(__key), __str)
 406 #define add_assoc_string(__arg, __key, __str) add_assoc_string_ex(__arg, __key, strlen(__key), __str)
 407 #define add_assoc_stringl(__arg, __key, __str, __length) add_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
 408 #define add_assoc_zval(__arg, __key, __value) add_assoc_zval_ex(__arg, __key, strlen(__key), __value)
 409 
 410 /* unset() functions are only suported for legacy modules and null() functions should be used */
 411 #define add_assoc_unset(__arg, __key) add_assoc_null_ex(__arg, __key, strlen(__key))
 412 #define add_index_unset(__arg, __key) add_index_null(__arg, __key)
 413 #define add_next_index_unset(__arg) add_next_index_null(__arg)
 414 #define add_property_unset(__arg, __key) add_property_null(__arg, __key)
 415 
 416 ZEND_API int add_index_long(zval *arg, zend_ulong idx, zend_long n);
 417 ZEND_API int add_index_null(zval *arg, zend_ulong idx);
 418 ZEND_API int add_index_bool(zval *arg, zend_ulong idx, int b);
 419 ZEND_API int add_index_resource(zval *arg, zend_ulong idx, zend_resource *r);
 420 ZEND_API int add_index_double(zval *arg, zend_ulong idx, double d);
 421 ZEND_API int add_index_str(zval *arg, zend_ulong idx, zend_string *str);
 422 ZEND_API int add_index_string(zval *arg, zend_ulong idx, const char *str);
 423 ZEND_API int add_index_stringl(zval *arg, zend_ulong idx, const char *str, size_t length);
 424 ZEND_API int add_index_zval(zval *arg, zend_ulong index, zval *value);
 425 
 426 ZEND_API int add_next_index_long(zval *arg, zend_long n);
 427 ZEND_API int add_next_index_null(zval *arg);
 428 ZEND_API int add_next_index_bool(zval *arg, int b);
 429 ZEND_API int add_next_index_resource(zval *arg, zend_resource *r);
 430 ZEND_API int add_next_index_double(zval *arg, double d);
 431 ZEND_API int add_next_index_str(zval *arg, zend_string *str);
 432 ZEND_API int add_next_index_string(zval *arg, const char *str);
 433 ZEND_API int add_next_index_stringl(zval *arg, const char *str, size_t length);
 434 ZEND_API int add_next_index_zval(zval *arg, zval *value);
 435 
 436 ZEND_API zval *add_get_assoc_string_ex(zval *arg, const char *key, uint key_len, const char *str);
 437 ZEND_API zval *add_get_assoc_stringl_ex(zval *arg, const char *key, uint key_len, const char *str, size_t length);
 438 
 439 #define add_get_assoc_string(__arg, __key, __str) add_get_assoc_string_ex(__arg, __key, strlen(__key), __str)
 440 #define add_get_assoc_stringl(__arg, __key, __str, __length) add_get_assoc_stringl_ex(__arg, __key, strlen(__key), __str, __length)
 441 
 442 ZEND_API zval *add_get_index_long(zval *arg, zend_ulong idx, zend_long l);
 443 ZEND_API zval *add_get_index_double(zval *arg, zend_ulong idx, double d);
 444 ZEND_API zval *add_get_index_str(zval *arg, zend_ulong index, zend_string *str);
 445 ZEND_API zval *add_get_index_string(zval *arg, zend_ulong idx, const char *str);
 446 ZEND_API zval *add_get_index_stringl(zval *arg, zend_ulong idx, const char *str, size_t length);
 447 
 448 ZEND_API int array_set_zval_key(HashTable *ht, zval *key, zval *value);
 449 
 450 ZEND_API int add_property_long_ex(zval *arg, const char *key, size_t key_len, zend_long l);
 451 ZEND_API int add_property_null_ex(zval *arg, const char *key, size_t key_len);
 452 ZEND_API int add_property_bool_ex(zval *arg, const char *key, size_t key_len, zend_long b);
 453 ZEND_API int add_property_resource_ex(zval *arg, const char *key, size_t key_len, zend_resource *r);
 454 ZEND_API int add_property_double_ex(zval *arg, const char *key, size_t key_len, double d);
 455 ZEND_API int add_property_str_ex(zval *arg, const char *key, size_t key_len, zend_string *str);
 456 ZEND_API int add_property_string_ex(zval *arg, const char *key, size_t key_len, const char *str);
 457 ZEND_API int add_property_stringl_ex(zval *arg, const char *key, size_t key_len,  const char *str, size_t length);
 458 ZEND_API int add_property_zval_ex(zval *arg, const char *key, size_t key_len, zval *value);
 459 
 460 #define add_property_long(__arg, __key, __n) add_property_long_ex(__arg, __key, strlen(__key), __n)
 461 #define add_property_null(__arg, __key) add_property_null_ex(__arg, __key, strlen(__key))
 462 #define add_property_bool(__arg, __key, __b) add_property_bool_ex(__arg, __key, strlen(__key), __b)
 463 #define add_property_resource(__arg, __key, __r) add_property_resource_ex(__arg, __key, strlen(__key), __r)
 464 #define add_property_double(__arg, __key, __d) add_property_double_ex(__arg, __key, strlen(__key), __d)
 465 #define add_property_str(__arg, __key, __str) add_property_str_ex(__arg, __key, strlen(__key), __str)
 466 #define add_property_string(__arg, __key, __str) add_property_string_ex(__arg, __key, strlen(__key), __str)
 467 #define add_property_stringl(__arg, __key, __str, __length) add_property_stringl_ex(__arg, __key, strlen(__key), __str, __length)
 468 #define add_property_zval(__arg, __key, __value) add_property_zval_ex(__arg, __key, strlen(__key), __value)
 469 
 470 
 471 ZEND_API int call_user_function(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[]);
 472 ZEND_API int call_user_function_ex(HashTable *function_table, zval *object, zval *function_name, zval *retval_ptr, uint32_t param_count, zval params[], int no_separation, zend_array *symbol_table);
 473 
 474 ZEND_API extern const zend_fcall_info empty_fcall_info;
 475 ZEND_API extern const zend_fcall_info_cache empty_fcall_info_cache;
 476 
 477 /** Build zend_call_info/cache from a zval*
 478  *
 479  * Caller is responsible to provide a return value, otherwise the we will crash.
 480  * fci->retval_ptr_ptr = NULL;
 481  * In order to pass parameters the following members need to be set:
 482  * fci->param_count = 0;
 483  * fci->params = NULL;
 484  * The callable_name argument may be NULL.
 485  * Set check_flags to IS_CALLABLE_STRICT for every new usage!
 486  */
 487 ZEND_API int zend_fcall_info_init(zval *callable, uint check_flags, zend_fcall_info *fci, zend_fcall_info_cache *fcc, zend_string **callable_name, char **error);
 488 
 489 /** Clear arguments connected with zend_fcall_info *fci
 490  * If free_mem is not zero then the params array gets free'd as well
 491  */
 492 ZEND_API void zend_fcall_info_args_clear(zend_fcall_info *fci, int free_mem);
 493 
 494 /** Save current arguments from zend_fcall_info *fci
 495  * params array will be set to NULL
 496  */
 497 ZEND_API void zend_fcall_info_args_save(zend_fcall_info *fci, int *param_count, zval **params);
 498 
 499 /** Free arguments connected with zend_fcall_info *fci andset back saved ones.
 500  */
 501 ZEND_API void zend_fcall_info_args_restore(zend_fcall_info *fci, int param_count, zval *params);
 502 
 503 /** Set or clear the arguments in the zend_call_info struct taking care of
 504  * refcount. If args is NULL and arguments are set then those are cleared.
 505  */
 506 ZEND_API int zend_fcall_info_args(zend_fcall_info *fci, zval *args);
 507 ZEND_API int zend_fcall_info_args_ex(zend_fcall_info *fci, zend_function *func, zval *args);
 508 
 509 /** Set arguments in the zend_fcall_info struct taking care of refcount.
 510  * If argc is 0 the arguments which are set will be cleared, else pass
 511  * a variable amount of zval** arguments.
 512  */
 513 ZEND_API int zend_fcall_info_argp(zend_fcall_info *fci, int argc, zval *argv);
 514 
 515 /** Set arguments in the zend_fcall_info struct taking care of refcount.
 516  * If argc is 0 the arguments which are set will be cleared, else pass
 517  * a variable amount of zval** arguments.
 518  */
 519 ZEND_API int zend_fcall_info_argv(zend_fcall_info *fci, int argc, va_list *argv);
 520 
 521 /** Set arguments in the zend_fcall_info struct taking care of refcount.
 522  * If argc is 0 the arguments which are set will be cleared, else pass
 523  * a variable amount of zval** arguments.
 524  */
 525 ZEND_API int zend_fcall_info_argn(zend_fcall_info *fci, int argc, ...);
 526 
 527 /** Call a function using information created by zend_fcall_info_init()/args().
 528  * If args is given then those replace the argument info in fci is temporarily.
 529  */
 530 ZEND_API int zend_fcall_info_call(zend_fcall_info *fci, zend_fcall_info_cache *fcc, zval *retval, zval *args);
 531 
 532 ZEND_API int zend_call_function(zend_fcall_info *fci, zend_fcall_info_cache *fci_cache);
 533 
 534 ZEND_API int zend_set_hash_symbol(zval *symbol, const char *name, int name_length, zend_bool is_ref, int num_symbol_tables, ...);
 535 
 536 ZEND_API int zend_delete_global_variable(zend_string *name);
 537 
 538 ZEND_API zend_array *zend_rebuild_symbol_table(void);
 539 ZEND_API void zend_attach_symbol_table(zend_execute_data *execute_data);
 540 ZEND_API void zend_detach_symbol_table(zend_execute_data *execute_data);
 541 ZEND_API int zend_set_local_var(zend_string *name, zval *value, int force);
 542 ZEND_API int zend_set_local_var_str(const char *name, size_t len, zval *value, int force);
 543 
 544 ZEND_API zend_string *zend_find_alias_name(zend_class_entry *ce, zend_string *name);
 545 ZEND_API zend_string *zend_resolve_method_name(zend_class_entry *ce, zend_function *f);
 546 
 547 ZEND_API const char *zend_get_object_type(const zend_class_entry *ce);
 548 
 549 #define add_method(arg, key, method)    add_assoc_function((arg), (key), (method))
 550 
 551 ZEND_API ZEND_FUNCTION(display_disabled_function);
 552 ZEND_API ZEND_FUNCTION(display_disabled_class);
 553 END_EXTERN_C()
 554 
 555 #if ZEND_DEBUG
 556 #define CHECK_ZVAL_STRING(str) \
 557         if (ZSTR_VAL(str)[ZSTR_LEN(str)] != '\0') { zend_error(E_WARNING, "String is not zero-terminated (%s)", ZSTR_VAL(str)); }
 558 #define CHECK_ZVAL_STRING_REL(str) \
 559         if (ZSTR_VAL(str)[ZSTR_LEN(str)] != '\0') { zend_error(E_WARNING, "String is not zero-terminated (%s) (source: %s:%d)", ZSTR_VAL(str) ZEND_FILE_LINE_RELAY_CC); }
 560 #else
 561 #define CHECK_ZVAL_STRING(z)
 562 #define CHECK_ZVAL_STRING_REL(z)
 563 #endif
 564 
 565 #define CHECK_ZVAL_NULL_PATH(p) (Z_STRLEN_P(p) != strlen(Z_STRVAL_P(p)))
 566 #define CHECK_NULL_PATH(p, l) (strlen(p) != l)
 567 
 568 #define ZVAL_STRINGL(z, s, l) do {                              \
 569                 ZVAL_NEW_STR(z, zend_string_init(s, l, 0));             \
 570         } while (0)
 571 
 572 #define ZVAL_STRING(z, s) do {                                  \
 573                 const char *_s = (s);                                   \
 574                 ZVAL_STRINGL(z, _s, strlen(_s));                \
 575         } while (0)
 576 
 577 #define ZVAL_EMPTY_STRING(z) do {                               \
 578                 ZVAL_INTERNED_STR(z, ZSTR_EMPTY_ALLOC());               \
 579         } while (0)
 580 
 581 #define ZVAL_PSTRINGL(z, s, l) do {                             \
 582                 ZVAL_NEW_STR(z, zend_string_init(s, l, 1));             \
 583         } while (0)
 584 
 585 #define ZVAL_PSTRING(z, s) do {                                 \
 586                 const char *_s = (s);                                   \
 587                 ZVAL_PSTRINGL(z, _s, strlen(_s));               \
 588         } while (0)
 589 
 590 #define ZVAL_EMPTY_PSTRING(z) do {                              \
 591                 ZVAL_PSTRINGL(z, "", 0);                                \
 592         } while (0)
 593 
 594 #define ZVAL_ZVAL(z, zv, copy, dtor) do {               \
 595                 zval *__z = (z);                                                \
 596                 zval *__zv = (zv);                                              \
 597                 if (EXPECTED(!Z_ISREF_P(__zv))) {               \
 598                         if (copy && !dtor) {                            \
 599                                 ZVAL_COPY(__z, __zv);                   \
 600                         } else {                                                        \
 601                                 ZVAL_COPY_VALUE(__z, __zv);             \
 602                         }                                                                       \
 603                 } else {                                                                \
 604                         ZVAL_COPY(__z, Z_REFVAL_P(__zv));       \
 605                         if (dtor || !copy) {                            \
 606                                 zval_ptr_dtor(__zv);                    \
 607                         }                                                                       \
 608                 }                                                                               \
 609         } while (0)
 610 
 611 #define RETVAL_BOOL(b)                                  ZVAL_BOOL(return_value, b)
 612 #define RETVAL_NULL()                                   ZVAL_NULL(return_value)
 613 #define RETVAL_LONG(l)                                  ZVAL_LONG(return_value, l)
 614 #define RETVAL_DOUBLE(d)                                ZVAL_DOUBLE(return_value, d)
 615 #define RETVAL_STR(s)                                   ZVAL_STR(return_value, s)
 616 #define RETVAL_INTERNED_STR(s)                  ZVAL_INTERNED_STR(return_value, s)
 617 #define RETVAL_NEW_STR(s)                               ZVAL_NEW_STR(return_value, s)
 618 #define RETVAL_STR_COPY(s)                              ZVAL_STR_COPY(return_value, s)
 619 #define RETVAL_STRING(s)                                ZVAL_STRING(return_value, s)
 620 #define RETVAL_STRINGL(s, l)                    ZVAL_STRINGL(return_value, s, l)
 621 #define RETVAL_EMPTY_STRING()                   ZVAL_EMPTY_STRING(return_value)
 622 #define RETVAL_RES(r)                                   ZVAL_RES(return_value, r)
 623 #define RETVAL_ARR(r)                                   ZVAL_ARR(return_value, r)
 624 #define RETVAL_OBJ(r)                                   ZVAL_OBJ(return_value, r)
 625 #define RETVAL_ZVAL(zv, copy, dtor)             ZVAL_ZVAL(return_value, zv, copy, dtor)
 626 #define RETVAL_FALSE                                    ZVAL_FALSE(return_value)
 627 #define RETVAL_TRUE                                     ZVAL_TRUE(return_value)
 628 
 629 #define RETURN_BOOL(b)                                  { RETVAL_BOOL(b); return; }
 630 #define RETURN_NULL()                                   { RETVAL_NULL(); return;}
 631 #define RETURN_LONG(l)                                  { RETVAL_LONG(l); return; }
 632 #define RETURN_DOUBLE(d)                                { RETVAL_DOUBLE(d); return; }
 633 #define RETURN_STR(s)                                   { RETVAL_STR(s); return; }
 634 #define RETURN_INTERNED_STR(s)                  { RETVAL_INTERNED_STR(s); return; }
 635 #define RETURN_NEW_STR(s)                               { RETVAL_NEW_STR(s); return; }
 636 #define RETURN_STR_COPY(s)                              { RETVAL_STR_COPY(s); return; }
 637 #define RETURN_STRING(s)                                { RETVAL_STRING(s); return; }
 638 #define RETURN_STRINGL(s, l)                    { RETVAL_STRINGL(s, l); return; }
 639 #define RETURN_EMPTY_STRING()                   { RETVAL_EMPTY_STRING(); return; }
 640 #define RETURN_RES(r)                                   { RETVAL_RES(r); return; }
 641 #define RETURN_ARR(r)                                   { RETVAL_ARR(r); return; }
 642 #define RETURN_OBJ(r)                                   { RETVAL_OBJ(r); return; }
 643 #define RETURN_ZVAL(zv, copy, dtor)             { RETVAL_ZVAL(zv, copy, dtor); return; }
 644 #define RETURN_FALSE                                    { RETVAL_FALSE; return; }
 645 #define RETURN_TRUE                                     { RETVAL_TRUE; return; }
 646 
 647 #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)) : NULL)))
 648 #define ZVAL_IS_NULL(z) (Z_TYPE_P(z) == IS_NULL)
 649 
 650 /* For compatibility */
 651 #define ZEND_MINIT                      ZEND_MODULE_STARTUP_N
 652 #define ZEND_MSHUTDOWN          ZEND_MODULE_SHUTDOWN_N
 653 #define ZEND_RINIT                      ZEND_MODULE_ACTIVATE_N
 654 #define ZEND_RSHUTDOWN          ZEND_MODULE_DEACTIVATE_N
 655 #define ZEND_MINFO                      ZEND_MODULE_INFO_N
 656 #define ZEND_GINIT(module)              ((void (*)(void*))(ZEND_MODULE_GLOBALS_CTOR_N(module)))
 657 #define ZEND_GSHUTDOWN(module)  ((void (*)(void*))(ZEND_MODULE_GLOBALS_DTOR_N(module)))
 658 
 659 #define ZEND_MINIT_FUNCTION                     ZEND_MODULE_STARTUP_D
 660 #define ZEND_MSHUTDOWN_FUNCTION         ZEND_MODULE_SHUTDOWN_D
 661 #define ZEND_RINIT_FUNCTION                     ZEND_MODULE_ACTIVATE_D
 662 #define ZEND_RSHUTDOWN_FUNCTION         ZEND_MODULE_DEACTIVATE_D
 663 #define ZEND_MINFO_FUNCTION                     ZEND_MODULE_INFO_D
 664 #define ZEND_GINIT_FUNCTION                     ZEND_MODULE_GLOBALS_CTOR_D
 665 #define ZEND_GSHUTDOWN_FUNCTION         ZEND_MODULE_GLOBALS_DTOR_D
 666 
 667 /* Fast parameter parsing API */
 668 
 669 /* This API should be used only for really often used functions.
 670  * (Keep the original parsing code and wrap usage with #ifndef FAST_ZPP)
 671  */
 672 #define FAST_ZPP 1
 673 
 674 #ifdef FAST_ZPP
 675 
 676 #define Z_EXPECTED_TYPES(_) \
 677         _(Z_EXPECTED_LONG,              "integer") \
 678         _(Z_EXPECTED_BOOL,              "boolean") \
 679         _(Z_EXPECTED_STRING,    "string") \
 680         _(Z_EXPECTED_ARRAY,             "array") \
 681         _(Z_EXPECTED_FUNC,              "valid callback") \
 682         _(Z_EXPECTED_RESOURCE,  "resource") \
 683         _(Z_EXPECTED_PATH,              "a valid path") \
 684         _(Z_EXPECTED_OBJECT,    "object") \
 685         _(Z_EXPECTED_DOUBLE,    "float")
 686 
 687 #define Z_EXPECTED_TYPE_ENUM(id, str) id,
 688 #define Z_EXPECTED_TYPE_STR(id, str)  str,
 689 
 690 typedef enum _zend_expected_type {
 691         Z_EXPECTED_TYPES(Z_EXPECTED_TYPE_ENUM)
 692         Z_EXPECTED_LAST
 693 } zend_expected_type;
 694 
 695 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_paramers_count_error(int num_args, int min_num_args, int max_num_args);
 696 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_paramer_type_error(int num, zend_expected_type expected_type, zval *arg);
 697 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_paramer_class_error(int num, char *name, zval *arg);
 698 ZEND_API ZEND_COLD void ZEND_FASTCALL zend_wrong_callback_error(int severity, int num, char *error);
 699 
 700 #define ZPP_ERROR_OK             0
 701 #define ZPP_ERROR_FAILURE        1
 702 #define ZPP_ERROR_WRONG_CALLBACK 2
 703 #define ZPP_ERROR_WRONG_CLASS    3
 704 #define ZPP_ERROR_WRONG_ARG      4
 705 #define ZPP_ERROR_WRONG_COUNT    5
 706 
 707 #define ZEND_PARSE_PARAMETERS_START_EX(flags, min_num_args, max_num_args) do { \
 708                 const int _flags = (flags); \
 709                 int _min_num_args = (min_num_args); \
 710                 int _max_num_args = (max_num_args); \
 711                 int _num_args = EX_NUM_ARGS(); \
 712                 int _i; \
 713                 zval *_real_arg, *_arg = NULL; \
 714                 zend_expected_type _expected_type = IS_UNDEF; \
 715                 char *_error = NULL; \
 716                 zend_bool _dummy; \
 717                 zend_bool _optional = 0; \
 718                 int error_code = ZPP_ERROR_OK; \
 719                 ((void)_i); \
 720                 ((void)_real_arg); \
 721                 ((void)_arg); \
 722                 ((void)_expected_type); \
 723                 ((void)_error); \
 724                 ((void)_dummy); \
 725                 ((void)_optional); \
 726                 \
 727                 do { \
 728                         if (UNEXPECTED(_num_args < _min_num_args) || \
 729                             (UNEXPECTED(_num_args > _max_num_args) && \
 730                              EXPECTED(_max_num_args >= 0))) { \
 731                                 if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
 732                                         zend_wrong_paramers_count_error(_num_args, _min_num_args, _max_num_args); \
 733                                 } \
 734                                 error_code = ZPP_ERROR_FAILURE; \
 735                                 break; \
 736                         } \
 737                         _i = 0; \
 738                         _real_arg = ZEND_CALL_ARG(execute_data, 0);
 739 
 740 #define ZEND_PARSE_PARAMETERS_START(min_num_args, max_num_args) \
 741         ZEND_PARSE_PARAMETERS_START_EX(0, min_num_args, max_num_args)
 742 
 743 #define ZEND_PARSE_PARAMETERS_END_EX(failure) \
 744                 } while (0); \
 745                 if (UNEXPECTED(error_code != ZPP_ERROR_OK)) { \
 746                         if (!(_flags & ZEND_PARSE_PARAMS_QUIET)) { \
 747                                 if (error_code == ZPP_ERROR_WRONG_CALLBACK) { \
 748                                         zend_wrong_callback_error(E_WARNING, _i, _error); \
 749                                 } else if (error_code == ZPP_ERROR_WRONG_CLASS) { \
 750                                         zend_wrong_paramer_class_error(_i, _error, _arg); \
 751                                 } else if (error_code == ZPP_ERROR_WRONG_ARG) { \
 752                                         zend_wrong_paramer_type_error(_i, _expected_type, _arg); \
 753                                 } \
 754                         } \
 755                         failure; \
 756                 } \
 757         } while (0)
 758 
 759 #define ZEND_PARSE_PARAMETERS_END() \
 760         ZEND_PARSE_PARAMETERS_END_EX(return)
 761 
 762 #define Z_PARAM_PROLOGUE(separate) \
 763         ++_i; \
 764         ZEND_ASSERT(_i <= _min_num_args || _optional==1); \
 765         ZEND_ASSERT(_i >  _min_num_args || _optional==0); \
 766         if (_optional) { \
 767                 if (UNEXPECTED(_i >_num_args)) break; \
 768         } \
 769         _real_arg++; \
 770         _arg = _real_arg; \
 771         ZVAL_DEREF(_arg); \
 772         if (separate) { \
 773                 SEPARATE_ZVAL_NOREF(_arg); \
 774         }
 775 
 776 /* old "|" */
 777 #define Z_PARAM_OPTIONAL \
 778         _optional = 1;
 779 
 780 /* old "a" */
 781 #define Z_PARAM_ARRAY_EX(dest, check_null, separate) \
 782                 Z_PARAM_PROLOGUE(separate); \
 783                 if (UNEXPECTED(!zend_parse_arg_array(_arg, &dest, check_null, 0))) { \
 784                         _expected_type = Z_EXPECTED_ARRAY; \
 785                         error_code = ZPP_ERROR_WRONG_ARG; \
 786                         break; \
 787                 }
 788 
 789 #define Z_PARAM_ARRAY(dest) \
 790         Z_PARAM_ARRAY_EX(dest, 0, 0)
 791 
 792 /* old "A" */
 793 #define Z_PARAM_ARRAY_OR_OBJECT_EX(dest, check_null, separate) \
 794                 Z_PARAM_PROLOGUE(separate); \
 795                 if (UNEXPECTED(!zend_parse_arg_array(_arg, &dest, check_null, 1))) { \
 796                         _expected_type = Z_EXPECTED_ARRAY; \
 797                         error_code = ZPP_ERROR_WRONG_ARG; \
 798                         break; \
 799                 }
 800 
 801 #define Z_PARAM_ARRAY_OR_OBJECT(dest, check_null, separate) \
 802         Z_PARAM_ARRAY_OR_OBJECT_EX(dest, 0, 0)
 803 
 804 /* old "b" */
 805 #define Z_PARAM_BOOL_EX(dest, is_null, check_null, separate) \
 806                 Z_PARAM_PROLOGUE(separate); \
 807                 if (UNEXPECTED(!zend_parse_arg_bool(_arg, &dest, &is_null, check_null))) { \
 808                         _expected_type = Z_EXPECTED_BOOL; \
 809                         error_code = ZPP_ERROR_WRONG_ARG; \
 810                         break; \
 811                 }
 812 
 813 #define Z_PARAM_BOOL(dest) \
 814         Z_PARAM_BOOL_EX(dest, _dummy, 0, 0)
 815 
 816 /* old "C" */
 817 #define Z_PARAM_CLASS_EX(dest, check_null, separate) \
 818                 Z_PARAM_PROLOGUE(separate); \
 819                 if (UNEXPECTED(!zend_parse_arg_class(_arg, &dest, _i, check_null))) { \
 820                         error_code = ZPP_ERROR_FAILURE; \
 821                         break; \
 822                 }
 823 
 824 #define Z_PARAM_CLASS(dest) \
 825         Z_PARAM_CLASS_EX(dest, 0, 0)
 826 
 827 /* old "d" */
 828 #define Z_PARAM_DOUBLE_EX(dest, is_null, check_null, separate) \
 829                 Z_PARAM_PROLOGUE(separate); \
 830                 if (UNEXPECTED(!zend_parse_arg_double(_arg, &dest, &is_null, check_null))) { \
 831                         _expected_type = Z_EXPECTED_DOUBLE; \
 832                         error_code = ZPP_ERROR_WRONG_ARG; \
 833                         break; \
 834                 }
 835 
 836 #define Z_PARAM_DOUBLE(dest) \
 837         Z_PARAM_DOUBLE_EX(dest, _dummy, 0, 0)
 838 
 839 /* old "f" */
 840 #define Z_PARAM_FUNC_EX(dest_fci, dest_fcc, check_null, separate) \
 841                 Z_PARAM_PROLOGUE(separate); \
 842                 if (UNEXPECTED(!zend_parse_arg_func(_arg, &dest_fci, &dest_fcc, check_null, &_error))) { \
 843                         if (!_error) { \
 844                                 _expected_type = Z_EXPECTED_FUNC; \
 845                                 error_code = ZPP_ERROR_WRONG_ARG; \
 846                                 break; \
 847                         } else { \
 848                                 error_code = ZPP_ERROR_WRONG_CALLBACK; \
 849                                 break; \
 850                         } \
 851                 } else if (UNEXPECTED(_error != NULL)) { \
 852                         zend_wrong_callback_error(E_DEPRECATED, _i, _error); \
 853                 }
 854 
 855 #define Z_PARAM_FUNC(dest_fci, dest_fcc) \
 856         Z_PARAM_FUNC_EX(dest_fci, dest_fcc, 0, 0)
 857 
 858 /* old "h" */
 859 #define Z_PARAM_ARRAY_HT_EX(dest, check_null, separate) \
 860                 Z_PARAM_PROLOGUE(separate); \
 861                 if (UNEXPECTED(!zend_parse_arg_array_ht(_arg, &dest, check_null, 0))) { \
 862                         _expected_type = Z_EXPECTED_ARRAY; \
 863                         error_code = ZPP_ERROR_WRONG_ARG; \
 864                         break; \
 865                 }
 866 
 867 #define Z_PARAM_ARRAY_HT(dest) \
 868         Z_PARAM_ARRAY_HT_EX(dest, 0, 0)
 869 
 870 /* old "H" */
 871 #define Z_PARAM_ARRAY_OR_OBJECT_HT_EX(dest, check_null, separate) \
 872                 Z_PARAM_PROLOGUE(separate); \
 873                 if (UNEXPECTED(!zend_parse_arg_array_ht(_arg, &dest, check_null, 1))) { \
 874                         _expected_type = Z_EXPECTED_ARRAY; \
 875                         error_code = ZPP_ERROR_WRONG_ARG; \
 876                         break; \
 877                 }
 878 
 879 #define Z_PARAM_ARRAY_OR_OBJECT_HT(dest) \
 880         Z_PARAM_ARRAY_OR_OBJECT_HT_EX(dest, 0, 0)
 881 
 882 /* old "l" */
 883 #define Z_PARAM_LONG_EX(dest, is_null, check_null, separate) \
 884                 Z_PARAM_PROLOGUE(separate); \
 885                 if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 0))) { \
 886                         _expected_type = Z_EXPECTED_LONG; \
 887                         error_code = ZPP_ERROR_WRONG_ARG; \
 888                         break; \
 889                 }
 890 
 891 #define Z_PARAM_LONG(dest) \
 892         Z_PARAM_LONG_EX(dest, _dummy, 0, 0)
 893 
 894 /* old "L" */
 895 #define Z_PARAM_STRICT_LONG_EX(dest, is_null, check_null, separate) \
 896                 Z_PARAM_PROLOGUE(separate); \
 897                 if (UNEXPECTED(!zend_parse_arg_long(_arg, &dest, &is_null, check_null, 1))) { \
 898                         _expected_type = Z_EXPECTED_LONG; \
 899                         error_code = ZPP_ERROR_WRONG_ARG; \
 900                         break; \
 901                 }
 902 
 903 #define Z_PARAM_STRICT_LONG(dest) \
 904         Z_PARAM_STRICT_LONG_EX(dest, _dummy, 0, 0)
 905 
 906 /* old "o" */
 907 #define Z_PARAM_OBJECT_EX(dest, check_null, separate) \
 908                 Z_PARAM_PROLOGUE(separate); \
 909                 if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, NULL, check_null))) { \
 910                         _expected_type = Z_EXPECTED_OBJECT; \
 911                         error_code = ZPP_ERROR_WRONG_ARG; \
 912                         break; \
 913                 }
 914 
 915 #define Z_PARAM_OBJECT(dest) \
 916         Z_PARAM_OBJECT_EX(dest, 0, 0)
 917 
 918 /* old "O" */
 919 #define Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, check_null, separate) \
 920                 Z_PARAM_PROLOGUE(separate); \
 921                 if (UNEXPECTED(!zend_parse_arg_object(_arg, &dest, _ce, check_null))) { \
 922                         if (_ce) { \
 923                                 _error = ZSTR_VAL((_ce)->name); \
 924                                 error_code = ZPP_ERROR_WRONG_CLASS; \
 925                                 break; \
 926                         } else { \
 927                                 _expected_type = Z_EXPECTED_OBJECT; \
 928                                 error_code = ZPP_ERROR_WRONG_ARG; \
 929                                 break; \
 930                         } \
 931                 }
 932 
 933 #define Z_PARAM_OBJECT_OF_CLASS(dest, _ce) \
 934         Z_PARAM_OBJECT_OF_CLASS_EX(dest, _ce, 0, 0)
 935 
 936 /* old "p" */
 937 #define Z_PARAM_PATH_EX(dest, dest_len, check_null, separate) \
 938                 Z_PARAM_PROLOGUE(separate); \
 939                 if (UNEXPECTED(!zend_parse_arg_path(_arg, &dest, &dest_len, check_null))) { \
 940                         _expected_type = Z_EXPECTED_PATH; \
 941                         error_code = ZPP_ERROR_WRONG_ARG; \
 942                         break; \
 943                 }
 944 
 945 #define Z_PARAM_PATH(dest, dest_len) \
 946         Z_PARAM_PATH_EX(dest, dest_len, 0, 0)
 947 
 948 /* old "P" */
 949 #define Z_PARAM_PATH_STR_EX(dest, check_null, separate) \
 950                 Z_PARAM_PROLOGUE(separate); \
 951                 if (UNEXPECTED(!zend_parse_arg_path_str(_arg, &dest, check_null))) { \
 952                         _expected_type = Z_EXPECTED_PATH; \
 953                         error_code = ZPP_ERROR_WRONG_ARG; \
 954                         break; \
 955                 }
 956 
 957 #define Z_PARAM_PATH_STR(dest) \
 958         Z_PARAM_PATH_STR_EX(dest, 0, 0)
 959 
 960 /* old "r" */
 961 #define Z_PARAM_RESOURCE_EX(dest, check_null, separate) \
 962                 Z_PARAM_PROLOGUE(separate); \
 963                 if (UNEXPECTED(!zend_parse_arg_resource(_arg, &dest, check_null))) { \
 964                         _expected_type = Z_EXPECTED_RESOURCE; \
 965                         error_code = ZPP_ERROR_WRONG_ARG; \
 966                         break; \
 967                 }
 968 
 969 #define Z_PARAM_RESOURCE(dest) \
 970         Z_PARAM_RESOURCE_EX(dest, 0, 0)
 971 
 972 /* old "s" */
 973 #define Z_PARAM_STRING_EX(dest, dest_len, check_null, separate) \
 974                 Z_PARAM_PROLOGUE(separate); \
 975                 if (UNEXPECTED(!zend_parse_arg_string(_arg, &dest, &dest_len, check_null))) { \
 976                         _expected_type = Z_EXPECTED_STRING; \
 977                         error_code = ZPP_ERROR_WRONG_ARG; \
 978                         break; \
 979                 }
 980 
 981 #define Z_PARAM_STRING(dest, dest_len) \
 982         Z_PARAM_STRING_EX(dest, dest_len, 0, 0)
 983 
 984 /* old "S" */
 985 #define Z_PARAM_STR_EX(dest, check_null, separate) \
 986                 Z_PARAM_PROLOGUE(separate); \
 987                 if (UNEXPECTED(!zend_parse_arg_str(_arg, &dest, check_null))) { \
 988                         _expected_type = Z_EXPECTED_STRING; \
 989                         error_code = ZPP_ERROR_WRONG_ARG; \
 990                         break; \
 991                 }
 992 
 993 #define Z_PARAM_STR(dest) \
 994         Z_PARAM_STR_EX(dest, 0, 0)
 995 
 996 /* old "z" */
 997 #define Z_PARAM_ZVAL_EX(dest, check_null, separate) \
 998                 if (separate) { \
 999                         Z_PARAM_PROLOGUE(separate); \
1000                         zend_parse_arg_zval_deref(_arg, &dest, check_null); \
1001                 } else { \
1002                         ++_i; \
1003                         ZEND_ASSERT(_i <= _min_num_args || _optional==1); \
1004                         ZEND_ASSERT(_i >  _min_num_args || _optional==0); \
1005                         if (_optional && UNEXPECTED(_i >_num_args)) break; \
1006                         _real_arg++; \
1007                         zend_parse_arg_zval(_real_arg, &dest, check_null); \
1008                 }
1009 
1010 #define Z_PARAM_ZVAL(dest) \
1011         Z_PARAM_ZVAL_EX(dest, 0, 0)
1012 
1013 /* old "z" (with dereference) */
1014 #define Z_PARAM_ZVAL_DEREF_EX(dest, check_null, separate) \
1015                 Z_PARAM_PROLOGUE(separate); \
1016                 zend_parse_arg_zval_deref(_arg, &dest, check_null);
1017 
1018 #define Z_PARAM_ZVAL_DEREF(dest) \
1019         Z_PARAM_ZVAL_DEREF_EX(dest, 0, 0)
1020 
1021 /* old "+" and "*" */
1022 #define Z_PARAM_VARIADIC_EX(spec, dest, dest_num, post_varargs) do { \
1023                 int _num_varargs = _num_args - _i - (post_varargs); \
1024                 if (EXPECTED(_num_varargs > 0)) { \
1025                         dest = _real_arg + 1; \
1026                         dest_num = _num_varargs; \
1027                         _i += _num_varargs; \
1028                         _real_arg += _num_varargs; \
1029                 } else { \
1030                         dest = NULL; \
1031                         dest_num = 0; \
1032                 } \
1033         } while (0);
1034 
1035 #define Z_PARAM_VARIADIC(spec, dest, dest_num) \
1036         Z_PARAM_VARIADIC_EX(spec, dest, dest_num, 0)
1037 
1038 #endif /* FAST_ZPP */
1039 
1040 /* End of new parameter parsing API */
1041 
1042 /* Inlined implementations shared by new and old parameter parsing APIs */
1043 
1044 ZEND_API int ZEND_FASTCALL zend_parse_arg_class(zval *arg, zend_class_entry **pce, int num, int check_null);
1045 ZEND_API int ZEND_FASTCALL zend_parse_arg_bool_slow(zval *arg, zend_bool *dest);
1046 ZEND_API int ZEND_FASTCALL zend_parse_arg_bool_weak(zval *arg, zend_bool *dest);
1047 ZEND_API int ZEND_FASTCALL zend_parse_arg_long_slow(zval *arg, zend_long *dest);
1048 ZEND_API int ZEND_FASTCALL zend_parse_arg_long_weak(zval *arg, zend_long *dest);
1049 ZEND_API int ZEND_FASTCALL zend_parse_arg_long_cap_slow(zval *arg, zend_long *dest);
1050 ZEND_API int ZEND_FASTCALL zend_parse_arg_long_cap_weak(zval *arg, zend_long *dest);
1051 ZEND_API int ZEND_FASTCALL zend_parse_arg_double_slow(zval *arg, double *dest);
1052 ZEND_API int ZEND_FASTCALL zend_parse_arg_double_weak(zval *arg, double *dest);
1053 ZEND_API int ZEND_FASTCALL zend_parse_arg_str_slow(zval *arg, zend_string **dest);
1054 ZEND_API int ZEND_FASTCALL zend_parse_arg_str_weak(zval *arg, zend_string **dest);
1055 
1056 static zend_always_inline int zend_parse_arg_bool(zval *arg, zend_bool *dest, zend_bool *is_null, int check_null)
1057 {
1058         if (check_null) {
1059                 *is_null = 0;
1060         }
1061         if (EXPECTED(Z_TYPE_P(arg) == IS_TRUE)) {
1062                 *dest = 1;
1063         } else if (EXPECTED(Z_TYPE_P(arg) == IS_FALSE)) {
1064                 *dest = 0;
1065         } else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
1066                 *is_null = 1;
1067                 *dest = 0;
1068         } else {
1069                 return zend_parse_arg_bool_slow(arg, dest);
1070         }
1071         return 1;
1072 }
1073 
1074 static zend_always_inline int zend_parse_arg_long(zval *arg, zend_long *dest, zend_bool *is_null, int check_null, int cap)
1075 {
1076         if (check_null) {
1077                 *is_null = 0;
1078         }
1079         if (EXPECTED(Z_TYPE_P(arg) == IS_LONG)) {
1080                 *dest = Z_LVAL_P(arg);
1081         } else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
1082                 *is_null = 1;
1083                 *dest = 0;
1084         } else if (cap) {
1085                 return zend_parse_arg_long_cap_slow(arg, dest);
1086         } else {
1087                 return zend_parse_arg_long_slow(arg, dest);
1088         }
1089         return 1;
1090 }
1091 
1092 static zend_always_inline int zend_parse_arg_double(zval *arg, double *dest, zend_bool *is_null, int check_null)
1093 {
1094         if (check_null) {
1095                 *is_null = 0;
1096         }
1097         if (EXPECTED(Z_TYPE_P(arg) == IS_DOUBLE)) {
1098                 *dest = Z_DVAL_P(arg);
1099         } else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
1100                 *is_null = 1;
1101                 *dest = 0.0;
1102         } else {
1103                 return zend_parse_arg_double_slow(arg, dest);
1104         }
1105         return 1;
1106 }
1107 
1108 static zend_always_inline int zend_parse_arg_str(zval *arg, zend_string **dest, int check_null)
1109 {
1110         if (EXPECTED(Z_TYPE_P(arg) == IS_STRING)) {
1111                 *dest = Z_STR_P(arg);
1112         } else if (check_null && Z_TYPE_P(arg) == IS_NULL) {
1113                 *dest = NULL;
1114         } else {
1115                 return zend_parse_arg_str_slow(arg, dest);
1116         }
1117         return 1;
1118 }
1119 
1120 static zend_always_inline int zend_parse_arg_string(zval *arg, char **dest, size_t *dest_len, int check_null)
1121 {
1122         zend_string *str;
1123 
1124         if (!zend_parse_arg_str(arg, &str, check_null)) {
1125                 return 0;
1126         }
1127         if (check_null && UNEXPECTED(!str)) {
1128                 *dest = NULL;
1129                 *dest_len = 0;
1130         } else {
1131                 *dest = ZSTR_VAL(str);
1132                 *dest_len = ZSTR_LEN(str);
1133         }
1134         return 1;
1135 }
1136 
1137 static zend_always_inline int zend_parse_arg_path_str(zval *arg, zend_string **dest, int check_null)
1138 {
1139         if (!zend_parse_arg_str(arg, dest, check_null) ||
1140             (*dest && UNEXPECTED(CHECK_NULL_PATH(ZSTR_VAL(*dest), ZSTR_LEN(*dest))))) {
1141                 return 0;
1142         }
1143         return 1;
1144 }
1145 
1146 static zend_always_inline int zend_parse_arg_path(zval *arg, char **dest, size_t *dest_len, int check_null)
1147 {
1148         zend_string *str;
1149 
1150         if (!zend_parse_arg_path_str(arg, &str, check_null)) {
1151                 return 0;
1152         }
1153         if (check_null && UNEXPECTED(!str)) {
1154                 *dest = NULL;
1155                 *dest_len = 0;
1156         } else {
1157                 *dest = ZSTR_VAL(str);
1158                 *dest_len = ZSTR_LEN(str);
1159         }
1160         return 1;
1161 }
1162 
1163 static zend_always_inline int zend_parse_arg_array(zval *arg, zval **dest, int check_null, int or_object)
1164 {
1165         if (EXPECTED(Z_TYPE_P(arg) == IS_ARRAY) ||
1166                 (or_object && EXPECTED(Z_TYPE_P(arg) == IS_OBJECT))) {
1167                 *dest = arg;
1168         } else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
1169                 *dest = NULL;
1170         } else {
1171                 return 0;
1172         }
1173         return 1;
1174 }
1175 
1176 static zend_always_inline int zend_parse_arg_array_ht(zval *arg, HashTable **dest, int check_null, int or_object)
1177 {
1178         if (EXPECTED(Z_TYPE_P(arg) == IS_ARRAY)) {
1179                 *dest = Z_ARRVAL_P(arg);
1180         } else if (or_object && EXPECTED(Z_TYPE_P(arg) == IS_OBJECT)) {
1181                 *dest = Z_OBJ_HT_P(arg)->get_properties(arg);
1182         } else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
1183                 *dest = NULL;
1184         } else {
1185                 return 0;
1186         }
1187         return 1;
1188 }
1189 
1190 static zend_always_inline int zend_parse_arg_object(zval *arg, zval **dest, zend_class_entry *ce, int check_null)
1191 {
1192         if (EXPECTED(Z_TYPE_P(arg) == IS_OBJECT) &&
1193             (!ce || EXPECTED(instanceof_function(Z_OBJCE_P(arg), ce) != 0))) {
1194                 *dest = arg;
1195         } else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
1196                 *dest = NULL;
1197         } else {
1198                 return 0;
1199         }
1200         return 1;
1201 }
1202 
1203 static zend_always_inline int zend_parse_arg_resource(zval *arg, zval **dest, int check_null)
1204 {
1205         if (EXPECTED(Z_TYPE_P(arg) == IS_RESOURCE)) {
1206                 *dest = arg;
1207         } else if (check_null && EXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
1208                 *dest = NULL;
1209         } else {
1210                 return 0;
1211         }
1212         return 1;
1213 }
1214 
1215 static zend_always_inline int zend_parse_arg_func(zval *arg, zend_fcall_info *dest_fci, zend_fcall_info_cache *dest_fcc, int check_null, char **error)
1216 {
1217         if (check_null && UNEXPECTED(Z_TYPE_P(arg) == IS_NULL)) {
1218                 dest_fci->size = 0;
1219                 dest_fcc->initialized = 0;
1220                 *error = NULL;
1221         } else if (UNEXPECTED(zend_fcall_info_init(arg, 0, dest_fci, dest_fcc, NULL, error) != SUCCESS)) {
1222                 return 0;
1223         }
1224         return 1;
1225 }
1226 
1227 static zend_always_inline void zend_parse_arg_zval(zval *arg, zval **dest, int check_null)
1228 {
1229         *dest = (check_null &&
1230             (UNEXPECTED(Z_TYPE_P(arg) == IS_NULL) ||
1231              (UNEXPECTED(Z_ISREF_P(arg)) &&
1232               UNEXPECTED(Z_TYPE_P(Z_REFVAL_P(arg)) == IS_NULL)))) ? NULL : arg;
1233 }
1234 
1235 static zend_always_inline void zend_parse_arg_zval_deref(zval *arg, zval **dest, int check_null)
1236 {
1237         *dest = (check_null && UNEXPECTED(Z_TYPE_P(arg) == IS_NULL)) ? NULL : arg;
1238 }
1239 
1240 END_EXTERN_C()
1241 
1242 #endif /* ZEND_API_H */
1243 
1244 
1245 /*
1246  * Local variables:
1247  * tab-width: 4
1248  * c-basic-offset: 4
1249  * indent-tabs-mode: t
1250  * End:
1251  */

/* [<][>][^][v][top][bottom][index][help] */