version 1.1.1.1, 2012/02/21 23:47:52
|
version 1.1.1.4, 2014/06/15 20:04:03
|
Line 2
|
Line 2
|
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Zend Engine | |
| Zend Engine | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| Copyright (c) 1998-2012 Zend Technologies Ltd. (http://www.zend.com) | | | Copyright (c) 1998-2014 Zend Technologies Ltd. (http://www.zend.com) | |
+----------------------------------------------------------------------+ |
+----------------------------------------------------------------------+ |
| This source file is subject to version 2.00 of the Zend license, | |
| This source file is subject to version 2.00 of the Zend license, | |
| that is bundled with this package in the file LICENSE, and is | |
| that is bundled with this package in the file LICENSE, and is | |
Line 34
|
Line 34
|
|
|
#define FREE_PNODE(znode) zval_dtor(&znode->u.constant); |
#define FREE_PNODE(znode) zval_dtor(&znode->u.constant); |
|
|
#define SET_UNUSED(op) (op).op_type = IS_UNUSED | #define SET_UNUSED(op) op ## _type = IS_UNUSED |
|
|
#define INC_BPC(op_array) if (op_array->fn_flags & ZEND_ACC_INTERACTIVE) { ((op_array)->backpatch_count++); } | #define INC_BPC(op_array) if (op_array->fn_flags & ZEND_ACC_INTERACTIVE) { (CG(context).backpatch_count++); } |
#define DEC_BPC(op_array) if (op_array->fn_flags & ZEND_ACC_INTERACTIVE) { ((op_array)->backpatch_count--); } | #define DEC_BPC(op_array) if (op_array->fn_flags & ZEND_ACC_INTERACTIVE) { (CG(context).backpatch_count--); } |
#define HANDLE_INTERACTIVE() if (CG(active_op_array)->fn_flags & ZEND_ACC_INTERACTIVE) { execute_new_code(TSRMLS_C); } |
#define HANDLE_INTERACTIVE() if (CG(active_op_array)->fn_flags & ZEND_ACC_INTERACTIVE) { execute_new_code(TSRMLS_C); } |
#define DO_TICKS() if (Z_LVAL(CG(declarables).ticks)) { zend_do_ticks(TSRMLS_C); } |
#define DO_TICKS() if (Z_LVAL(CG(declarables).ticks)) { zend_do_ticks(TSRMLS_C); } |
|
|
Line 53
|
Line 53
|
typedef struct _zend_op_array zend_op_array; |
typedef struct _zend_op_array zend_op_array; |
typedef struct _zend_op zend_op; |
typedef struct _zend_op zend_op; |
|
|
typedef struct _znode { | typedef struct _zend_compiler_context { |
| zend_uint opcodes_size; |
| int vars_size; |
| int literals_size; |
| int current_brk_cont; |
| int backpatch_count; |
| HashTable *labels; |
| } zend_compiler_context; |
| |
| typedef struct _zend_literal { |
| zval constant; |
| zend_ulong hash_value; |
| zend_uint cache_slot; |
| } zend_literal; |
| |
| #define Z_HASH_P(zv) \ |
| (((zend_literal*)(zv))->hash_value) |
| |
| typedef union _znode_op { |
| zend_uint constant; |
| zend_uint var; |
| zend_uint num; |
| zend_ulong hash; |
| zend_uint opline_num; /* Needs to be signed */ |
| zend_op *jmp_addr; |
| zval *zv; |
| zend_literal *literal; |
| void *ptr; /* Used for passing pointers from the compile to execution phase, currently used for traits */ |
| } znode_op; |
| |
| typedef struct _znode { /* used only during compilation */ |
int op_type; |
int op_type; |
union { |
union { |
zval constant; | znode_op op; |
| zval constant; /* replaced by literal/zv */ |
zend_uint var; | |
zend_uint opline_num; /* Needs to be signed */ | |
zend_op_array *op_array; |
zend_op_array *op_array; |
zend_op *jmp_addr; |
|
struct { |
|
zend_uint var; /* dummy */ |
|
zend_uint type; |
|
} EA; |
|
} u; |
} u; |
|
zend_uint EA; /* extended attributes */ |
} znode; |
} znode; |
|
|
typedef struct _zend_execute_data zend_execute_data; |
typedef struct _zend_execute_data zend_execute_data; |
Line 81 extern ZEND_API opcode_handler_t *zend_opcode_handlers
|
Line 105 extern ZEND_API opcode_handler_t *zend_opcode_handlers
|
|
|
struct _zend_op { |
struct _zend_op { |
opcode_handler_t handler; |
opcode_handler_t handler; |
znode result; | znode_op op1; |
znode op1; | znode_op op2; |
znode op2; | znode_op result; |
ulong extended_value; |
ulong extended_value; |
uint lineno; |
uint lineno; |
zend_uchar opcode; |
zend_uchar opcode; |
|
zend_uchar op1_type; |
|
zend_uchar op2_type; |
|
zend_uchar result_type; |
}; |
}; |
|
|
|
|
Line 107 typedef struct _zend_try_catch_element {
|
Line 134 typedef struct _zend_try_catch_element {
|
zend_uint catch_op; /* ketchup! */ |
zend_uint catch_op; /* ketchup! */ |
} zend_try_catch_element; |
} zend_try_catch_element; |
|
|
|
#if SIZEOF_LONG == 8 |
|
#define THIS_HASHVAL 210728972157UL |
|
#else |
|
#define THIS_HASHVAL 275574653UL |
|
#endif |
|
|
/* method flags (types) */ |
/* method flags (types) */ |
#define ZEND_ACC_STATIC 0x01 |
#define ZEND_ACC_STATIC 0x01 |
Line 121 typedef struct _zend_try_catch_element {
|
Line 153 typedef struct _zend_try_catch_element {
|
#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS 0x20 |
#define ZEND_ACC_EXPLICIT_ABSTRACT_CLASS 0x20 |
#define ZEND_ACC_FINAL_CLASS 0x40 |
#define ZEND_ACC_FINAL_CLASS 0x40 |
#define ZEND_ACC_INTERFACE 0x80 |
#define ZEND_ACC_INTERFACE 0x80 |
|
#define ZEND_ACC_TRAIT 0x120 |
|
|
/* op_array flags */ |
/* op_array flags */ |
#define ZEND_ACC_INTERACTIVE 0x10 |
#define ZEND_ACC_INTERACTIVE 0x10 |
Line 151 typedef struct _zend_try_catch_element {
|
Line 184 typedef struct _zend_try_catch_element {
|
|
|
/* class implement interface(s) flag */ |
/* class implement interface(s) flag */ |
#define ZEND_ACC_IMPLEMENT_INTERFACES 0x80000 |
#define ZEND_ACC_IMPLEMENT_INTERFACES 0x80000 |
|
#define ZEND_ACC_IMPLEMENT_TRAITS 0x400000 |
|
|
|
/* class constants updated */ |
|
#define ZEND_ACC_CONSTANTS_UPDATED 0x100000 |
|
|
|
/* user class has methods with static variables */ |
|
#define ZEND_HAS_STATIC_IN_METHODS 0x800000 |
|
|
|
|
#define ZEND_ACC_CLOSURE 0x100000 |
#define ZEND_ACC_CLOSURE 0x100000 |
|
|
/* function flag for internal user call handlers __call, __callstatic */ |
/* function flag for internal user call handlers __call, __callstatic */ |
#define ZEND_ACC_CALL_VIA_HANDLER 0x200000 |
#define ZEND_ACC_CALL_VIA_HANDLER 0x200000 |
|
|
|
/* disable inline caching */ |
|
#define ZEND_ACC_NEVER_CACHE 0x400000 |
|
|
|
#define ZEND_ACC_PASS_REST_BY_REFERENCE 0x1000000 |
|
#define ZEND_ACC_PASS_REST_PREFER_REF 0x2000000 |
|
|
|
#define ZEND_ACC_RETURN_REFERENCE 0x4000000 |
|
#define ZEND_ACC_DONE_PASS_TWO 0x8000000 |
|
|
char *zend_visibility_string(zend_uint fn_flags); |
char *zend_visibility_string(zend_uint fn_flags); |
|
|
|
|
typedef struct _zend_property_info { |
typedef struct _zend_property_info { |
zend_uint flags; |
zend_uint flags; |
char *name; | const char *name; |
int name_length; |
int name_length; |
ulong h; |
ulong h; |
char *doc_comment; | int offset; |
| const char *doc_comment; |
int doc_comment_len; |
int doc_comment_len; |
zend_class_entry *ce; |
zend_class_entry *ce; |
} zend_property_info; |
} zend_property_info; |
Line 176 typedef struct _zend_arg_info {
|
Line 227 typedef struct _zend_arg_info {
|
zend_uint name_len; |
zend_uint name_len; |
const char *class_name; |
const char *class_name; |
zend_uint class_name_len; |
zend_uint class_name_len; |
zend_bool array_type_hint; | zend_uchar type_hint; |
zend_bool allow_null; |
zend_bool allow_null; |
zend_bool pass_by_reference; |
zend_bool pass_by_reference; |
zend_bool return_reference; |
|
int required_num_args; |
|
} zend_arg_info; |
} zend_arg_info; |
|
|
|
/* the following structure repeats the layout of zend_arg_info, |
|
* but its fields have different meaning. It's used as the first element of |
|
* arg_info array to define properties of internal functions. |
|
*/ |
|
typedef struct _zend_internal_function_info { |
|
const char *_name; |
|
zend_uint _name_len; |
|
const char *_class_name; |
|
zend_uint required_num_args; |
|
zend_uchar _type_hint; |
|
zend_bool return_reference; |
|
zend_bool pass_rest_by_reference; |
|
} zend_internal_function_info; |
|
|
typedef struct _zend_compiled_variable { |
typedef struct _zend_compiled_variable { |
char *name; | const char *name; |
int name_len; |
int name_len; |
ulong hash_value; |
ulong hash_value; |
} zend_compiled_variable; |
} zend_compiled_variable; |
Line 192 typedef struct _zend_compiled_variable {
|
Line 255 typedef struct _zend_compiled_variable {
|
struct _zend_op_array { |
struct _zend_op_array { |
/* Common elements */ |
/* Common elements */ |
zend_uchar type; |
zend_uchar type; |
char *function_name; | const char *function_name; |
zend_class_entry *scope; |
zend_class_entry *scope; |
zend_uint fn_flags; |
zend_uint fn_flags; |
union _zend_function *prototype; |
union _zend_function *prototype; |
zend_uint num_args; |
zend_uint num_args; |
zend_uint required_num_args; |
zend_uint required_num_args; |
zend_arg_info *arg_info; |
zend_arg_info *arg_info; |
zend_bool pass_rest_by_reference; |
|
unsigned char return_reference; |
|
/* END of common elements */ |
/* END of common elements */ |
|
|
zend_bool done_pass_two; |
|
|
|
zend_uint *refcount; |
zend_uint *refcount; |
|
|
zend_op *opcodes; |
zend_op *opcodes; |
zend_uint last, size; | zend_uint last; |
|
|
zend_compiled_variable *vars; |
zend_compiled_variable *vars; |
int last_var, size_var; | int last_var; |
|
|
zend_uint T; |
zend_uint T; |
|
|
zend_brk_cont_element *brk_cont_array; |
zend_brk_cont_element *brk_cont_array; |
int last_brk_cont; |
int last_brk_cont; |
int current_brk_cont; |
|
|
|
zend_try_catch_element *try_catch_array; |
zend_try_catch_element *try_catch_array; |
int last_try_catch; |
int last_try_catch; |
Line 225 struct _zend_op_array {
|
Line 283 struct _zend_op_array {
|
/* static variables support */ |
/* static variables support */ |
HashTable *static_variables; |
HashTable *static_variables; |
|
|
zend_op *start_op; |
|
int backpatch_count; |
|
|
|
zend_uint this_var; |
zend_uint this_var; |
|
|
char *filename; | const char *filename; |
zend_uint line_start; |
zend_uint line_start; |
zend_uint line_end; |
zend_uint line_end; |
char *doc_comment; | const char *doc_comment; |
zend_uint doc_comment_len; |
zend_uint doc_comment_len; |
zend_uint early_binding; /* the linked list of delayed declarations */ |
zend_uint early_binding; /* the linked list of delayed declarations */ |
|
|
|
zend_literal *literals; |
|
int last_literal; |
|
|
|
void **run_time_cache; |
|
int last_cache_slot; |
|
|
void *reserved[ZEND_MAX_RESERVED_RESOURCES]; |
void *reserved[ZEND_MAX_RESERVED_RESOURCES]; |
}; |
}; |
|
|
Line 247 struct _zend_op_array {
|
Line 308 struct _zend_op_array {
|
typedef struct _zend_internal_function { |
typedef struct _zend_internal_function { |
/* Common elements */ |
/* Common elements */ |
zend_uchar type; |
zend_uchar type; |
char * function_name; | const char * function_name; |
zend_class_entry *scope; |
zend_class_entry *scope; |
zend_uint fn_flags; |
zend_uint fn_flags; |
union _zend_function *prototype; |
union _zend_function *prototype; |
zend_uint num_args; |
zend_uint num_args; |
zend_uint required_num_args; |
zend_uint required_num_args; |
zend_arg_info *arg_info; |
zend_arg_info *arg_info; |
zend_bool pass_rest_by_reference; |
|
unsigned char return_reference; |
|
/* END of common elements */ |
/* END of common elements */ |
|
|
void (*handler)(INTERNAL_FUNCTION_PARAMETERS); |
void (*handler)(INTERNAL_FUNCTION_PARAMETERS); |
Line 269 typedef union _zend_function {
|
Line 328 typedef union _zend_function {
|
|
|
struct { |
struct { |
zend_uchar type; /* never used */ |
zend_uchar type; /* never used */ |
char *function_name; | const char *function_name; |
zend_class_entry *scope; |
zend_class_entry *scope; |
zend_uint fn_flags; |
zend_uint fn_flags; |
union _zend_function *prototype; |
union _zend_function *prototype; |
zend_uint num_args; |
zend_uint num_args; |
zend_uint required_num_args; |
zend_uint required_num_args; |
zend_arg_info *arg_info; |
zend_arg_info *arg_info; |
zend_bool pass_rest_by_reference; |
|
unsigned char return_reference; |
|
} common; |
} common; |
|
|
zend_op_array op_array; |
zend_op_array op_array; |
Line 324 struct _zend_execute_data {
|
Line 381 struct _zend_execute_data {
|
zend_class_entry *current_called_scope; |
zend_class_entry *current_called_scope; |
zval *current_this; |
zval *current_this; |
zval *current_object; |
zval *current_object; |
struct _zend_op *call_opline; |
|
}; |
}; |
|
|
#define EX(element) execute_data.element |
#define EX(element) execute_data.element |
Line 336 struct _zend_execute_data {
|
Line 392 struct _zend_execute_data {
|
#define IS_UNUSED (1<<3) /* Unused variable */ |
#define IS_UNUSED (1<<3) /* Unused variable */ |
#define IS_CV (1<<4) /* Compiled variable */ |
#define IS_CV (1<<4) /* Compiled variable */ |
|
|
#define EXT_TYPE_UNUSED (1<<0) | #define EXT_TYPE_UNUSED (1<<5) |
#define EXT_TYPE_FREE_ON_RETURN (2<<0) | |
|
|
#include "zend_globals.h" |
#include "zend_globals.h" |
|
|
Line 346 BEGIN_EXTERN_C()
|
Line 401 BEGIN_EXTERN_C()
|
void init_compiler(TSRMLS_D); |
void init_compiler(TSRMLS_D); |
void shutdown_compiler(TSRMLS_D); |
void shutdown_compiler(TSRMLS_D); |
void zend_init_compiler_data_structures(TSRMLS_D); |
void zend_init_compiler_data_structures(TSRMLS_D); |
|
void zend_init_compiler_context(TSRMLS_D); |
|
|
extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); |
extern ZEND_API zend_op_array *(*zend_compile_file)(zend_file_handle *file_handle, int type TSRMLS_DC); |
extern ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename TSRMLS_DC); |
extern ZEND_API zend_op_array *(*zend_compile_string)(zval *source_string, char *filename TSRMLS_DC); |
Line 361 ZEND_API int zend_get_compiled_lineno(TSRMLS_D);
|
Line 417 ZEND_API int zend_get_compiled_lineno(TSRMLS_D);
|
ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); |
ZEND_API size_t zend_get_scanned_file_offset(TSRMLS_D); |
|
|
void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); |
void zend_resolve_non_class_name(znode *element_name, zend_bool check_namespace TSRMLS_DC); |
void zend_resolve_class_name(znode *class_name, ulong *fetch_type, int check_ns_name TSRMLS_DC); | void zend_resolve_class_name(znode *class_name, ulong fetch_type, int check_ns_name TSRMLS_DC); |
ZEND_API char* zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var, int* name_len); | ZEND_API const char* zend_get_compiled_variable_name(const zend_op_array *op_array, zend_uint var, int* name_len); |
|
|
#ifdef ZTS |
#ifdef ZTS |
const char *zend_get_zendtext(TSRMLS_D); |
const char *zend_get_zendtext(TSRMLS_D); |
Line 374 int zend_get_zendleng(TSRMLS_D);
|
Line 430 int zend_get_zendleng(TSRMLS_D);
|
void zend_do_binary_op(zend_uchar op, znode *result, const znode *op1, const znode *op2 TSRMLS_DC); |
void zend_do_binary_op(zend_uchar op, znode *result, const znode *op1, const znode *op2 TSRMLS_DC); |
void zend_do_unary_op(zend_uchar op, znode *result, const znode *op1 TSRMLS_DC); |
void zend_do_unary_op(zend_uchar op, znode *result, const znode *op1 TSRMLS_DC); |
void zend_do_binary_assign_op(zend_uchar op, znode *result, const znode *op1, const znode *op2 TSRMLS_DC); |
void zend_do_binary_assign_op(zend_uchar op, znode *result, const znode *op1, const znode *op2 TSRMLS_DC); |
void zend_do_assign(znode *result, znode *variable, const znode *value TSRMLS_DC); | void zend_do_assign(znode *result, znode *variable, znode *value TSRMLS_DC); |
void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRMLS_DC); |
void zend_do_assign_ref(znode *result, const znode *lvar, const znode *rvar TSRMLS_DC); |
void fetch_simple_variable(znode *result, znode *varname, int bp TSRMLS_DC); |
void fetch_simple_variable(znode *result, znode *varname, int bp TSRMLS_DC); |
void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar op TSRMLS_DC); |
void fetch_simple_variable_ex(znode *result, znode *varname, int bp, zend_uchar op TSRMLS_DC); |
Line 423 void zend_do_add_variable(znode *result, const znode *
|
Line 479 void zend_do_add_variable(znode *result, const znode *
|
int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); |
int zend_do_verify_access_types(const znode *current_access_type, const znode *new_modifier); |
void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); |
void zend_do_begin_function_declaration(znode *function_token, znode *function_name, int is_method, int return_reference, znode *fn_flags_znode TSRMLS_DC); |
void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); |
void zend_do_end_function_declaration(const znode *function_token TSRMLS_DC); |
void zend_do_receive_arg(zend_uchar op, const znode *var, const znode *offset, const znode *initialization, znode *class_type, const znode *varname, zend_bool pass_by_reference TSRMLS_DC); | void zend_do_receive_arg(zend_uchar op, znode *varname, const znode *offset, const znode *initialization, znode *class_type, zend_bool pass_by_reference TSRMLS_DC); |
int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); |
int zend_do_begin_function_call(znode *function_name, zend_bool check_namespace TSRMLS_DC); |
void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); |
void zend_do_begin_method_call(znode *left_bracket TSRMLS_DC); |
void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); |
void zend_do_clone(znode *result, const znode *expr TSRMLS_DC); |
Line 435 void zend_do_end_function_call(znode *function_name, z
|
Line 491 void zend_do_end_function_call(znode *function_name, z
|
void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC); |
void zend_do_return(znode *expr, int do_end_vparse TSRMLS_DC); |
void zend_do_handle_exception(TSRMLS_D); |
void zend_do_handle_exception(TSRMLS_D); |
|
|
void zend_do_begin_lambda_function_declaration(znode *result, znode *function_token, int return_reference TSRMLS_DC); | void zend_do_begin_lambda_function_declaration(znode *result, znode *function_token, int return_reference, int is_static TSRMLS_DC); |
void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC); |
void zend_do_fetch_lexical_variable(znode *varname, zend_bool is_ref TSRMLS_DC); |
|
|
void zend_do_try(znode *try_token TSRMLS_DC); |
void zend_do_try(znode *try_token TSRMLS_DC); |
void zend_do_begin_catch(znode *try_token, znode *catch_class, const znode *catch_var, znode *first_catch TSRMLS_DC); | void zend_do_begin_catch(znode *try_token, znode *catch_class, znode *catch_var, znode *first_catch TSRMLS_DC); |
void zend_do_end_catch(const znode *try_token TSRMLS_DC); |
void zend_do_end_catch(const znode *try_token TSRMLS_DC); |
void zend_do_throw(const znode *expr TSRMLS_DC); |
void zend_do_throw(const znode *expr TSRMLS_DC); |
|
|
ZEND_API int do_bind_function(zend_op *opline, HashTable *function_table, zend_bool compile_time); | ZEND_API int do_bind_function(const zend_op_array *op_array, zend_op *opline, HashTable *function_table, zend_bool compile_time); |
ZEND_API zend_class_entry *do_bind_class(const zend_op *opline, HashTable *class_table, zend_bool compile_time TSRMLS_DC); | ZEND_API zend_class_entry *do_bind_class(const zend_op_array *op_array, const zend_op *opline, HashTable *class_table, zend_bool compile_time TSRMLS_DC); |
ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op *opline, HashTable *class_table, zend_class_entry *parent_ce, zend_bool compile_time TSRMLS_DC); | ZEND_API zend_class_entry *do_bind_inherited_class(const zend_op_array *op_array, const zend_op *opline, HashTable *class_table, zend_class_entry *parent_ce, zend_bool compile_time TSRMLS_DC); |
ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface TSRMLS_DC); |
ZEND_API void zend_do_inherit_interfaces(zend_class_entry *ce, const zend_class_entry *iface TSRMLS_DC); |
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC); |
ZEND_API void zend_do_implement_interface(zend_class_entry *ce, zend_class_entry *iface TSRMLS_DC); |
void zend_do_implements_interface(znode *interface_znode TSRMLS_DC); |
void zend_do_implements_interface(znode *interface_znode TSRMLS_DC); |
|
|
|
/* Trait related functions */ |
|
void zend_do_use_trait(znode *trait_znode TSRMLS_DC); |
|
void zend_prepare_reference(znode *result, znode *class_name, znode *method_name TSRMLS_DC); |
|
void zend_add_trait_precedence(znode *method_reference, znode *trait_list TSRMLS_DC); |
|
void zend_add_trait_alias(znode *method_reference, znode *modifiers, znode *alias TSRMLS_DC); |
|
|
|
ZEND_API void zend_do_implement_trait(zend_class_entry *ce, zend_class_entry *trait TSRMLS_DC); |
|
ZEND_API void zend_do_bind_traits(zend_class_entry *ce TSRMLS_DC); |
|
|
ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce TSRMLS_DC); |
ZEND_API void zend_do_inheritance(zend_class_entry *ce, zend_class_entry *parent_ce TSRMLS_DC); |
void zend_do_early_binding(TSRMLS_D); |
void zend_do_early_binding(TSRMLS_D); |
ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array TSRMLS_DC); |
ZEND_API void zend_do_delayed_early_binding(const zend_op_array *op_array TSRMLS_DC); |
Line 473 void zend_do_default_before_statement(const znode *cas
|
Line 538 void zend_do_default_before_statement(const znode *cas
|
void zend_do_begin_class_declaration(const znode *class_token, znode *class_name, const znode *parent_class_name TSRMLS_DC); |
void zend_do_begin_class_declaration(const znode *class_token, znode *class_name, const znode *parent_class_name TSRMLS_DC); |
void zend_do_end_class_declaration(const znode *class_token, const znode *parent_token TSRMLS_DC); |
void zend_do_end_class_declaration(const znode *class_token, const znode *parent_token TSRMLS_DC); |
void zend_do_declare_property(const znode *var_name, const znode *value, zend_uint access_type TSRMLS_DC); |
void zend_do_declare_property(const znode *var_name, const znode *value, zend_uint access_type TSRMLS_DC); |
void zend_do_declare_implicit_property(TSRMLS_D); |
|
void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_DC); |
void zend_do_declare_class_constant(znode *var_name, const znode *value TSRMLS_DC); |
|
|
void zend_do_fetch_property(znode *result, znode *object, const znode *property TSRMLS_DC); |
void zend_do_fetch_property(znode *result, znode *object, const znode *property TSRMLS_DC); |
Line 500 void zend_do_add_list_element(const znode *element TSR
|
Line 564 void zend_do_add_list_element(const znode *element TSR
|
void zend_do_new_list_begin(TSRMLS_D); |
void zend_do_new_list_begin(TSRMLS_D); |
void zend_do_new_list_end(TSRMLS_D); |
void zend_do_new_list_end(TSRMLS_D); |
|
|
|
/* Functions for a null terminated pointer list, used for traits parsing and compilation */ |
|
void zend_init_list(void *result, void *item TSRMLS_DC); |
|
void zend_add_to_list(void *result, void *item TSRMLS_DC); |
|
|
|
|
void zend_do_cast(znode *result, const znode *expr, int type TSRMLS_DC); |
void zend_do_cast(znode *result, const znode *expr, int type TSRMLS_DC); |
void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC); |
void zend_do_include_or_eval(int type, znode *result, const znode *op1 TSRMLS_DC); |
|
|
Line 547 void zend_do_end_compilation(TSRMLS_D);
|
Line 616 void zend_do_end_compilation(TSRMLS_D);
|
void zend_do_label(znode *label TSRMLS_DC); |
void zend_do_label(znode *label TSRMLS_DC); |
void zend_do_goto(const znode *label TSRMLS_DC); |
void zend_do_goto(const znode *label TSRMLS_DC); |
void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC); |
void zend_resolve_goto_label(zend_op_array *op_array, zend_op *opline, int pass2 TSRMLS_DC); |
void zend_release_labels(TSRMLS_D); | void zend_release_labels(int temporary TSRMLS_DC); |
|
|
ZEND_API void function_add_ref(zend_function *function); |
ZEND_API void function_add_ref(zend_function *function); |
|
|
#define INITIAL_OP_ARRAY_SIZE 64 |
#define INITIAL_OP_ARRAY_SIZE 64 |
|
#define INITIAL_INTERACTIVE_OP_ARRAY_SIZE 8192 |
|
|
|
|
/* helper functions in zend_language_scanner.l */ |
/* helper functions in zend_language_scanner.l */ |
Line 564 ZEND_API void init_op_array(zend_op_array *op_array, z
|
Line 634 ZEND_API void init_op_array(zend_op_array *op_array, z
|
ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC); |
ZEND_API void destroy_op_array(zend_op_array *op_array TSRMLS_DC); |
ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC); |
ZEND_API void zend_destroy_file_handle(zend_file_handle *file_handle TSRMLS_DC); |
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC); |
ZEND_API int zend_cleanup_class_data(zend_class_entry **pce TSRMLS_DC); |
|
ZEND_API int zend_cleanup_user_class_data(zend_class_entry **pce TSRMLS_DC); |
|
ZEND_API void zend_cleanup_internal_class_data(zend_class_entry *ce TSRMLS_DC); |
|
ZEND_API void zend_cleanup_internal_classes(TSRMLS_D); |
ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC); |
ZEND_API int zend_cleanup_function_data(zend_function *function TSRMLS_DC); |
ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC); |
ZEND_API int zend_cleanup_function_data_full(zend_function *function TSRMLS_DC); |
|
|
Line 573 ZEND_API void destroy_zend_class(zend_class_entry **pc
|
Line 646 ZEND_API void destroy_zend_class(zend_class_entry **pc
|
void zend_class_add_ref(zend_class_entry **ce); |
void zend_class_add_ref(zend_class_entry **ce); |
|
|
ZEND_API void zend_mangle_property_name(char **dest, int *dest_length, const char *src1, int src1_length, const char *src2, int src2_length, int internal); |
ZEND_API void zend_mangle_property_name(char **dest, int *dest_length, const char *src1, int src1_length, const char *src2, int src2_length, int internal); |
ZEND_API int zend_unmangle_property_name(char *mangled_property, int mangled_property_len, char **prop_name, char **class_name); | ZEND_API int zend_unmangle_property_name(const char *mangled_property, int mangled_property_len, const char **class_name, const char **prop_name); |
|
|
#define ZEND_FUNCTION_DTOR (void (*)(void *)) zend_function_dtor |
#define ZEND_FUNCTION_DTOR (void (*)(void *)) zend_function_dtor |
#define ZEND_CLASS_DTOR (void (*)(void *)) destroy_zend_class |
#define ZEND_CLASS_DTOR (void (*)(void *)) destroy_zend_class |
Line 593 ZEND_API char *zend_make_compiled_string_description(c
|
Line 666 ZEND_API char *zend_make_compiled_string_description(c
|
ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers TSRMLS_DC); |
ZEND_API void zend_initialize_class_data(zend_class_entry *ce, zend_bool nullify_handlers TSRMLS_DC); |
int zend_get_class_fetch_type(const char *class_name, uint class_name_len); |
int zend_get_class_fetch_type(const char *class_name, uint class_name_len); |
|
|
typedef zend_bool (*zend_auto_global_callback)(char *name, uint name_len TSRMLS_DC); | typedef zend_bool (*zend_auto_global_callback)(const char *name, uint name_len TSRMLS_DC); |
typedef struct _zend_auto_global { |
typedef struct _zend_auto_global { |
char *name; | const char *name; |
uint name_len; |
uint name_len; |
zend_auto_global_callback auto_global_callback; |
zend_auto_global_callback auto_global_callback; |
|
zend_bool jit; |
zend_bool armed; |
zend_bool armed; |
} zend_auto_global; |
} zend_auto_global; |
|
|
void zend_auto_global_dtor(zend_auto_global *auto_global); | ZEND_API int zend_register_auto_global(const char *name, uint name_len, zend_bool jit, zend_auto_global_callback auto_global_callback TSRMLS_DC); |
ZEND_API int zend_register_auto_global(const char *name, uint name_len, zend_auto_global_callback auto_global_callback TSRMLS_DC); | ZEND_API void zend_activate_auto_globals(TSRMLS_D); |
ZEND_API zend_bool zend_is_auto_global(const char *name, uint name_len TSRMLS_DC); |
ZEND_API zend_bool zend_is_auto_global(const char *name, uint name_len TSRMLS_DC); |
ZEND_API int zend_auto_global_disable_jit(const char *varname, zend_uint varname_length TSRMLS_DC); | ZEND_API zend_bool zend_is_auto_global_quick(const char *name, uint name_len, ulong hashval TSRMLS_DC); |
ZEND_API size_t zend_dirname(char *path, size_t len); |
ZEND_API size_t zend_dirname(char *path, size_t len); |
|
|
#if SUHOSIN_PATCH |
|
extern void *suhosin_zend_destroy_property_info_internal; |
|
extern void *suhosin_zend_destroy_property_info; |
|
#endif |
|
|
|
int zendlex(znode *zendlval TSRMLS_DC); |
int zendlex(znode *zendlval TSRMLS_DC); |
|
|
|
int zend_add_literal(zend_op_array *op_array, const zval *zv TSRMLS_DC); |
|
|
/* BEGIN: OPCODES */ |
/* BEGIN: OPCODES */ |
|
|
#include "zend_vm_opcodes.h" |
#include "zend_vm_opcodes.h" |
Line 622 int zendlex(znode *zendlval TSRMLS_DC);
|
Line 693 int zendlex(znode *zendlval TSRMLS_DC);
|
|
|
/* END: OPCODES */ |
/* END: OPCODES */ |
|
|
|
|
|
|
|
|
/* global/local fetches */ |
|
#define ZEND_FETCH_GLOBAL 0 |
|
#define ZEND_FETCH_LOCAL 1 |
|
#define ZEND_FETCH_STATIC 2 |
|
#define ZEND_FETCH_STATIC_MEMBER 3 |
|
#define ZEND_FETCH_GLOBAL_LOCK 4 |
|
#define ZEND_FETCH_LEXICAL 5 |
|
|
|
|
|
/* class fetches */ |
/* class fetches */ |
#define ZEND_FETCH_CLASS_DEFAULT 0 |
#define ZEND_FETCH_CLASS_DEFAULT 0 |
#define ZEND_FETCH_CLASS_SELF 1 |
#define ZEND_FETCH_CLASS_SELF 1 |
Line 643 int zendlex(znode *zendlval TSRMLS_DC);
|
Line 702 int zendlex(znode *zendlval TSRMLS_DC);
|
#define ZEND_FETCH_CLASS_AUTO 5 |
#define ZEND_FETCH_CLASS_AUTO 5 |
#define ZEND_FETCH_CLASS_INTERFACE 6 |
#define ZEND_FETCH_CLASS_INTERFACE 6 |
#define ZEND_FETCH_CLASS_STATIC 7 |
#define ZEND_FETCH_CLASS_STATIC 7 |
|
#define ZEND_FETCH_CLASS_TRAIT 14 |
#define ZEND_FETCH_CLASS_MASK 0x0f |
#define ZEND_FETCH_CLASS_MASK 0x0f |
#define ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80 |
#define ZEND_FETCH_CLASS_NO_AUTOLOAD 0x80 |
#define ZEND_FETCH_CLASS_SILENT 0x0100 |
#define ZEND_FETCH_CLASS_SILENT 0x0100 |
Line 685 int zendlex(znode *zendlval TSRMLS_DC);
|
Line 745 int zendlex(znode *zendlval TSRMLS_DC);
|
#define ZEND_REQUIRE (1<<3) |
#define ZEND_REQUIRE (1<<3) |
#define ZEND_REQUIRE_ONCE (1<<4) |
#define ZEND_REQUIRE_ONCE (1<<4) |
|
|
#define ZEND_ISSET (1<<0) |
|
#define ZEND_ISEMPTY (1<<1) |
|
#define ZEND_ISSET_ISEMPTY_MASK (ZEND_ISSET | ZEND_ISEMPTY) |
|
#define ZEND_QUICK_SET (1<<2) |
|
|
|
#define ZEND_CT (1<<0) |
#define ZEND_CT (1<<0) |
#define ZEND_RT (1<<1) |
#define ZEND_RT (1<<1) |
|
|
#define ZEND_FETCH_STANDARD 0x00000000 | /* global/local fetches */ |
#define ZEND_FETCH_ADD_LOCK 0x08000000 | #define ZEND_FETCH_GLOBAL 0x00000000 |
#define ZEND_FETCH_MAKE_REF 0x04000000 | #define ZEND_FETCH_LOCAL 0x10000000 |
| #define ZEND_FETCH_STATIC 0x20000000 |
| #define ZEND_FETCH_STATIC_MEMBER 0x30000000 |
| #define ZEND_FETCH_GLOBAL_LOCK 0x40000000 |
| #define ZEND_FETCH_LEXICAL 0x50000000 |
|
|
|
#define ZEND_FETCH_TYPE_MASK 0x70000000 |
|
|
|
#define ZEND_FETCH_STANDARD 0x00000000 |
|
#define ZEND_FETCH_ADD_LOCK 0x08000000 |
|
#define ZEND_FETCH_MAKE_REF 0x04000000 |
|
|
|
#define ZEND_ISSET 0x02000000 |
|
#define ZEND_ISEMPTY 0x01000000 |
|
#define ZEND_ISSET_ISEMPTY_MASK (ZEND_ISSET | ZEND_ISEMPTY) |
|
#define ZEND_QUICK_SET 0x00800000 |
|
|
|
#define ZEND_FETCH_ARG_MASK 0x000fffff |
|
|
#define ZEND_FE_FETCH_BYREF 1 |
#define ZEND_FE_FETCH_BYREF 1 |
#define ZEND_FE_FETCH_WITH_KEY 2 |
#define ZEND_FE_FETCH_WITH_KEY 2 |
|
|
#define ZEND_FE_RESET_VARIABLE 1 | #define ZEND_FE_RESET_VARIABLE (1<<0) |
#define ZEND_FE_RESET_REFERENCE 2 | #define ZEND_FE_RESET_REFERENCE (1<<1) |
| #define EXT_TYPE_FREE_ON_RETURN (1<<2) |
|
|
#define ZEND_MEMBER_FUNC_CALL 1<<0 |
#define ZEND_MEMBER_FUNC_CALL 1<<0 |
|
|
Line 714 int zendlex(znode *zendlval TSRMLS_DC);
|
Line 787 int zendlex(znode *zendlval TSRMLS_DC);
|
#define ZEND_SEND_BY_REF 1 |
#define ZEND_SEND_BY_REF 1 |
#define ZEND_SEND_PREFER_REF 2 |
#define ZEND_SEND_PREFER_REF 2 |
|
|
#define ARG_SEND_TYPE(zf, arg_num) \ | #define CHECK_ARG_SEND_TYPE(zf, arg_num, m1, m2) \ |
((zf) ? \ | ((zf) && \ |
((((zend_function*)(zf))->common.arg_info && \ | ((((zend_function*)(zf))->common.arg_info && \ |
arg_num<=((zend_function*)(zf))->common.num_args) ? \ | arg_num <= ((zend_function*)(zf))->common.num_args) ? \ |
((zend_function *)(zf))->common.arg_info[arg_num-1].pass_by_reference : \ | (((zend_function *)(zf))->common.arg_info[arg_num-1].pass_by_reference & (m1)) : \ |
((zend_function *)(zf))->common.pass_rest_by_reference) : \ | (((zend_function *)(zf))->common.fn_flags & (m2)))) |
ZEND_SEND_BY_VAL) | |
|
|
#define ARG_MUST_BE_SENT_BY_REF(zf, arg_num) \ |
#define ARG_MUST_BE_SENT_BY_REF(zf, arg_num) \ |
(ARG_SEND_TYPE(zf, arg_num) == ZEND_SEND_BY_REF) | CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF, ZEND_ACC_PASS_REST_BY_REFERENCE) |
|
|
#define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num) \ |
#define ARG_SHOULD_BE_SENT_BY_REF(zf, arg_num) \ |
(ARG_SEND_TYPE(zf, arg_num) & (ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF)) | CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_BY_REF|ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_BY_REFERENCE|ZEND_ACC_PASS_REST_PREFER_REF) |
|
|
#define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \ |
#define ARG_MAY_BE_SENT_BY_REF(zf, arg_num) \ |
(ARG_SEND_TYPE(zf, arg_num) == ZEND_SEND_PREFER_REF) | CHECK_ARG_SEND_TYPE(zf, arg_num, ZEND_SEND_PREFER_REF, ZEND_ACC_PASS_REST_PREFER_REF) |
|
|
#define ZEND_RETURN_VAL 0 |
#define ZEND_RETURN_VAL 0 |
#define ZEND_RETURN_REF 1 |
#define ZEND_RETURN_REF 1 |