设为首页 收藏本站
查看: 735|回复: 0

[经验分享] 探密perl-解析perl源码(1)

[复制链接]
累计签到:2 天
连续签到:2 天
发表于 2017-5-16 12:32:43 | 显示全部楼层 |阅读模式
本系列为刘兴(http://deepfuture.iteye.com/)原创,未经笔者授权,任何人和机构不能转载 

op.c

  * A Perl program is compiled into a tree of OPs. Each op contains
  * structural pointers (eg to its siblings and the next op in the
  * execution sequence)
  perl程序编译成一指令集的树,每个指令包括一个结构指针(例如在执行序列中它的兄弟和下一个指令), 
  ops指令集被newFoo函数创建,该函数由perly.y解析器调用, 
  * OPs are mainly created by the newFOO() functions, which are mainly
  * called from the parser (in perly.y) as the code is parsed.
  注意看这个例子:
  * the Perl code $a + $b * $c 相当于以下的函数调用
  *
  *  newBINOP(OP_ADD, flags,
  * newSVREF($a),
  * newBINOP(OP_MULTIPLY, flags, newSVREF($b), newSVREF($c))
  *  )
  注意随时查看EXTERN.h、perl.h、keywords.h这3个头文件
  #include "EXTERN.h"
  #define PERL_IN_OP_C
  #include "perl.h"
  #include "keywords.h"
  #define CALL_PEEP(o) CALL_FPTR(PL_peepp)(aTHX_ o)
  #define CALL_OPFREEHOOK(o) if (PL_opfreehook) CALL_FPTR(PL_opfreehook)(aTHX_ o)
  #if defined(PL_OP_SLAB_ALLOC)
  debug只读指令集
  #ifdef PERL_DEBUG_READONLY_OPS
  #  define PERL_SLAB_SIZE 4096
  #  include <sys/mman.h>
  #endif
  定义PERL_SLAB_SIZE的默认大小为2048,perl片区的大小
  #ifndef PERL__SIZE
  #define PERL_SLAB_SIZE 2048
  #endif
  分配perl片区内存
  void *Perl_Slab_Alloc(pTHX_ size_t sz)
  查看perl.h中PERL_GET_VARS() 的相关定义
  1、PERL_GET_VARS()定义
#ifdef PERL_GLOBAL_STRUCT
#  ifndef PERL_GET_VARS
#    ifdef PERL_GLOBAL_STRUCT_PRIVATE
       EXTERN_C struct perl_vars* Perl_GetVarsPrivate();
#      define PERL_GET_VARS() Perl_GetVarsPrivate() /* see miniperlmain.c */
#      ifndef PERLIO_FUNCS_CONST
#        define PERLIO_FUNCS_CONST /* Can't have these lying around. */
#      endif
#    else
#      define PERL_GET_VARS() 
#    endif
#  endif
#endif
 
PERL_GLOBAL_STRUCT已经定义后
如果定义了 结构私有标志PERL_GLOBAL_STRUCT_PRIVATE,则PERL_GET_VARS()为Perl_GetVarsPrivate函数
 
EXTERN_C struct perl_vars* Perl_GetVarsPrivate();
define PERL_GET_VARS() Perl_GetVarsPrivate()
否则,PERL_GET_VARS()为PL_VarsPtr结构变量
 
2、 PL_VarsPtr定义
 
#ifdef PERL_GLOBAL_STRUCT
perl_vars结构,结构体的内容在perlvars.h中
struct perl_vars {
#  include "perlvars.h"
};
 
 
关于EXT,可以在EXTERN.h中找到
 
/*
 *   designates a global var which is defined in perl.h
 * dEXT designates a global var which is defined in another
 *      file, so we can't count on finding it in perl.h
 *      (this practice should be avoided).
 */
 perl.h中的EXT表示一个全局变量,其它文件中为dEXT


PERL_GLOBAL_STRUCT定义的情况下,
1、如果PERL_CORE定义,不是 结构私有标志PERL_GLOBAL_STRUCT_PRIVATE,则
 PL_Vars定义:
先定义 perl_vars结构变量PL_Vars:EXT struct perl_vars PL_Vars;
再定义 perl_vars结构变量指针PL_VarsPtr,并将其初始化:EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
然后, define PERL_GET_VARS() PL_VarsPtr
2、如果不是PERL_CORE,则
定义perl_vars结构变量指针PL_VarsPtr:  如果PL_VarsPtr非空,则返回PL_VarsPtr,否则调用Perl_GetVars(aTHX)得到PL_VarsPtr
 
 
struct perl_vars *PL_VarsPtr;
#    define PL_Vars (*((PL_VarsPtr) \
      ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars(aTHX))))
#  endif /* PERL_CORE */
 
 
 
 


 
 


 
#ifdef PERL_GLOBAL_STRUCT
struct perl_vars {
#  include "perlvars.h"
};


#  ifdef PERL_CORE
#    ifndef PERL_GLOBAL_STRUCT_PRIVATE
EXT struct perl_vars PL_Vars;
EXT struct perl_vars *PL_VarsPtr INIT(&PL_Vars);
#      undef PERL_GET_VARS
#      define PERL_GET_VARS() PL_VarsPtr
#    endif /* !PERL_GLOBAL_STRUCT_PRIVATE */
#  else /* PERL_CORE */
#    if !defined(__GNUC__) || !defined(WIN32)
EXT
#    endif /* WIN32 */
struct perl_vars *PL_VarsPtr;
#    define PL_Vars (*((PL_VarsPtr) \
      ? PL_VarsPtr : (PL_VarsPtr = Perl_GetVars(aTHX))))
#  endif /* PERL_CORE */
#endif /* PERL_GLOBAL_STRUCT */
 


 
 
 
 
 
3、dVAR 定义
在PERL_GLOBAL_STRUCT定义的情况下,实质为完成my_vars结构变量的指针赋值。
PERL_GLOBAL_STRUCT没有定义,则为dNOOP宏
dNOOP实质为0,即NULL或extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
  



#define NOOP /*EMPTY*/(void)0
#if !defined(HASATTRIBUTE_UNUSED) && defined(__cplusplus)
#define dNOOP /*EMPTY*/(void)0 /* Older g++ has no __attribute((unused))__ */
#else
#define dNOOP extern int /*@unused@*/ Perl___notused PERL_UNUSED_DECL
#endif
#define pVAR    register struct perl_vars* my_vars PERL_UNUSED_DECL
 
#ifdef PERL_GLOBAL_STRUCT
#  define dVAR pVAR    = (struct perl_vars*)PERL_GET_VARS()
#else
#  define dVAR dNOOP
#endif

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-378183-1-1.html 上篇帖子: perl ipc 下篇帖子: learn perl
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表