设为首页 加入收藏

TOP

PHP内核中重要的两个全局变量(一)
2014-11-23 17:45:09 】 浏览:563
Tags:PHP 内核 重要 两个 全局 变量

在阅读PHP源码的时候,会遇到很多诸如:CG(),EG() 这样的宏,如果不了解这些宏的意义,会给理解源码造成很大困难。


Zend引擎中有两个重要的全局变量结构体,就是Zend引擎关闭之前都会存在的变量:


typedef struct _zend_compiler_globals zend_compiler_globals;
typedef struct _zend_executor_globals zend_executor_globals;


/* Compiler */
#ifdef ZTS
# define CG(v) TSRMG(compiler_globals_id, zend_compiler_globals *, v)
int zendparse(void *compiler_globals);
#else
# define CG(v) (compiler_globals.v)
extern ZEND_API struct _zend_compiler_globals compiler_globals;
int zendparse(void);
#endif



/* Executor */
#ifdef ZTS
# define EG(v) TSRMG(executor_globals_id, zend_executor_globals *, v)
#else
# define EG(v) (executor_globals.v)
extern ZEND_API zend_executor_globals executor_globals;
#endif


CG 的含义就是 compiler_globals ,Zend编译器相关的全局变量;


EG 的含义就是 executor_globals,Zend执行器相关的全局变量;


这两个结构都包含了很多元素,对理解PHP内核有很重要的意义:


struct _zend_compiler_globals {
zend_stack bp_stack;
zend_stack switch_cond_stack;
zend_stack foreach_copy_stack;
zend_stack object_stack;
zend_stack declare_stack;


zend_class_entry *active_class_entry;


/* variables for list() compilation */
zend_llist list_llist;
zend_llist dimension_llist;
zend_stack list_stack;


zend_stack function_call_stack;


char *compiled_filename;


int zend_lineno;
int comment_start_line;
char *heredoc;
int heredoc_len;


zend_op_array *active_op_array;


HashTable *function_table; /* function symbol table */
HashTable *class_table; /* class table */


HashTable filenames_table;


HashTable *auto_globals;


zend_bool in_compilation;
zend_bool short_tags;
zend_bool asp_tags;
zend_bool allow_call_time_pass_reference;


zend_declarables declarables;


/* For extensions support */
zend_bool extended_info; /* generate extension information for debugger/profiler */
zend_bool handle_op_arrays; /* run op_arrays through op_array handlers */


zend_bool unclean_shutdown;


zend_bool ini_parser_unbuffered_errors;


zend_llist open_files;


long catch_begin;


struct _zend_ini_parser_param *ini_parser_param;


int interactive;


zend_uint start_lineno;
zend_bool increment_lineno;


znode implementing_class;


zend_uint access_type;


char *doc_comment;
zend_uint doc_comment_len;


#ifdef ZEND_MULTIBYTE
zend_encoding **script_encoding_list;
int script_encoding_list_size;
zend_bool detect_unicode;


zend_encoding *internal_encoding;


/* multibyte utility functions */
zend_encoding_detector encoding_detector;
zend_encoding_converter encoding_converter;
zend_encoding_oddlen encoding_oddlen;
#endif /* ZEND_MULTIBYTE */


#ifdef ZTS
HashTable **static_members;
int last_static_member;
#endif
};



struct _zend_executor_globals {
zval **return_value_ptr_ptr;


zval uninitialized_zval;
zval *uninitialized_zval_ptr;


zval error_zval;
zval *error_zval_ptr;


zend_function_state *function_state_ptr;
zend_ptr_stack arg_types_stack;


/* symbol table cache */
HashTable *symtable_cache[SYMTABLE_CACHE_SIZE];
HashTable **symtable_cache_limit;
HashTable **symtable_cache_ptr;


zend_op **opline_ptr;


HashTable *active_symbol_table;
HashTable symbol_table; /* main symbol table */


HashTable included_files; /* files already included */


jmp_buf *bailout;


int error_reporting;
int orig_error_reporting;
int exit_status;


zend_op_array *active_op_array;


HashTable *function_table; /* function symbol table */
HashTable *

首页 上一页 1 2 下一页 尾页 1/2/2
】【打印繁体】【投稿】【收藏】 【推荐】【举报】【评论】 【关闭】 【返回顶部
上一篇GDB在调试Zend引擎时的几个重要的.. 下一篇Zend 引擎执行器的核心代码

最新文章

热门文章

Hot 文章

Python

C 语言

C++基础

大数据基础

linux编程基础

C/C++面试题目