Lua5.1.4代码分析(八)-逻辑跳转类操作

我原来以为逻辑跳转类指令是很简单的,实际上花了我很多时间才看的比较明白.未来也许还需要重新回顾这部分代码.

暂时不展开复杂的讨论,所有的逻辑跳转类指令最后都无非是这样的形式:

如果条件成立跳转到lable1,否则跳转到lable2:

label1:
    条件成立的处理,跳转到出口

label2:
     条件不成立的处理,跳转到出口

出口:
    处理收尾工作

比如,以下的一段C代码:

if (cond)
   func1();
else
  

Lua5.1.4代码分析(七)-赋值类操作

Lua中的变量,分为三种类型:Global,Local,UpVal.前面两种不需解释,第三种变量,稍微做些代码层面上的解释,比如:

function test()
   local a = 1
   function t()
       a = 2
  

Lua5.1.4代码分析(六)Opcode格式

了解了Lua虚拟机和栈的结构之后,在正式进入分析各种Lua的操作之前,还需要简单了解Lua Opcode的格式.

Lua的opcode格式分为三类,在lopcode.h中有定义:
enum OpMode {iABC, iABx, iAsBx}; /* basic instruction format */

Lua5.1.4代码分析(五)Lua栈

上一篇中,已经将Lua代码从分析到执行的大致流程分析了一遍,但仅有这些,还不足以了解Lua的运作机制,这里要分析一下Lua中的另外一个重要概念:栈.

Lua的栈在Lua中扮演着一个非常重要的中间层的角色.既然Lua虚拟机模拟的是CPU的运作,那么Lua栈模拟的就是内存的角色.在Lua内部,参数的传递是通过Lua栈,同时Lua与C等外部进行交互的时候也是使用的栈.这些暂时不展开讨论,先关注的是Lua栈的分配,管理和相关的数据结构.

lua虚拟机在初始化创建lua_State结构体时,会走到stack_init函数中,这个函数主要就是对Lua栈和CallInfo数组的初始化:

Lua5.1.4代码分析(四)Lua虚拟机概述

何为”虚拟机”?
在一门脚本语言中,总会有一个虚拟机,可是”虚拟机”是什么?简而言之,这里的”虚拟机”就是使用代码实现的用于模拟计算机运行的程序.
每一门脚本语言都会有自己定义的opcode(operation

Lua5.1.4代码分析(三)表类型

来看Lua的表的定义:

typedef struct Table {
  CommonHeader;
  lu_byte flags;
  lu_byte lsizenode;  /* log2 of size of `node' array */
  struct Table *metatable;
  TValue *array;  /* array part */
  Node *node;
  Node *lastfree;  /* any free position is before this position */
  GCObject *gclist;
  int sizearray;  /* size of `array' array */
}

Lua5.1.4代码分析(二)字符串类型

Lua中字符串结构体的定义是:

typedef union TString {
  L_Umaxalign dummy;  /* ensures maximum alignment for strings */
  struct {
    CommonHeader;
    lu_byte reserved;
    unsigned int hash;
    size_t len;
  } tsv;
} TString;

这里TString结构体是一个union, 最开始的L_Umaxalign

Lua5.1.4代码分析(一)Lua的通用数据类型

TValue这个结构体是Lua的通用结构体,顾名思义,它存放的是Lua的数据,既然是”通用”的,同时也说明,Lua中的所有的数据都可以使用这个结构体来表示.很容易想到,在面向对象中,这个结构体是一个基类,派生出来的都是其他的子类.如果使用C语言来模拟,就是定义出一个通用的结构体作为”父类”,然后子类的结构体中以这个父类作为结构体的第一个成员变量.比如这样:

struct Common {
   // ....
};
struct Object1 {
  struct Common com;

[erlang库源码阅读]gen_server.erl

继续接着上一篇文章分析gen.erl来分析下gen_server.

在gen.erl中,start操作最终会走到GenMod:init_it函数中,这里的GenMod就是gen_server/fsm/event三个模块,所以先来看看gen_server中的init_it函数.

%%% ---------------------------------------------------
%%% Initiate the new process.
%%% Register the name using the Rfunc function
%%% Calls the Mod:init/Args function.
%%% Finally an acknowledge is sent to Parent and the main
%%% loop is entered.
%%%

[erlang库源码阅读]gen.erl

gen系列代码,gen_server,gen_event,gen_fsm的代码都在erlang代码的lib/stdlib中,它们都是以gen.erl为基础的.gen.erl中定义了一些这几个behavior公有的代码,所以首先来看看gen.erl做了什么.

gen.erl中主要是定义了以下几个操作:start(启动一个gen系列的服务器),call(向gen系列服务器send请求并且等待回复).

1) start

start(GenMod, LinkP, Mod, Args, Options) ->
    do_spawn(GenMod, LinkP, Mod, Args, Options).
do_spawn(GenMod, _, Name, Mod, Args, Options) ->
    Time = timeout(Options),

Pages: Prev 1 2 3 4 5 6 7 8 9 Next