lua4.0数值定义
来源:互联网 发布:淘宝商品链接怎么做 编辑:程序博客网 时间:2024/06/10 05:49
- 语法分析
语法分析表达式过程中处理数值定义
static void simpleexp (LexState *ls, expdesc *v) { FuncState *fs = ls->fs; switch (ls->t.token) { case TK_NUMBER: { /* simpleexp -> NUMBER */ Number r = ls->t.seminfo.r; next(ls); luaK_number(fs, r); //定义数字 break; }
- 类型判定
void luaK_number (FuncState *fs, Number f) { if (f <= (Number)MAXARG_S && (Number)(int)f == f) luaK_code1(fs, OP_PUSHINT, (int)f); //处理短整数short integer else luaK_code1(fs, OP_PUSHNUM, number_constant(fs, f)); //处理浮点数等其他数字}
如果不是整型,那么从函数Proto.knum[]数组中查找是否有过同数字定义,如果有则返回序号,没有则添加并返回序号,同时将该数组大小加一:
static int number_constant (FuncState *fs, Number r) { Proto *f = fs->f; int c = f->nknum; int lim = c < LOOKBACKNUMS ? 0 : c-LOOKBACKNUMS; while (--c >= lim) //寻找是否有过同数值定义 if (f->knum[c] == r) return c; luaM_growvector(fs->L, f->knum, f->nknum, 1, Number, "constant table overflow", MAXARG_U); c = f->nknum++; //数组大小增加 f->knum[c] = r; //将数值赋值进新的数组元素 return c;}
代码生成
代码生成主要是调用luaK_code2,主要流程:
//获取前面一条指令,主要供优化使用Instruction i = previous_instruction(fs);//从luaK_opproperties结构体定义中获取该条指令对堆栈大小的影响int delta = luaK_opproperties[o].push - luaK_opproperties[o].pop;//代码优化开关,初始为不优化int optm = 0//这里根据指令类型,处理delta等,同时判定是否需要对该条指令进行优化switch (o) { case OP_CLOSURE: { delta = -arg2+1; break; } }//这个函数用来修正FuncState结构中关于本函数的堆栈大小数值//包括stacklevel和proto结构中的maxstacksizeluaK_deltastack(fs, delta);//如果需要优化,这里将上一条指令覆盖为优化代码 if (optm) { /* optimize: put instruction in place of last one */ fs->f->code[fs->pc-1] = i; /* change previous instruction */ return fs->pc-1; /* do not generate new instruction */ }//代码不需要优化,根据代码类型,生成指令 switch ((enum Mode)luaK_opproperties[o].mode) { case iO: i = CREATE_0(o); break; case iU: i = CREATE_U(o, arg1); break; case iS: i = CREATE_S(o, arg1); break; case iAB: i = CREATE_AB(o, arg1, arg2); break; }//扩展代码内存大小,填充新生成的指令luaM_growvector(fs->L, fs->f->code, fs->pc, 1, Instruction, "code size overflow", MAX_INT);fs->f->code[fs->pc] = i;
0 0
- lua4.0数值定义
- Lua4.0中的函数
- Lua4.0中的函数
- Lua4.0中的函数
- lua4.0中实现% 取余操作
- Lua4.0 实现#操作,获取table大小
- 用lua4.0模仿c++的指针和类
- Lua4虚拟机运行概述
- Lua4虚拟机运行概述
- 四分位数(定义、位置、数值)
- 李祥对数值策划的定义
- 一个数值计算中通常很有用的数值的定义和计算
- C++常用数值类型的值范围的宏定义
- C++常用数值类型的值范围的宏定义
- 【c++程序】通过指针修改定义的数值
- C语言常用占位符及各进制数值定义
- 求三个数值的中间值的宏定义
- C++常用数值类型的值范围的宏定义
- JAVA与SQL 中的null与NULL
- activiti5.20简单介绍(十) -- spring和业务关联
- 【Codeforces 645E】【贪心】Intellectual Inquiry
- 页面置换算法
- YAML 语言教程
- lua4.0数值定义
- android studio eclipse转as
- stage3d 限制
- android2
- 详细图解如何注册 Navicat for Mysql 11.0.17 企业版(Win7 64bit)
- MySQL C API programming tutorial
- 算法-字符串的全排列
- sip里面的几个概念,会话 事务
- Vue.js快速入门实例