op_array 結構

coder_study發表於2019-11-04

服務於建立最簡單的物件
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 協議》,轉載必須註明作者和本文連結

相關文章