本系列为刘兴(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
分享到:
相关推荐
### GNU编译器家族源码解析 #### 一、引言与背景介绍 GNU Compiler Collection (GCC) 是一套由自由软件基金会(Free Software Foundation, FSF)开发的编译器集合,它支持多种编程语言,如 C、C++、Objective-C、...
任天堂游戏编程探密 任天堂主机由6502处理器和一个特制的图形处理器组成。 CPU是6502,而不是传言中的65C02(CMOS)。 PPU的显存是和CPU的内存是分离的,可以通过对特殊端口的读/写来操作。 卡带可能包含的...
AMD K6-2 CPU 编号探密 AMD K6-2 CPU 编号探密是指 AMD 公司推出的 K6-2 系列 CPU 的编号系统,用于标识和区分不同型号的 K6-2 处理器。本文将深入探讨 AMD K6-2 CPU 编号的组成部分、编号规则、性能特点和实际应用...
探密电动汽车的无线充电技术
DDR探密.pdf
### MP3歌词显示探密——Delphi实现 #### 一、引言 随着数字音频技术的发展,MP3格式因其高质量的音质和较小的文件体积而受到广泛欢迎。对于喜欢边听音乐边看歌词的用户来说,能够实现在播放MP3的同时同步显示歌词...
入门级的百科全书,系统地介绍了常用的计算机词汇
**Ajax.Hacks探密书籍**是一本专注于Ajax技术的深入解析和实践指南,它揭示了Ajax(Asynchronous JavaScript and XML)技术的核心原理及其在Web开发中的广泛应用。Ajax是一种用于创建快速、动态网页的技术,通过在...
【幼儿园政治:其他教案-大鲨鱼探密】 在幼儿教育阶段,政治教案并不局限于传统的政治概念,而是更广泛地涵盖了社会认知、道德情感、生态环保等多方面内容。这篇《大鲨鱼探密》教案就是一个很好的例证,旨在通过...
GNURadio探密.pdf
本文将深入探讨“任天堂游戏编程探密”这一主题,解析相关知识点,旨在为那些对任天堂游戏开发感兴趣的程序员提供指导。 首先,我们要了解任天堂游戏机的基本架构。任天堂游戏平台如Switch、3DS等,都有其独特的...
让我们深入解析一下这个领域的关键知识点。 首先,我们要了解汇编语言。汇编语言是一种低级编程语言,它是计算机硬件可以直接理解的语言,每一个指令都对应一个特定的机器码。在游戏编程中,尤其是在早期的任天堂...
1. 探索阶段:主要是对单芯片集成技术的探索和研究。在工控领域,Intel、Motorola、Zilog等公司合作推出了MCS-48系列单片机,标志着单片微型计算机的诞生。 2. 完善阶段:Intel公司完善了早期产品MCS-48系列,推出...
一汽大众工厂探密报告.doc
1. **异步通信基础**:Ajax的核心在于XMLHttpRequest对象,它允许JavaScript在后台与服务器进行数据交换,无需用户感知。 2. **JSON与XML**:Ajax最初与XML关联,但现在更常见的是使用JSON(JavaScript Object ...
《任天堂游戏编程探密》是一本专注于探讨任天堂游戏开发技术的专业书籍,它主要侧重于硬件层面的解析,为读者揭示了游戏开发背后的神秘世界。任天堂作为全球知名的电子游戏公司,其游戏平台如GBA(Game Boy Advance...