op_array 结构

服务于创建最简单的对象
op_array结构体字段:

struct _zend_op_array {  //编译阶段的最终产物,也是执行阶段的输入
    //ast解析过程确定了当前脚本定义了那些变量,并为这些变量顺序编号
    //每个function也会编译为独立的zend_op_array

    //zend_op_array包含着当前作用域下的所有堆栈信息,函数调用实际就是不同zend_op_array间的切换

    /* Common elements */
    //common是普通函数或类成员方法对应的opcodes快速访问时使用的字段
    zend_uchar type;
    zend_uchar arg_flags[3]; /* bitset of arg_info.pass_by_reference */
    uint32_t fn_flags;
    zend_string *function_name;
    zend_class_entry *scope; //范围
    zend_function *prototype;  //原型
    uint32_t num_args;
    uint32_t required_num_args; //参数个数
    zend_arg_info *arg_info; // 参数信息
    /* END of common elements */

    uint32_t *refcount;

    uint32_t last;
     //opcode指令数组
    zend_op *opcodes; //指向指令列表,具体每条指令的结构

    //编译前此值为0,然后发现一个新变量这个值就加1
    int last_var;
     //临时变量数:op_type为IS_TMP_VAR、IS_VAR的变量
    uint32_t T;
     //PHP变量名数组
    zend_string **vars;//这个数组在ast编译期间配合last_var用来确定各个变量的编号,非常重要的一步操作

    int last_live_range;
    int last_try_catch;
    zend_live_range *live_range;
    zend_try_catch_element *try_catch_array;

    /* static variables support */
    //静态变量符号表:通过static声明的
    HashTable *static_variables;

    zend_string *filename;
    uint32_t line_start;
    uint32_t line_end;
    zend_string *doc_comment;
    //延迟声明的链表
    uint32_t early_binding; /* the linked list of delayed declarations */
     //字面量数量
    int last_literal; //字面量(常量)数组,这些都是在PHP代码定义的一些值
    zval *literals; // 保存变量的初始化值、调用的函数/类/常量名称等值,这些字面量也有一个唯一的编号
    //所以执行的过程实际就是根据各指令调用不同的C函数,
    //然后根据变量、字面量、临时变量的编号对这些值进行处理加工。
    int  cache_size;//运行时缓存数组大小
    void **run_time_cache;  //运行时缓存,主要用于缓存一些znode_op以便于快速获取数据

    void *reserved[ZEND_MAX_RESERVED_RESOURCES];
};
本作品采用《CC 协议》,转载必须注明作者和本文链接
讨论数量: 0
(= ̄ω ̄=)··· 暂无内容!

讨论应以学习和精进为目的。请勿发布不友善或者负能量的内容,与人为善,比聪明更重要!