首頁  >  文章  >  後端開發  >  PHP7源碼之CG與EG宏的詳解

PHP7源碼之CG與EG宏的詳解

*文
*文原創
2017-12-25 09:56:333267瀏覽

在閱讀PHP原始碼的時候,會遇到很多巨集。如果不了解這些巨集的含義,對程式碼理解會帶來很多困擾。現在我們就一起來看看CG和EG兩個宏的意思。

CG

意思

CG的意思是 compiler_globals。 Zend編譯器相關的全域變數。

作用

大家都知道PHP程式碼最後是轉換成Opcode去執行的。在PHP轉換為Opcode過程中需要保存一些資訊。這些資訊就保存在CG全域變數中。

如果想了解Zend是如何把PHP程式碼轉換為Opcode,使用GC全域變數儲存了那些訊息,可以查看Zend/zend_language_scanner.c 檔案的compile_file(zend_file_handle *file_handle, int type)方法

程式碼

在Zend/zend_globals_macros.h 檔案中有這個巨集的相關程式碼。如下:

/* Compiler */
#ifdef ZTS
<h1>define CG(v) ZEND_TSRMG(compiler_globals_id, zend_compiler_globals *, v)</h1>
#else
<h1>define CG(v) (compiler_globals.v)</h1>
extern ZEND_API struct _zend_compiler_globals compiler_globals;
#endif

EG

意義

EG的意思是 executor_globals。 Zend執行器相關的全域變數。

作用

Zend引擎在執行Opcode的時候,需要記錄一些執行過程中的狀態。如,目前執行的類別作用域,目前已經載入了那些文件,等。

程式碼

在 Zend/zend_globals_macros.h 檔案中有這個巨集的相關程式碼。如下:

/* Executor */
#ifdef ZTS
<h1>define EG(v) ZEND_TSRMG(executor_globals_id, zend_executor_globals *, v)</h1>
#else
<h1>define EG(v) (executor_globals.v)</h1>
extern ZEND_API zend_executor_globals executor_globals;

其他

EG和CG有一些資料是共用的。如,function_table (儲存方法資訊) , class_table (儲存類別資訊) 。

相關程式碼在Zend/zend_execute_API.c的init_executor方法中發現如下程式碼:

void init_executor(void) /* {{{ */
{
    zend_init_fpu();
    ......
    EG(function_table) = CG(function_table);
    EG(class_table) = CG(class_table);
    ......
    }


#

以上是PHP7源碼之CG與EG宏的詳解的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn