`
deepfuture
  • 浏览: 4332360 次
  • 性别: Icon_minigender_1
  • 来自: 湛江
博客专栏
073ec2a9-85b7-3ebf-a3bb-c6361e6c6f64
SQLite源码剖析
浏览量:79402
1591c4b8-62f1-3d3e-9551-25c77465da96
WIN32汇编语言学习应用...
浏览量:68357
F5390db6-59dd-338f-ba18-4e93943ff06a
神奇的perl
浏览量:101480
Dac44363-8a80-3836-99aa-f7b7780fa6e2
lucene等搜索引擎解析...
浏览量:281131
Ec49a563-4109-3c69-9c83-8f6d068ba113
深入lucene3.5源码...
浏览量:14596
9b99bfc2-19c2-3346-9100-7f8879c731ce
VB.NET并行与分布式编...
浏览量:65547
B1db2af3-06b3-35bb-ac08-59ff2d1324b4
silverlight 5...
浏览量:31310
4a56b548-ab3d-35af-a984-e0781d142c23
算法下午茶系列
浏览量:45197
社区版块
存档分类
最新评论

探密perl-解析perl源码(1)

阅读更多

 

本系列为刘兴(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
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics