文件 php-5.6.26/Zend/zend_language_scanner.c

  1. ZEND_API zend_op_array *compile_file(zend_file_handle *file_handle, int type TSRMLS_DC)
  2. {
  3. zend_lex_state original_lex_state;
  4. zend_op_array *op_array = (zend_op_array *) emalloc(sizeof(zend_op_array));
  5. zend_op_array *original_active_op_array = CG(active_op_array); // 保存 op_code 现场(保存现场)
  6. zend_op_array *retval=NULL;
  7. int compiler_result;
  8. zend_bool compilation_successful=;
  9. znode retval_znode;
  10. zend_bool original_in_compilation = CG(in_compilation);
  11.  
  12. retval_znode.op_type = IS_CONST;
  13. INIT_PZVAL(&retval_znode.u.constant);
  14. ZVAL_LONG(&retval_znode.u.constant, );
  15.  
  16. zend_save_lexical_state(&original_lex_state TSRMLS_CC); // 保存词法分析器的状态(保存现场)
  17.  
  18. retval = op_array; /* success oriented */
  19.  
  20. if (open_file_for_scanning(file_handle TSRMLS_CC)==FAILURE) { // 打开文件、设置扫描器的指针
  21. if (type==ZEND_REQUIRE) {
  22. zend_message_dispatcher(ZMSG_FAILED_REQUIRE_FOPEN, file_handle->filename TSRMLS_CC);
  23. zend_bailout(); // !!! require、require_once 会抛出异常 -----------------
  24. } else {
  25. zend_message_dispatcher(ZMSG_FAILED_INCLUDE_FOPEN, file_handle->filename TSRMLS_CC);
  26. // 没有抛出异常 -----------------
  27. }
  28. compilation_successful=;
  29. } else {
  30. // 扫描后、初始化 op_array
  31. init_op_array(op_array, ZEND_USER_FUNCTION, INITIAL_OP_ARRAY_SIZE TSRMLS_CC); // 1、初始化一些数据、申请空间 2、迭代调用所有zend扩展的op_array_ctor函数
  32. CG(in_compilation) = ; // 是否处于汇编状态
  33. CG(active_op_array) = op_array; // 操作码数组
  34. zend_stack_push(&CG(context_stack), (void *) &CG(context), sizeof(CG(context))); // 把当前上下文入栈
  35. zend_init_compiler_context(TSRMLS_C); // 初始化编译器上下文
  36. compiler_result = zendparse(TSRMLS_C); // 开始解析
  37. zend_do_return(&retval_znode, TSRMLS_CC); // 返回
  38. CG(in_compilation) = original_in_compilation; // 还原现场
  39. if (compiler_result != ) { /* parser error */
  40. zend_bailout();
  41. }
  42. compilation_successful=; // 汇编成功
  43. }
  44.  
  45. if (retval) {
  46. CG(active_op_array) = original_active_op_array; // 还原原来 op_code 现场(还原现场)
  47. if (compilation_successful) { // 汇编成功
  48. pass_two(op_array TSRMLS_CC); // 注入“opcode处理器”
  49. zend_release_labels( TSRMLS_CC);
  50. } else {
  51. efree(op_array);
  52. retval = NULL;
  53. }
  54. }
  55. zend_restore_lexical_state(&original_lex_state TSRMLS_CC); // 还原原来词法解析器的状态(还原现场)
  56. return retval;
  57. }

