作家
登录

自上而下,逐步揭开PHP解析大整数的面纱

作者: 来源: 2017-09-18 10:09:47 阅读 我要评论

  1. ZEND_ASSIGN_SPEC_CV_CONST_RETVAL_UNUSED_HANDLER, 

找出函数的定义如下:

自上而下,慢慢揭开PHP解析大年夜整数的面纱

可以看到,opcode操作的时刻,值是大年夜EX_CONSTANT获取的,根据定义展开这个宏,那就是

  1. opline->op2->execute_data->literals 

这里可以获得两个信息:

  1. 参数的转换在opcode履行前就做好了
  2. 赋值过程取值时是在op2->execute_data->literals,如不雅猜想没错的话,op2->execute_data->literals此时保存的就是格局转换后的值,可以打印出来验证一下

打印结不雅如下:

自上而下,慢慢揭开PHP解析大年夜整数的面纱

猜想验证精确,然则没有看到真正做转换的处所,照样不逝世心,持续找PHP的Zend底层做编译的逻辑代码。

参考开源的 GitHub项目 ,PHP编译阶段如下图:

自上而下,慢慢揭开PHP解析大年夜整数的面纱

上彀搜刮了PHP语法分析相干的文┞仿,有一篇琅绫擎讲到懂得析整数的过程,是以找到了PHP真正将大年夜整数做转换的处所:

  1. <ST_IN_SCRIPTING>{LNUM} { 
  2. char *end
  3. if (yyleng < MAX_LENGTH_OF_LONG - 1) { /* Won't overflow */ 
  4.     errno = 0; 
  5.     ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0)); 
  6.     /* This isn't an assert, we need to ensure 019 isn't valid octal 
  7.     * Because the lexing itself doesn't do that for us 
  8.     */ 
  9.     if (end != yytext + yyleng) { 
  10.         zend_throw_exception(zend_ce_parse_error, "Invalid numeric literal", 0); 
  11.         ZVAL_UNDEF(zendlval); 
  12.         RETURN_TOKEN(T_LNUMBER); 
  13.     } 
  14. else { 
  15.     errno = 0; 
  16.     ZVAL_LONG(zendlval, ZEND_STRTOL(yytext, &end, 0)); 
  17.     if (errno == ERANGE) { /* Overflow */ 
  18.         errno = 0; 
  19.         if (yytext[0] == '0') { /* octal overflow */ 
  20.             ZVAL_DOUBLE(zendlval, zend_oct_strtod(yytext, (const char **)&end)); 
  21.         } else { 
  22.             ZVAL_DOUBLE(zendlval, zend_strtod(yytext, (const char **)&end

      推荐阅读

      新手必看!电脑主板BIOS这么设置才给力

    51CTO诚邀您9月23号和秒拍/国美/美团云专家一路聊智能CDN的优化之路,抓紧时光哦! BIOS,英文"Basic Input Output System"的缩略词,直译过来后中文名称就是"根本输入输出体系",这些专业>>>详细阅读


    本文标题:自上而下,逐步揭开PHP解析大整数的面纱

    地址:http://www.17bianji.com/lsqh/37473.html

关键词: 探索发现

乐购科技部分新闻及文章转载自互联网,供读者交流和学习,若有涉及作者版权等问题请及时与我们联系,以便更正、删除或按规定办理。感谢所有提供资讯的网站,欢迎各类媒体与乐购科技进行文章共享合作。

网友点评
自媒体专栏

评论

热度

精彩导读
栏目ID=71的表不存在(操作类型=0)