• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

PHP7源码之CG和EG宏的详解

php 搞代码 3年前 (2022-01-22) 21次浏览 已收录 0个评论

在阅读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 文件中有这个宏的相关代码。如下:

/* Execu<strong style="color:transparent">本文来源gao@daima#com搞(%代@#码@网&</strong><strong>搞gaodaima代码</strong>tor */#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宏的详解的详细内容,更多请关注搞代码gaodaima其它相关文章!


搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:PHP7源码之CG和EG宏的详解

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址