php-5.6.26源代码 - PHP文件汇编成opcode(require、include的差异)的更多相关文章

  1. php-5.6.26源代码 - PHP文件汇编成opcode、执行

    文件 php-5.6.26/Zend/zend.c ZEND_API int zend_execute_scripts(int type TSRMLS_DC, zval **retval, int f ...

  2. php-7.2.3源代码和php-5.6.26源代码摘录,对比 “汇编php文件”和“执行opcode代码”

    php-7.2.3 在“汇编php文件”和“执行opcode代码”上做了大量改变php-5.6.26 没见到支持抽象语法树的相关代码,php-7.2.3 见到支持抽象语法树的相关代码php-5.6.2 ...

  3. python---filecmp 实现文件,目录,遍历子目录的差异对比功能。

    python---filecmp ilecmp可以实现文件,目录,遍历子目录的差异对比功能. 自带filecmp模块,无需安装. 常用方法说明 filecmp提供3个操作方法,cmp(单文件对比),c ...

  4. 2018/03/09 每日一学PHP 之 require_once require include include_once 包含文件的区别

    require_once require include include_once 方法的区别 对于包含文件来说,如果只是使用框架来说的话,应该会很少碰到,因为框架底层对于文件的引用等做了很好的封装, ...

  5. php-5.6.26源代码 - hash存储结构 - 添加

    添加 , (void *)module, sizeof(zend_module_entry), (void**)&module_ptr){ // zend_hash_add 定义在文件“php ...

  6. php-5.6.26源代码 - hash存储结构 - 初始化

    初始化 有指定析构函数,在销毁hash的时候会调用,如:“类似extension=test.so扩展”也是存放在HashTable中的,“类似extension=test.so扩展”的module_s ...

  7. php-5.6.26源代码 - hash存储结构 - hash算法

    // zend_inline_hash_func 实现在文件“php-5.6.26\Zend\zend_hash.h” h = zend_inline_hash_func(arKey, nKeyLen ...

  8. php-5.6.26源代码 - 扩展模块的加载、注册

    // main实现在文件 php-5.6.26\sapi\cgi\cgi_main.c int main(int argc, char *argv[]) { .... cgi_sapi_module- ...

  9. php-5.6.26源代码 - 扩展模块的种类,扩展模块的执行埋点

    模块种类(两种) 类型一:zend的模块:(类似zend_extension=test.so) 识别方法: php.ini中以zend_extension开头的配置,如zend_extension=t ...

随机推荐

  1. $.ajax、$.post[转]

    jQuery.post( url, [data], [callback], [type] ) :使用POST方式来进行异步请求 参数: url (String) : 发送请求的URL地址. data ...

  2. jQuery中的节点操作(二)

    html代码如下 <p title="武汉长乐教育PHP系列教程" name="hello" class="blue"> < ...

  3. 即将要被淘汰的兼容之--CSS Hack

    css hack 条件注释法只在IE下生效<!--[if IE]>这段文字只在IE浏览器显示<![endif]-->只在IE6下生效<!--[if IE 6]>这段 ...

  4. SAP R/3 IDES 4.71 编译前后硬盘空间大小比较

    使用SGEN编译前 使用SGEN编译后

  5. spring-cloud构架微服务(2)-全局配置二

    接上篇,实际项目中,可能会遇到有些配置项,例如:邮件地址.手机号等在服务已经上线之后做了改动(就当会出现这种情况好了).然后你修改了配置信息,就得一个一个去重启对应的服务.spring-全局配置提供了 ...

  6. ios两个app之间跳转,传值的实现

    两个APP之间的跳转是通过[[UIApplication sharedApplication] openURL:url]这种方式来实现的. 1.首先设置第一个APP的url地址 2.接着设置第二个AP ...

  7. 老笔记本装xubuntu+win7

    https://www.freezhongzi.info/?p=167 1 install xubuntu 分区如下 sda1 20g ext4 / sda2 80g ext4 /data sda3 ...

  8. Spring Boot:内置tomcat启动和外部tomcat部署总结

    springboot的web项目的启动主要分为: 一.使用内置tomcat启动 启动方式: 1.IDEA中main函数启动 2.mvn springboot-run 命令 3.java -jar XX ...

  9. 花3分钟了解下C/C++中的函数可变参简单实现

    1.可变参函数的原理 C/C++函数的参数是存放在栈区的,并且参数的入栈是从参数的右边开始,即最后一个参数先入栈,而第一个参数最后才入栈,所以,根据栈的后进先出性质,函数总能找到第一个参数.所以,可变 ...

  10. phpStudy:使用localhost无法访问的解决方案

    今天遇到新的问题,很有意思,当使用Localhost时,发现报403错误: 百度找到问题所在:没有权限问题 所以我们打开phpStudy,找到配置文件“vhosts-conf”,看到的情况是这样的 接 ...