神奇的PERL-深入篇-perl源码解析(1)_C/C++_编程开发_程序员俱乐部

中国优秀的程序员网站程序员频道CXYCLUB技术地图
热搜:
更多>>
 
您所在的位置: 程序员俱乐部 > 编程开发 > C/C++ > 神奇的PERL-深入篇-perl源码解析(1)

神奇的PERL-深入篇-perl源码解析(1)

 2010/11/19 9:18:40  deepfuture  http://deepfuture.javaeye.com  我要评论(0)
  • 摘要:本神奇的Perl系列为刘兴(http://deepfuture.javaeye.com/)原创,未经笔者授权,任何人和机构不能转载op.c*APerlprogramiscompiledintoatreeofOPs.Eachopcontains*structuralpointers(egtoitssiblingsandthenextopinthe*executionsequence)perl程序编译成一指令集的树,每个指令包括一个结构指针(例如在执行序列中它的兄弟和下一个指令)
  • 标签:PERL perl源码解析

?

本神奇的Perl系列为刘兴(http://deepfuture.javaeye.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


发表评论
用户名: 匿名