【后端开辟】opcode 操作数 5 种差别的范例

后端开发 后端开发 5天前 6次浏览 已收录 0个评论 扫描二维码

zend_op_array.opcodes 指向指令列表,细致每条指令的构造以下:

struct _zend_op {  //  *opline  *opcodes
    const void *handler; //指令实行handler
    znode_op op1; //操纵数1
    znode_op op2; //操纵数范例现实就是个32位整形,它重要用于存储一些变量的索引位置、数值纪录等等
    znode_op result; //返回值
    uint32_t extended_value;
    uint32_t lineno;
    zend_uchar opcode; //opcode指令
    zend_uchar op1_type; //操纵数1范例
    zend_uchar op2_type;
    zend_uchar result_type; //返回值范例
};

//操纵数构造
//比方赋值语句:"$a = 45;",两个操纵数离别纪录"$a"、"45"的存储位置,实行时依据op2取到值"45",
//然后赋值给"$a",而"$a"的位置经由过程op1获取到
//固然操纵数并非悉数这么用的,上面只是赋值时刻的状况,别的操纵会有差别的用法
//如函数调用时的传参,op1纪录的就是通报的参数是第几个,op2纪录的是参数的存储位置,
//result纪录的是函数吸收参数的存储位置。
typedef union _znode_op { //操纵数范例现实就是个32位整形,它重要用于存储一些变量的索引位置、数值纪录等等
    uint32_t      constant; //操纵数纪录着当前指令的症结信息, 能够用于变量的存储、接见
    uint32_t      var;
    uint32_t      num;
    uint32_t      opline_num; /*  Needs to be signed */
#if ZEND_USE_ABS_JMP_ADDR
    zend_op       *jmp_addr;
#else
    uint32_t      jmp_offset;
#endif
#if ZEND_USE_ABS_CONST_ADDR
    zval          *zv;
#endif
} znode_op;
//操纵数有5种差别的范例;
#define IS_CONST    (1<<0)  //字面量,编译时便可肯定且不会转变的值,比方:$a = "hello~",个中字符串"hello~"就是常量
#define IS_TMP_VAR  (1<<1) //暂时变量 $a = "hello~" . time(),个中"hello~" . time()的值范例就是IS_TMP_VAR
                            //"123" + $b的效果范例也是IS_TMP_VAR,从这两个例子能够猜想,暂时变量多是实行时期别的
   //范例组合现生成的一个中心值,因为它是现生成的,所以把IS_TMP_VAR赋值给IS_CV变量时不会增添其援用计数
#define IS_VAR      (1<<2)//PHP变量
                          //这个很轻易以为是PHP剧本里的变量,实在不是,这里PHP变量的寄义能够如许明白:PHP变量是没有显
                          //式的在PHP剧本中定义的,不是直接在代码经由过程$var_name定义的
   //。这个范例最常见的例子是PHP函数的返回值,再如$a[0]数组这类,它掏出的值也是IS_VAR,再比方$$a这类
#define IS_UNUSED   (1<<3)  /* Unused variable */   //示意操纵数没有用
#define IS_CV       (1<<4)  /* Compiled variable */
   //PHP剧本变量,即剧本里经由过程$var_name定义的变量,这些变量是编译阶段肯定的,所以是compile variable

   //result_type除了上面几种范例外另有一种范例EXT_TYPE_UNUSED (1<<5),返回值没有运用时会用到,
   //这个跟IS_UNUSED的区别是:IS_UNUSED示意本操纵返回值没有意义(也可简朴的以为没有返回值),
   //而EXT_TYPE_UNUSED的寄义是有返回值,然则没有用到,比方函数返回值没有吸收

更多PHP相干学问,请接见ki4网!

以上就是opcode 操纵数 5 种差别的范例的细致内容,更多请关注ki4网别的相干文章!


本文:【后端开辟】opcode 操作数 5 种差别的范例 本文链接:https://www.21nn.cn/%e5%90%8e%e7%ab%af%e5%bc%80%e5%8f%91/83864.html 本站所以图片、文章仅限用于学习和研究目的; 不得将上述内容用于商业或者非法用途,否则,一切后果请用户自负。 本站信息来自网络,版权争议与本站无关。 您必须在下载后的24个小时之内,从您的电脑中彻底删除上述内容。 如有侵权请邮件与我们联系处理。i@ki4.cn
喜欢 (0)
[1353713598@qq.com]
分享 (0)
发表我的评论
取消评论
表情 贴图 加粗 删除线 居中 斜体 签到

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

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