- 博客(18)
- 资源 (8)
- 收藏
- 关注
原创 Lua5.3 虚拟机指令分析(十)表相关指令
Lua5.3 虚拟机指令分析(十)表相关指令OP_NEWTABLEOP_NEWTABLE,/* A B C R(A) := {} (size = B,C) */创建一个新表,结果存放在A所在的栈位置,表的数组大小为B,表的Hash大小为C. TTcs-Mac-mini:OpCode ttc$ cat tOP_NEWTABLE.lua local a = {}a[
2017-08-20 01:58:37 607
原创 Lua5.3 虚拟机指令分析(八)循环
Lua5.3 虚拟机指令分析(八)循环whileLua 处了 for 循环之外的其它各种循环(while)都使用关系和逻辑指令,配合JMP 指令来完成。TTcs-Mac-mini:OpCode ttc$ cat tOP_WHILE.lualocal a = 0; while(a < 10) do a = a + 1; end print(a)TTcs-Mac-mini:OpC
2017-08-20 01:57:54 662
原创 Lua5.3 虚拟机指令分析(六)不定参数
Lua5.3 虚拟机指令分析(六)不定参数OP_VARARGOP_VARARG,/* A B R(A), R(A+1), ..., R(A+B-2) = vararg */TTcs-Mac-mini:OpCode ttc$ cat tOP_VARARG.luaf1 = function(...) endf1(10,20,...)TTcs-Mac-mini:OpCode ttc
2017-08-20 01:57:12 1020
原创 Lua5.3 虚拟机指令分析(五)函数调用
Lua5.3 虚拟机指令分析(五)函数调用OP_CLOSUREOP_CLOSURE,/* A Bx R(A) := closure(KPROTO[Bx]) */TTcs-Mac-mini:OpCode ttc$ cat tOP_CLOSURE.luafunction f1() endTTcs-Mac-mini:OpCode ttc$ ./luac -l -l tOP_CL
2017-08-20 01:56:30 719
原创 Lua5.3 虚拟机指令分析(四)分支与跳转
Lua5.3 虚拟机指令分析(四)分支与跳转EQ 、LT、LE、TEST、TESTEST 五个分支指令必须与后面的紧挨的 JMP 指令看做一体。当条件成立时,继续运行;条件不成立时,跳转到指定位置。OP_JMP,/* A sBx pc+=sBx; if (A) close all upvalues >= R(A - 1) */OP_EQ,/* A B C if ((RK(B) =
2017-08-19 09:10:25 884
原创 Lua5.3 虚拟机指令分析(三)表达式运算
Lua5.3 虚拟机指令分析(三)表达式运算二元运算TTcs-Mac-mini:OpCode ttc$ cat tOP_Arith.lua local t = 1t = t + 1t = t - 1t = t * 1t = t / 1t = t % 1t = t ^ 1t = t // 1t = t & 1t = t | 1t = t ~ 1t = t << 1t = t
2017-08-19 09:08:03 454
原创 Lua5.3 虚拟机指令分析(二)赋值指令
Lua5.3 虚拟机指令分析(二)赋值指令Lua VM 是基于寄存器结构实现的,也就是说,每段 Lua chunk 代码都被翻译为一组对256 个寄存器的操作指令。这有点类似于我们为Lua编写 C 扩展。 C 函数通常是从 lua_State 中取出参数逐个记录在 C 的局部变量中,然后利用C 代码直接对这些值进行操作。可以类比 把寄存器类比于 Lua 的寄存器。它们的确有相似之处, C 中的局
2017-08-19 09:06:25 1130
原创 Lua5.3 虚拟机指令分析(一)概述
Lua5.3 虚拟机指令分析(一)概述概述Lua VM 使用的是 Register based VM。 指令都是在已经分配好的寄存器中存取操作数。 add a b c 将 寄存器 b 与 寄存器 c 中的值相加,结果存在 寄存器 a 中。 标准的三地址指令,每条指令的表达能力很强,并有效的减少了内存赋值操作。#if LUAI_BITSINT >= 32typedef unsigne
2017-08-19 09:03:32 2575
原创 Lua5.3 VM 分析(八)For 循环
Lua5.3 VM 分析(八)For 循环Lua 支持两种 for 循环,一种是 C 语言系 的 数字循环,另外一种支持 迭代器。 stat ::= for Name ‘=’ exp ‘,’ exp [‘,’ exp] do block end for v = e1, e2, e3 do block endLua 手册中使用下列操作模拟。 do local var, l
2017-08-19 07:45:21 1093
原创 Lua5.3 VM 分析(七)生成闭包
Lua5.3 VM 分析(七)生成闭包在Lua 中,函数是一等公民。一切代码都是函数,准确的说是闭包。当我们执行一段程序时,其实就是调用一个函数。加载一个库,也是调用一个函数。加载一个Lua 源文件,里面即使定义了很多 Lua 函数,但是 它整体依旧是单个函数。所以,每段完整的字节码都是一个Lua 函数。而每个函数里可以附有很多个函数原型 Proto。函数原型 Proto 没有放在常量表中,而是单
2017-08-19 07:44:24 486
原创 Lua5.3 VM 分析(四)分支和跳转
Lua5.3 VM 分析(四)分支和跳转Lua VM 定义了 OP_EQ、OP_LT、OP_LE、OP_TEST、OP_TESTSET 五种分支操作。这五个分支指令必须与 之后的 跳转指令 JMP 看做一个整体解释。也就是说:当条件成立时,继续运行;条件不成立时,跳转到指定位置。如果条件成立跳转到L1, 否则跳转到L2: L1: success() jmp exit L2:
2017-08-19 07:43:09 984
原创 Lua5.3 VM 分析(三)表达式运算
Lua5.3 VM 分析(三)表达式运算二元运算+、-、*、%、^、/、//、&、 |、\~、\<\<、>> 这 12 种二元运算 OP_ADD、OP_SUB、OP_MUL、OP_DIV、OP_POW、OP_MOD、OP_IDIV、OP_BAND、OP_BOR、OP_BXOR、OP_SHL、OP_SHR ### vmcase(OP_ADD) { TValu
2017-08-19 07:40:44 1155
原创 Lua5.3 VM 分析(一)字节码运行
Lua5.3 VM 分析(一)字节码运行luaV_execute 是Lua VM 执行一段字节码的入口。Lua VM 就是一个状态机,从当前调用栈上次运行点开始解释字节码指令,直到下一个 C 边界跳出点(可以是函数执行完毕,也可以是一次协程 yield 操作)。Lua 函数部分typedef struct CallInfo { StkId func; /* function index in
2017-08-19 07:27:41 2484
原创 Lua 5.3 源码分析 (七) 闭包 Closure
Lua 5.3 源码分析 (七) 闭包 Closure概述闭包(Closure)在函数式编程中是一个重要概念,如果说 C+ + 的面向对象编程是把一组函数绑定到特定的数据类型上的话,那么闭包就是把一组数据绑定到特定的函数上。当调用 counter 后,会得到一个函数。这个函数每调用一次,返回值会加一。 我们把这个返回的你们函数记作一个计数器。counter 可以产生多个计数器,每个都独立计算
2017-08-18 11:46:21 1767
原创 Lua 5.3 源码分析(六) 字符串 Table
Lua 5.3 源码分析 (六) 表 Tabletypedef union TKey { struct { TValuefields; int next; /* for chaining (offset for next node) */ } nk; TValue tvk;} TKey;/* copy a value into a key without messi
2017-08-18 11:31:26 649
原创 Lua 5.3 源码分析(四)线程 lua_State
Lua 5.3 源码分析(四)线程 lua_StateLua 的THREAD 类型定义如下图: /* ** ‘per thread’ state */ struct lua_State { //1 Lua 类型公共头部 CommonHeader; //2 global_State *l_G
2017-08-18 11:16:51 2381
原创 Lua 5.3 源码分析(一)类型系统
Lua 5.3 源码分析(一)类型系统数据类型/*** basic types*/#define LUA_TNONE (-1)#define LUA_TNIL 0#define LUA_TBOOLEAN 1#define LUA_TLIGHTUSERDATA 2#define LUA_TNUMBER 3#define LUA_TSTRI
2017-08-18 10:31:17 2901 1
原创 Lua 5.3 源码分析(十)线程的执行与中断
Lua 5.3 源码分析(十)线程的执行与中断Lua 的程序运行时以线程为单位的。每个Lua 线程可以独立运行直到自行中断,把中断的信息留在状态机中。每条线程的执行互不干扰,可以独立延续之前中断的执行过程。Lua 线程和系统线程无关,所以不会为每条 Lua 线程创建独立的系统堆栈,而是利用自己维护的线程栈,内存开销也就远小于系统线程。Lua 是一门嵌入式语言,和 C 语言混合编程是一种常态。 一旦L
2017-08-18 09:56:57 2567
pthread源代码
2015-05-15
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人