Annotation of embedaddon/php/Zend/zend.h, revision 1.1
1.1 ! misho 1: /*
! 2: +----------------------------------------------------------------------+
! 3: | Zend Engine |
! 4: +----------------------------------------------------------------------+
! 5: | Copyright (c) 1998-2012 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: +----------------------------------------------------------------------+
! 18: */
! 19:
! 20: /* $Id: zend.h 321634 2012-01-01 13:15:04Z felipe $ */
! 21:
! 22: #ifndef ZEND_H
! 23: #define ZEND_H
! 24:
! 25: #define ZEND_VERSION "2.3.0"
! 26:
! 27: #define ZEND_ENGINE_2
! 28:
! 29: #ifdef __cplusplus
! 30: #define BEGIN_EXTERN_C() extern "C" {
! 31: #define END_EXTERN_C() }
! 32: #else
! 33: #define BEGIN_EXTERN_C()
! 34: #define END_EXTERN_C()
! 35: #endif
! 36:
! 37: /*
! 38: * general definitions
! 39: */
! 40:
! 41: #ifdef ZEND_WIN32
! 42: # include "zend_config.w32.h"
! 43: # define ZEND_PATHS_SEPARATOR ';'
! 44: #elif defined(NETWARE)
! 45: # include <zend_config.h>
! 46: # define ZEND_PATHS_SEPARATOR ';'
! 47: #elif defined(__riscos__)
! 48: # include <zend_config.h>
! 49: # define ZEND_PATHS_SEPARATOR ';'
! 50: #else
! 51: # include <zend_config.h>
! 52: # define ZEND_PATHS_SEPARATOR ':'
! 53: #endif
! 54:
! 55: #ifdef ZEND_WIN32
! 56: /* Only use this macro if you know for sure that all of the switches values
! 57: are covered by its case statements */
! 58: #define EMPTY_SWITCH_DEFAULT_CASE() \
! 59: default: \
! 60: __assume(0); \
! 61: break;
! 62: #else
! 63: #define EMPTY_SWITCH_DEFAULT_CASE()
! 64: #endif
! 65:
! 66: /* all HAVE_XXX test have to be after the include of zend_config above */
! 67:
! 68: #include <stdio.h>
! 69:
! 70: #ifdef HAVE_UNIX_H
! 71: # include <unix.h>
! 72: #endif
! 73:
! 74: #ifdef HAVE_STDARG_H
! 75: # include <stdarg.h>
! 76: #endif
! 77:
! 78: #ifdef HAVE_DLFCN_H
! 79: # include <dlfcn.h>
! 80: #endif
! 81:
! 82: #if defined(HAVE_LIBDL) && !defined(ZEND_WIN32)
! 83:
! 84: # ifndef RTLD_LAZY
! 85: # define RTLD_LAZY 1 /* Solaris 1, FreeBSD's (2.1.7.1 and older) */
! 86: # endif
! 87:
! 88: # ifndef RTLD_GLOBAL
! 89: # define RTLD_GLOBAL 0
! 90: # endif
! 91:
! 92: # if defined(RTLD_GROUP) && defined(RTLD_WORLD) && defined(RTLD_PARENT)
! 93: # define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_GROUP | RTLD_WORLD | RTLD_PARENT)
! 94: # elif defined(RTLD_DEEPBIND)
! 95: # define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL | RTLD_DEEPBIND)
! 96: # else
! 97: # define DL_LOAD(libname) dlopen(libname, RTLD_LAZY | RTLD_GLOBAL)
! 98: # endif
! 99: # define DL_UNLOAD dlclose
! 100: # if defined(DLSYM_NEEDS_UNDERSCORE)
! 101: # define DL_FETCH_SYMBOL(h,s) dlsym((h), "_" s)
! 102: # else
! 103: # define DL_FETCH_SYMBOL dlsym
! 104: # endif
! 105: # define DL_ERROR dlerror
! 106: # define DL_HANDLE void *
! 107: # define ZEND_EXTENSIONS_SUPPORT 1
! 108: #elif defined(ZEND_WIN32)
! 109: # define DL_LOAD(libname) LoadLibrary(libname)
! 110: # define DL_FETCH_SYMBOL GetProcAddress
! 111: # define DL_UNLOAD FreeLibrary
! 112: # define DL_HANDLE HMODULE
! 113: # define ZEND_EXTENSIONS_SUPPORT 1
! 114: #else
! 115: # define DL_HANDLE void *
! 116: # define ZEND_EXTENSIONS_SUPPORT 0
! 117: #endif
! 118:
! 119: #if HAVE_ALLOCA_H && !defined(_ALLOCA_H)
! 120: # include <alloca.h>
! 121: #endif
! 122:
! 123: /* AIX requires this to be the first thing in the file. */
! 124: #ifndef __GNUC__
! 125: # ifndef HAVE_ALLOCA_H
! 126: # ifdef _AIX
! 127: #pragma alloca
! 128: # else
! 129: # ifndef alloca /* predefined by HP cc +Olibcalls */
! 130: char *alloca ();
! 131: # endif
! 132: # endif
! 133: # endif
! 134: #endif
! 135:
! 136: /* GCC x.y.z supplies __GNUC__ = x and __GNUC_MINOR__ = y */
! 137: #ifdef __GNUC__
! 138: # define ZEND_GCC_VERSION (__GNUC__ * 1000 + __GNUC_MINOR__)
! 139: #else
! 140: # define ZEND_GCC_VERSION 0
! 141: #endif
! 142:
! 143: #if ZEND_GCC_VERSION >= 2096
! 144: # define ZEND_ATTRIBUTE_MALLOC __attribute__ ((__malloc__))
! 145: #else
! 146: # define ZEND_ATTRIBUTE_MALLOC
! 147: #endif
! 148:
! 149: #if ZEND_GCC_VERSION >= 2007
! 150: # define ZEND_ATTRIBUTE_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
! 151: #else
! 152: # define ZEND_ATTRIBUTE_FORMAT(type, idx, first)
! 153: #endif
! 154:
! 155: #if ZEND_GCC_VERSION >= 3001 && !defined(__INTEL_COMPILER)
! 156: # define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first) __attribute__ ((format(type, idx, first)))
! 157: #else
! 158: # define ZEND_ATTRIBUTE_PTR_FORMAT(type, idx, first)
! 159: #endif
! 160:
! 161: #if ZEND_GCC_VERSION >= 3001
! 162: # define ZEND_ATTRIBUTE_DEPRECATED __attribute__((deprecated))
! 163: #elif defined(ZEND_WIN32) && defined(_MSC_VER) && _MSC_VER >= 1300
! 164: # define ZEND_ATTRIBUTE_DEPRECATED __declspec(deprecated)
! 165: #else
! 166: # define ZEND_ATTRIBUTE_DEPRECATED
! 167: #endif
! 168:
! 169: #if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004 && defined(__i386__)
! 170: # define ZEND_FASTCALL __attribute__((fastcall))
! 171: #elif defined(_MSC_VER) && defined(_M_IX86)
! 172: # define ZEND_FASTCALL __fastcall
! 173: #else
! 174: # define ZEND_FASTCALL
! 175: #endif
! 176:
! 177: #if defined(__GNUC__) && ZEND_GCC_VERSION >= 3004
! 178: #else
! 179: # define __restrict__
! 180: #endif
! 181: #define restrict __restrict__
! 182:
! 183: #if (HAVE_ALLOCA || (defined (__GNUC__) && __GNUC__ >= 2)) && !(defined(ZTS) && defined(ZEND_WIN32)) && !(defined(ZTS) && defined(NETWARE)) && !(defined(ZTS) && defined(HPUX)) && !defined(DARWIN) && !(defined(ZTS) && defined(__FreeBSD__))
! 184: # define ZEND_ALLOCA_MAX_SIZE (32 * 1024)
! 185: # define ALLOCA_FLAG(name) \
! 186: zend_bool name;
! 187: # define SET_ALLOCA_FLAG(name) \
! 188: name = 1
! 189: # define do_alloca_ex(size, limit, use_heap) \
! 190: ((use_heap = (UNEXPECTED((size) > (limit)))) ? emalloc(size) : alloca(size))
! 191: # define do_alloca(size, use_heap) \
! 192: do_alloca_ex(size, ZEND_ALLOCA_MAX_SIZE, use_heap)
! 193: # define free_alloca(p, use_heap) \
! 194: do { if (UNEXPECTED(use_heap)) efree(p); } while (0)
! 195: #else
! 196: # define ALLOCA_FLAG(name)
! 197: # define SET_ALLOCA_FLAG(name)
! 198: # define do_alloca(p, use_heap) emalloc(p)
! 199: # define free_alloca(p, use_heap) efree(p)
! 200: #endif
! 201:
! 202: #if ZEND_DEBUG
! 203: #define ZEND_FILE_LINE_D char *__zend_filename, uint __zend_lineno
! 204: #define ZEND_FILE_LINE_DC , ZEND_FILE_LINE_D
! 205: #define ZEND_FILE_LINE_ORIG_D char *__zend_orig_filename, uint __zend_orig_lineno
! 206: #define ZEND_FILE_LINE_ORIG_DC , ZEND_FILE_LINE_ORIG_D
! 207: #define ZEND_FILE_LINE_RELAY_C __zend_filename, __zend_lineno
! 208: #define ZEND_FILE_LINE_RELAY_CC , ZEND_FILE_LINE_RELAY_C
! 209: #define ZEND_FILE_LINE_C __FILE__, __LINE__
! 210: #define ZEND_FILE_LINE_CC , ZEND_FILE_LINE_C
! 211: #define ZEND_FILE_LINE_EMPTY_C NULL, 0
! 212: #define ZEND_FILE_LINE_EMPTY_CC , ZEND_FILE_LINE_EMPTY_C
! 213: #define ZEND_FILE_LINE_ORIG_RELAY_C __zend_orig_filename, __zend_orig_lineno
! 214: #define ZEND_FILE_LINE_ORIG_RELAY_CC , ZEND_FILE_LINE_ORIG_RELAY_C
! 215: #else
! 216: #define ZEND_FILE_LINE_D
! 217: #define ZEND_FILE_LINE_DC
! 218: #define ZEND_FILE_LINE_ORIG_D
! 219: #define ZEND_FILE_LINE_ORIG_DC
! 220: #define ZEND_FILE_LINE_RELAY_C
! 221: #define ZEND_FILE_LINE_RELAY_CC
! 222: #define ZEND_FILE_LINE_C
! 223: #define ZEND_FILE_LINE_CC
! 224: #define ZEND_FILE_LINE_EMPTY_C
! 225: #define ZEND_FILE_LINE_EMPTY_CC
! 226: #define ZEND_FILE_LINE_ORIG_RELAY_C
! 227: #define ZEND_FILE_LINE_ORIG_RELAY_CC
! 228: #endif /* ZEND_DEBUG */
! 229:
! 230: #ifdef ZTS
! 231: #define ZTS_V 1
! 232: #else
! 233: #define ZTS_V 0
! 234: #endif
! 235:
! 236: #include "zend_errors.h"
! 237: #include "zend_alloc.h"
! 238:
! 239: #include "zend_types.h"
! 240:
! 241: #ifdef HAVE_LIMITS_H
! 242: # include <limits.h>
! 243: #endif
! 244:
! 245: #ifndef LONG_MAX
! 246: #define LONG_MAX 2147483647L
! 247: #endif
! 248:
! 249: #ifndef LONG_MIN
! 250: #define LONG_MIN (- LONG_MAX - 1)
! 251: #endif
! 252:
! 253: #if SIZEOF_LONG == 4
! 254: #define MAX_LENGTH_OF_LONG 11
! 255: static const char long_min_digits[] = "2147483648";
! 256: #elif SIZEOF_LONG == 8
! 257: #define MAX_LENGTH_OF_LONG 20
! 258: static const char long_min_digits[] = "9223372036854775808";
! 259: #else
! 260: #error "Unknown SIZEOF_LONG"
! 261: #endif
! 262:
! 263: #define MAX_LENGTH_OF_DOUBLE 32
! 264:
! 265: #undef SUCCESS
! 266: #undef FAILURE
! 267: #define SUCCESS 0
! 268: #define FAILURE -1 /* this MUST stay a negative number, or it may affect functions! */
! 269:
! 270: #include "zend_hash.h"
! 271: #include "zend_ts_hash.h"
! 272: #include "zend_llist.h"
! 273:
! 274: #define INTERNAL_FUNCTION_PARAMETERS int ht, zval *return_value, zval **return_value_ptr, zval *this_ptr, int return_value_used TSRMLS_DC
! 275: #define INTERNAL_FUNCTION_PARAM_PASSTHRU ht, return_value, return_value_ptr, this_ptr, return_value_used TSRMLS_CC
! 276:
! 277: #if defined(__GNUC__) && __GNUC__ >= 3 && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX) && !defined(__osf__)
! 278: void zend_error_noreturn(int type, const char *format, ...) __attribute__ ((noreturn));
! 279: #else
! 280: # define zend_error_noreturn zend_error
! 281: #endif
! 282:
! 283: /*
! 284: * zval
! 285: */
! 286: typedef struct _zval_struct zval;
! 287: typedef struct _zend_class_entry zend_class_entry;
! 288:
! 289: typedef struct _zend_guard {
! 290: zend_bool in_get;
! 291: zend_bool in_set;
! 292: zend_bool in_unset;
! 293: zend_bool in_isset;
! 294: zend_bool dummy; /* sizeof(zend_guard) must not be equal to sizeof(void*) */
! 295: } zend_guard;
! 296:
! 297: typedef struct _zend_object {
! 298: zend_class_entry *ce;
! 299: HashTable *properties;
! 300: HashTable *guards; /* protects from __get/__set ... recursion */
! 301: } zend_object;
! 302:
! 303: #include "zend_object_handlers.h"
! 304:
! 305: typedef union _zvalue_value {
! 306: long lval; /* long value */
! 307: double dval; /* double value */
! 308: struct {
! 309: char *val;
! 310: int len;
! 311: } str;
! 312: HashTable *ht; /* hash table value */
! 313: zend_object_value obj;
! 314: } zvalue_value;
! 315:
! 316: struct _zval_struct {
! 317: /* Variable information */
! 318: zvalue_value value; /* value */
! 319: zend_uint refcount__gc;
! 320: zend_uchar type; /* active type */
! 321: zend_uchar is_ref__gc;
! 322: };
! 323:
! 324: #define Z_REFCOUNT_PP(ppz) Z_REFCOUNT_P(*(ppz))
! 325: #define Z_SET_REFCOUNT_PP(ppz, rc) Z_SET_REFCOUNT_P(*(ppz), rc)
! 326: #define Z_ADDREF_PP(ppz) Z_ADDREF_P(*(ppz))
! 327: #define Z_DELREF_PP(ppz) Z_DELREF_P(*(ppz))
! 328: #define Z_ISREF_PP(ppz) Z_ISREF_P(*(ppz))
! 329: #define Z_SET_ISREF_PP(ppz) Z_SET_ISREF_P(*(ppz))
! 330: #define Z_UNSET_ISREF_PP(ppz) Z_UNSET_ISREF_P(*(ppz))
! 331: #define Z_SET_ISREF_TO_PP(ppz, isref) Z_SET_ISREF_TO_P(*(ppz), isref)
! 332:
! 333: #define Z_REFCOUNT_P(pz) zval_refcount_p(pz)
! 334: #define Z_SET_REFCOUNT_P(pz, rc) zval_set_refcount_p(pz, rc)
! 335: #define Z_ADDREF_P(pz) zval_addref_p(pz)
! 336: #define Z_DELREF_P(pz) zval_delref_p(pz)
! 337: #define Z_ISREF_P(pz) zval_isref_p(pz)
! 338: #define Z_SET_ISREF_P(pz) zval_set_isref_p(pz)
! 339: #define Z_UNSET_ISREF_P(pz) zval_unset_isref_p(pz)
! 340: #define Z_SET_ISREF_TO_P(pz, isref) zval_set_isref_to_p(pz, isref)
! 341:
! 342: #define Z_REFCOUNT(z) Z_REFCOUNT_P(&(z))
! 343: #define Z_SET_REFCOUNT(z, rc) Z_SET_REFCOUNT_P(&(z), rc)
! 344: #define Z_ADDREF(z) Z_ADDREF_P(&(z))
! 345: #define Z_DELREF(z) Z_DELREF_P(&(z))
! 346: #define Z_ISREF(z) Z_ISREF_P(&(z))
! 347: #define Z_SET_ISREF(z) Z_SET_ISREF_P(&(z))
! 348: #define Z_UNSET_ISREF(z) Z_UNSET_ISREF_P(&(z))
! 349: #define Z_SET_ISREF_TO(z, isref) Z_SET_ISREF_TO_P(&(z), isref)
! 350:
! 351: #if defined(__GNUC__)
! 352: #if __GNUC__ >= 3
! 353: #define zend_always_inline inline __attribute__((always_inline))
! 354: #else
! 355: #define zend_always_inline inline
! 356: #endif
! 357:
! 358: #elif defined(_MSC_VER)
! 359: #define zend_always_inline __forceinline
! 360: #else
! 361: #define zend_always_inline inline
! 362: #endif
! 363:
! 364: #if (defined (__GNUC__) && __GNUC__ > 2 ) && !defined(__INTEL_COMPILER) && !defined(DARWIN) && !defined(__hpux) && !defined(_AIX)
! 365: # define EXPECTED(condition) __builtin_expect(condition, 1)
! 366: # define UNEXPECTED(condition) __builtin_expect(condition, 0)
! 367: #else
! 368: # define EXPECTED(condition) (condition)
! 369: # define UNEXPECTED(condition) (condition)
! 370: #endif
! 371:
! 372: static zend_always_inline zend_uint zval_refcount_p(zval* pz) {
! 373: return pz->refcount__gc;
! 374: }
! 375:
! 376: static zend_always_inline zend_uint zval_set_refcount_p(zval* pz, zend_uint rc) {
! 377: return pz->refcount__gc = rc;
! 378: }
! 379:
! 380: static zend_always_inline zend_uint zval_addref_p(zval* pz) {
! 381: return ++pz->refcount__gc;
! 382: }
! 383:
! 384: static zend_always_inline zend_uint zval_delref_p(zval* pz) {
! 385: return --pz->refcount__gc;
! 386: }
! 387:
! 388: static zend_always_inline zend_bool zval_isref_p(zval* pz) {
! 389: return pz->is_ref__gc;
! 390: }
! 391:
! 392: static zend_always_inline zend_bool zval_set_isref_p(zval* pz) {
! 393: return pz->is_ref__gc = 1;
! 394: }
! 395:
! 396: static zend_always_inline zend_bool zval_unset_isref_p(zval* pz) {
! 397: return pz->is_ref__gc = 0;
! 398: }
! 399:
! 400: static zend_always_inline zend_bool zval_set_isref_to_p(zval* pz, zend_bool isref) {
! 401: return pz->is_ref__gc = isref;
! 402: }
! 403:
! 404: /* excpt.h on Digital Unix 4.0 defines function_table */
! 405: #undef function_table
! 406:
! 407: /* A lot of stuff needs shifiting around in order to include zend_compile.h here */
! 408: union _zend_function;
! 409:
! 410: #include "zend_iterators.h"
! 411:
! 412: struct _zend_serialize_data;
! 413: struct _zend_unserialize_data;
! 414:
! 415: typedef struct _zend_serialize_data zend_serialize_data;
! 416: typedef struct _zend_unserialize_data zend_unserialize_data;
! 417:
! 418: struct _zend_class_entry {
! 419: char type;
! 420: char *name;
! 421: zend_uint name_length;
! 422: struct _zend_class_entry *parent;
! 423: int refcount;
! 424: zend_bool constants_updated;
! 425: zend_uint ce_flags;
! 426:
! 427: HashTable function_table;
! 428: HashTable default_properties;
! 429: HashTable properties_info;
! 430: HashTable default_static_members;
! 431: HashTable *static_members;
! 432: HashTable constants_table;
! 433: const struct _zend_function_entry *builtin_functions;
! 434:
! 435: union _zend_function *constructor;
! 436: union _zend_function *destructor;
! 437: union _zend_function *clone;
! 438: union _zend_function *__get;
! 439: union _zend_function *__set;
! 440: union _zend_function *__unset;
! 441: union _zend_function *__isset;
! 442: union _zend_function *__call;
! 443: union _zend_function *__callstatic;
! 444: union _zend_function *__tostring;
! 445: union _zend_function *serialize_func;
! 446: union _zend_function *unserialize_func;
! 447:
! 448: zend_class_iterator_funcs iterator_funcs;
! 449:
! 450: /* handlers */
! 451: zend_object_value (*create_object)(zend_class_entry *class_type TSRMLS_DC);
! 452: zend_object_iterator *(*get_iterator)(zend_class_entry *ce, zval *object, int by_ref TSRMLS_DC);
! 453: int (*interface_gets_implemented)(zend_class_entry *iface, zend_class_entry *class_type TSRMLS_DC); /* a class implements this interface */
! 454: union _zend_function *(*get_static_method)(zend_class_entry *ce, char* method, int method_len TSRMLS_DC);
! 455:
! 456: /* serializer callbacks */
! 457: int (*serialize)(zval *object, unsigned char **buffer, zend_uint *buf_len, zend_serialize_data *data TSRMLS_DC);
! 458: int (*unserialize)(zval **object, zend_class_entry *ce, const unsigned char *buf, zend_uint buf_len, zend_unserialize_data *data TSRMLS_DC);
! 459:
! 460: zend_class_entry **interfaces;
! 461: zend_uint num_interfaces;
! 462:
! 463: char *filename;
! 464: zend_uint line_start;
! 465: zend_uint line_end;
! 466: char *doc_comment;
! 467: zend_uint doc_comment_len;
! 468:
! 469: struct _zend_module_entry *module;
! 470: };
! 471:
! 472: #include "zend_stream.h"
! 473: typedef struct _zend_utility_functions {
! 474: void (*error_function)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 4, 0);
! 475: int (*printf_function)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2);
! 476: int (*write_function)(const char *str, uint str_length);
! 477: FILE *(*fopen_function)(const char *filename, char **opened_path TSRMLS_DC);
! 478: void (*message_handler)(long message, void *data TSRMLS_DC);
! 479: void (*block_interruptions)(void);
! 480: void (*unblock_interruptions)(void);
! 481: int (*get_configuration_directive)(const char *name, uint name_length, zval *contents);
! 482: void (*ticks_function)(int ticks);
! 483: void (*on_timeout)(int seconds TSRMLS_DC);
! 484: int (*stream_open_function)(const char *filename, zend_file_handle *handle TSRMLS_DC);
! 485: int (*vspprintf_function)(char **pbuf, size_t max_len, const char *format, va_list ap);
! 486: char *(*getenv_function)(char *name, size_t name_len TSRMLS_DC);
! 487: char *(*resolve_path_function)(const char *filename, int filename_len TSRMLS_DC);
! 488: } zend_utility_functions;
! 489:
! 490: typedef struct _zend_utility_values {
! 491: char *import_use_extension;
! 492: uint import_use_extension_length;
! 493: zend_bool html_errors;
! 494: } zend_utility_values;
! 495:
! 496: typedef int (*zend_write_func_t)(const char *str, uint str_length);
! 497:
! 498: #undef MIN
! 499: #undef MAX
! 500: #define MAX(a, b) (((a)>(b))?(a):(b))
! 501: #define MIN(a, b) (((a)<(b))?(a):(b))
! 502: #define ZEND_STRL(str) (str), (sizeof(str)-1)
! 503: #define ZEND_STRS(str) (str), (sizeof(str))
! 504: #define ZEND_NORMALIZE_BOOL(n) \
! 505: ((n) ? (((n)>0) ? 1 : -1) : 0)
! 506: #define ZEND_TRUTH(x) ((x) ? 1 : 0)
! 507: #define ZEND_LOG_XOR(a, b) (ZEND_TRUTH(a) ^ ZEND_TRUTH(b))
! 508:
! 509: /* data types */
! 510: /* All data types <= IS_BOOL have their constructor/destructors skipped */
! 511: #define IS_NULL 0
! 512: #define IS_LONG 1
! 513: #define IS_DOUBLE 2
! 514: #define IS_BOOL 3
! 515: #define IS_ARRAY 4
! 516: #define IS_OBJECT 5
! 517: #define IS_STRING 6
! 518: #define IS_RESOURCE 7
! 519: #define IS_CONSTANT 8
! 520: #define IS_CONSTANT_ARRAY 9
! 521:
! 522: /* Ugly hack to support constants as static array indices */
! 523: #define IS_CONSTANT_TYPE_MASK 0x0f
! 524: #define IS_CONSTANT_UNQUALIFIED 0x10
! 525: #define IS_CONSTANT_INDEX 0x80
! 526: #define IS_LEXICAL_VAR 0x20
! 527: #define IS_LEXICAL_REF 0x40
! 528:
! 529: /* overloaded elements data types */
! 530: #define OE_IS_ARRAY (1<<0)
! 531: #define OE_IS_OBJECT (1<<1)
! 532: #define OE_IS_METHOD (1<<2)
! 533:
! 534: int zend_startup(zend_utility_functions *utility_functions, char **extensions TSRMLS_DC);
! 535: void zend_shutdown(TSRMLS_D);
! 536: void zend_register_standard_ini_entries(TSRMLS_D);
! 537: void zend_post_startup(TSRMLS_D);
! 538: void zend_set_utility_values(zend_utility_values *utility_values);
! 539:
! 540: BEGIN_EXTERN_C()
! 541: ZEND_API void _zend_bailout(char *filename, uint lineno);
! 542: END_EXTERN_C()
! 543:
! 544: #define zend_bailout() _zend_bailout(__FILE__, __LINE__)
! 545:
! 546: #ifdef HAVE_SIGSETJMP
! 547: # define SETJMP(a) sigsetjmp(a, 0)
! 548: # define LONGJMP(a,b) siglongjmp(a, b)
! 549: # define JMP_BUF sigjmp_buf
! 550: #else
! 551: # define SETJMP(a) setjmp(a)
! 552: # define LONGJMP(a,b) longjmp(a, b)
! 553: # define JMP_BUF jmp_buf
! 554: #endif
! 555:
! 556: #define zend_try \
! 557: { \
! 558: JMP_BUF *__orig_bailout = EG(bailout); \
! 559: JMP_BUF __bailout; \
! 560: \
! 561: EG(bailout) = &__bailout; \
! 562: if (SETJMP(__bailout)==0) {
! 563: #define zend_catch \
! 564: } else { \
! 565: EG(bailout) = __orig_bailout;
! 566: #define zend_end_try() \
! 567: } \
! 568: EG(bailout) = __orig_bailout; \
! 569: }
! 570: #define zend_first_try EG(bailout)=NULL; zend_try
! 571:
! 572: BEGIN_EXTERN_C()
! 573: ZEND_API char *get_zend_version(void);
! 574: ZEND_API void zend_make_printable_zval(zval *expr, zval *expr_copy, int *use_copy);
! 575: ZEND_API int zend_print_zval(zval *expr, int indent);
! 576: ZEND_API int zend_print_zval_ex(zend_write_func_t write_func, zval *expr, int indent);
! 577: ZEND_API void zend_print_zval_r(zval *expr, int indent TSRMLS_DC);
! 578: ZEND_API void zend_print_flat_zval_r(zval *expr TSRMLS_DC);
! 579: ZEND_API void zend_print_zval_r_ex(zend_write_func_t write_func, zval *expr, int indent TSRMLS_DC);
! 580: ZEND_API void zend_output_debug_string(zend_bool trigger_break, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
! 581: END_EXTERN_C()
! 582:
! 583: void zend_activate(TSRMLS_D);
! 584: void zend_deactivate(TSRMLS_D);
! 585: void zend_call_destructors(TSRMLS_D);
! 586: void zend_activate_modules(TSRMLS_D);
! 587: void zend_deactivate_modules(TSRMLS_D);
! 588: void zend_post_deactivate_modules(TSRMLS_D);
! 589:
! 590: #if ZEND_DEBUG
! 591: #define Z_DBG(expr) (expr)
! 592: #else
! 593: #define Z_DBG(expr)
! 594: #endif
! 595:
! 596: BEGIN_EXTERN_C()
! 597: ZEND_API void free_estring(char **str_p);
! 598: END_EXTERN_C()
! 599:
! 600: /* FIXME: Check if we can save if (ptr) too */
! 601:
! 602: #define STR_FREE(ptr) if (ptr) { efree(ptr); }
! 603: #define STR_FREE_REL(ptr) if (ptr) { efree_rel(ptr); }
! 604:
! 605: #define STR_EMPTY_ALLOC() estrndup("", sizeof("")-1)
! 606:
! 607: #define STR_REALLOC(ptr, size) \
! 608: ptr = (char *) erealloc(ptr, size);
! 609:
! 610: /* output support */
! 611: #define ZEND_WRITE(str, str_len) zend_write((str), (str_len))
! 612: #define ZEND_WRITE_EX(str, str_len) write_func((str), (str_len))
! 613: #define ZEND_PUTS(str) zend_write((str), strlen((str)))
! 614: #define ZEND_PUTS_EX(str) write_func((str), strlen((str)))
! 615: #define ZEND_PUTC(c) zend_write(&(c), 1), (c)
! 616:
! 617: BEGIN_EXTERN_C()
! 618: extern ZEND_API int (*zend_printf)(const char *format, ...) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 1, 2);
! 619: extern ZEND_API zend_write_func_t zend_write;
! 620: extern ZEND_API FILE *(*zend_fopen)(const char *filename, char **opened_path TSRMLS_DC);
! 621: extern ZEND_API void (*zend_block_interruptions)(void);
! 622: extern ZEND_API void (*zend_unblock_interruptions)(void);
! 623: extern ZEND_API void (*zend_ticks_function)(int ticks);
! 624: extern ZEND_API void (*zend_error_cb)(int type, const char *error_filename, const uint error_lineno, const char *format, va_list args) ZEND_ATTRIBUTE_PTR_FORMAT(printf, 4, 0);
! 625: extern void (*zend_on_timeout)(int seconds TSRMLS_DC);
! 626: extern ZEND_API int (*zend_stream_open_function)(const char *filename, zend_file_handle *handle TSRMLS_DC);
! 627: extern int (*zend_vspprintf)(char **pbuf, size_t max_len, const char *format, va_list ap);
! 628: extern ZEND_API char *(*zend_getenv)(char *name, size_t name_len TSRMLS_DC);
! 629: extern ZEND_API char *(*zend_resolve_path)(const char *filename, int filename_len TSRMLS_DC);
! 630: #if SUHOSIN_PATCH
! 631: extern ZEND_API void (*zend_suhosin_log)(int loglevel, char *fmt, ...);
! 632: #endif
! 633:
! 634: ZEND_API void zend_error(int type, const char *format, ...) ZEND_ATTRIBUTE_FORMAT(printf, 2, 3);
! 635:
! 636: void zenderror(const char *error);
! 637:
! 638: /* The following #define is used for code duality in PHP for Engine 1 & 2 */
! 639: #define ZEND_STANDARD_CLASS_DEF_PTR zend_standard_class_def
! 640: extern ZEND_API zend_class_entry *zend_standard_class_def;
! 641: extern ZEND_API zend_utility_values zend_uv;
! 642: extern ZEND_API zval zval_used_for_init;
! 643:
! 644: END_EXTERN_C()
! 645:
! 646: #define ZEND_UV(name) (zend_uv.name)
! 647:
! 648: #define HANDLE_BLOCK_INTERRUPTIONS() if (zend_block_interruptions) { zend_block_interruptions(); }
! 649: #define HANDLE_UNBLOCK_INTERRUPTIONS() if (zend_unblock_interruptions) { zend_unblock_interruptions(); }
! 650:
! 651: BEGIN_EXTERN_C()
! 652: ZEND_API void zend_message_dispatcher(long message, void *data TSRMLS_DC);
! 653:
! 654: ZEND_API int zend_get_configuration_directive(const char *name, uint name_length, zval *contents);
! 655: END_EXTERN_C()
! 656:
! 657: /* Messages for applications of Zend */
! 658: #define ZMSG_FAILED_INCLUDE_FOPEN 1L
! 659: #define ZMSG_FAILED_REQUIRE_FOPEN 2L
! 660: #define ZMSG_FAILED_HIGHLIGHT_FOPEN 3L
! 661: #define ZMSG_MEMORY_LEAK_DETECTED 4L
! 662: #define ZMSG_MEMORY_LEAK_REPEATED 5L
! 663: #define ZMSG_LOG_SCRIPT_NAME 6L
! 664: #define ZMSG_MEMORY_LEAKS_GRAND_TOTAL 7L
! 665:
! 666: #define INIT_PZVAL(z) \
! 667: (z)->refcount__gc = 1; \
! 668: (z)->is_ref__gc = 0;
! 669:
! 670: #define INIT_ZVAL(z) z = zval_used_for_init;
! 671:
! 672: #define ALLOC_INIT_ZVAL(zp) \
! 673: ALLOC_ZVAL(zp); \
! 674: INIT_ZVAL(*zp);
! 675:
! 676: #define MAKE_STD_ZVAL(zv) \
! 677: ALLOC_ZVAL(zv); \
! 678: INIT_PZVAL(zv);
! 679:
! 680: #define PZVAL_IS_REF(z) Z_ISREF_P(z)
! 681:
! 682: #define SEPARATE_ZVAL(ppzv) \
! 683: { \
! 684: zval *orig_ptr = *(ppzv); \
! 685: \
! 686: if (Z_REFCOUNT_P(orig_ptr) > 1) { \
! 687: Z_DELREF_P(orig_ptr); \
! 688: ALLOC_ZVAL(*(ppzv)); \
! 689: **(ppzv) = *orig_ptr; \
! 690: zval_copy_ctor(*(ppzv)); \
! 691: Z_SET_REFCOUNT_PP(ppzv, 1); \
! 692: Z_UNSET_ISREF_PP((ppzv)); \
! 693: } \
! 694: }
! 695:
! 696: #define SEPARATE_ZVAL_IF_NOT_REF(ppzv) \
! 697: if (!PZVAL_IS_REF(*ppzv)) { \
! 698: SEPARATE_ZVAL(ppzv); \
! 699: }
! 700:
! 701: #define SEPARATE_ZVAL_TO_MAKE_IS_REF(ppzv) \
! 702: if (!PZVAL_IS_REF(*ppzv)) { \
! 703: SEPARATE_ZVAL(ppzv); \
! 704: Z_SET_ISREF_PP((ppzv)); \
! 705: }
! 706:
! 707: #define COPY_PZVAL_TO_ZVAL(zv, pzv) \
! 708: (zv) = *(pzv); \
! 709: if (Z_REFCOUNT_P(pzv)>1) { \
! 710: zval_copy_ctor(&(zv)); \
! 711: Z_DELREF_P((pzv)); \
! 712: } else { \
! 713: FREE_ZVAL(pzv); \
! 714: } \
! 715: INIT_PZVAL(&(zv));
! 716:
! 717: #define MAKE_COPY_ZVAL(ppzv, pzv) \
! 718: *(pzv) = **(ppzv); \
! 719: zval_copy_ctor((pzv)); \
! 720: INIT_PZVAL((pzv));
! 721:
! 722: #define REPLACE_ZVAL_VALUE(ppzv_dest, pzv_src, copy) { \
! 723: int is_ref, refcount; \
! 724: \
! 725: SEPARATE_ZVAL_IF_NOT_REF(ppzv_dest); \
! 726: is_ref = Z_ISREF_PP(ppzv_dest); \
! 727: refcount = Z_REFCOUNT_PP(ppzv_dest); \
! 728: zval_dtor(*ppzv_dest); \
! 729: **ppzv_dest = *pzv_src; \
! 730: if (copy) { \
! 731: zval_copy_ctor(*ppzv_dest); \
! 732: } \
! 733: Z_SET_ISREF_TO_PP(ppzv_dest, is_ref); \
! 734: Z_SET_REFCOUNT_PP(ppzv_dest, refcount); \
! 735: }
! 736:
! 737: #define SEPARATE_ARG_IF_REF(varptr) \
! 738: if (PZVAL_IS_REF(varptr)) { \
! 739: zval *original_var = varptr; \
! 740: ALLOC_ZVAL(varptr); \
! 741: varptr->value = original_var->value; \
! 742: Z_TYPE_P(varptr) = Z_TYPE_P(original_var); \
! 743: Z_UNSET_ISREF_P(varptr); \
! 744: Z_SET_REFCOUNT_P(varptr, 1); \
! 745: zval_copy_ctor(varptr); \
! 746: } else { \
! 747: Z_ADDREF_P(varptr); \
! 748: }
! 749:
! 750: #define READY_TO_DESTROY(zv) \
! 751: (Z_REFCOUNT_P(zv) == 1 && \
! 752: (Z_TYPE_P(zv) != IS_OBJECT || \
! 753: zend_objects_store_get_refcount(zv TSRMLS_CC) == 1))
! 754:
! 755: #define ZEND_MAX_RESERVED_RESOURCES 4
! 756:
! 757: #include "zend_gc.h"
! 758: #include "zend_operators.h"
! 759: #include "zend_variables.h"
! 760:
! 761: typedef enum {
! 762: EH_NORMAL = 0,
! 763: EH_SUPPRESS,
! 764: EH_THROW
! 765: } zend_error_handling_t;
! 766:
! 767: typedef struct {
! 768: zend_error_handling_t handling;
! 769: zend_class_entry *exception;
! 770: zval *user_handler;
! 771: } zend_error_handling;
! 772:
! 773: ZEND_API void zend_save_error_handling(zend_error_handling *current TSRMLS_DC);
! 774: ZEND_API void zend_replace_error_handling(zend_error_handling_t error_handling, zend_class_entry *exception_class, zend_error_handling *current TSRMLS_DC);
! 775: ZEND_API void zend_restore_error_handling(zend_error_handling *saved TSRMLS_DC);
! 776:
! 777: #define DEBUG_BACKTRACE_PROVIDE_OBJECT (1<<0)
! 778: #define DEBUG_BACKTRACE_IGNORE_ARGS (1<<1)
! 779:
! 780: #if SUHOSIN_PATCH
! 781: #include "suhosin_globals.h"
! 782: #include "suhosin_patch.h"
! 783: #include "php_syslog.h"
! 784:
! 785: ZEND_API void zend_canary(void *buf, int len);
! 786: ZEND_API char suhosin_get_config(int element);
! 787:
! 788: #endif
! 789:
! 790: #endif /* ZEND_H */
! 791:
! 792: /*
! 793: * Local variables:
! 794: * tab-width: 4
! 795: * c-basic-offset: 4
! 796: * indent-tabs-mode: t
! 797: * End:
! 798: */
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>