当前位置: 首页 > news >正文

LuaJit分析(七)LuaJit -b 命令分析

Luajit -b 命令用于生成字节码文件,通过之前对 -bl命令的分析:

luajit -bl 命令分析

可知,-b系统的命令都通过执行 bcsave.lua脚本来完成, luajit -b命令最终是执行bcsave.lua脚本中的 bcsave函数,bcsave函数代码如下:

local function bcsave(ctx, input, output)local f = readfile(input)local s = string.dump(f, ctx.strip)local t = ctx.typeif not t thent = detecttype(output)ctx.type = tendif t == "raw" thenbcsave_raw(output, s)elseif not ctx.modname then ctx.modname = detectmodname(input) endif t == "obj" thenbcsave_obj(ctx, output, s)elsebcsave_c(ctx, output, s)endend
end

这通过关键的两个函数,来完成代码的转换:

local f = readfile(input)
local s = string.dump(f, ctx.strip)

由之前对luajit -b 命令的分析可知,readfile函数最终返回原型数据,如果是字节码文件,返回读取后的原型数据,否则进行源码分析再返回原型数据。接着通过string.dump返回完整的字节码文件,通过ctx.strip决定是否有调试信息,string.dump为库函数,位于lib_string.c中,实现如下:

LJLIB_CF(string_dump)
{GCfunc *fn = lj_lib_checkfunc(L, 1);int strip = L->base+1 < L->top && tvistruecond(L->base+1);SBuf *sb = lj_buf_tmp_(L);  /* Assumes lj_bcwrite() doesn't use tmpbuf. */L->top = L->base+1;if (!isluafunc(fn) || lj_bcwrite(L, funcproto(fn), writer_buf, sb, strip))lj_err_caller(L, LJ_ERR_STRDUMP);setstrV(L, L->top-1, lj_buf_str(L, sb));lj_gc_check(L);return 1;
}

最终是通过lj_bcwrite函数来完成字节码的生成,与lj_bcread对应。Lj_bcwriter位于lj_bcwriter.c文件中,代码如下:

int lj_bcwrite(lua_State *L, GCproto *pt, lua_Writer writer, void *data,int strip)
{BCWriteCtx ctx;int status;ctx.pt = pt;ctx.wfunc = writer;ctx.wdata = data;ctx.strip = strip;ctx.status = 0;lj_buf_init(L, &ctx.sb);status = lj_vm_cpcall(L, NULL, &ctx, cpwriter);if (status == 0) status = ctx.status;lj_buf_free(G(sbufL(&ctx.sb)), &ctx.sb);return status;
}

实质是调用 cpwriter函数,实现如下:

/* Protected callback for bytecode writer. */
static TValue *cpwriter(lua_State *L, lua_CFunction dummy, void *ud)
{BCWriteCtx *ctx = (BCWriteCtx *)ud;UNUSED(L); UNUSED(dummy);lj_buf_need(&ctx->sb, 1024);  /* Avoids resize for most prototypes. */bcwrite_header(ctx);bcwrite_proto(ctx, ctx->pt);bcwrite_footer(ctx);return NULL;
}

从这里就可以明显的看出,它通过分别生成头部、原型等数据来完成字节码的生成。

Bcsave函数中通过detecttype确定要保存的文件类型,代码如下:

local function detecttype(str)local ext = string.match(string.lower(str), "%.(%a+)$")return map_type[ext] or "raw"
end
local map_type = {raw = "raw", c = "c", h = "h", o = "obj", obj = "obj",
}

这里通过正则表达式匹配了输出文件后缀名,map_type中定义了几种后缀,除非特别指定了如obj等后缀名,否则都是返回raw.即执行bcsave_raw函数,实现如下:

local function bcsave_raw(output, s)local fp = savefile(output, "wb")bcsave_tail(fp, output, s)
end

这里最终将整个字节码文件写入到指定的文件名中。

总结:luajit -b生成字节码,实际上是调用 bcsave.lua脚本中的bcsave函数,该函数通过readfile函数(最终调用loadfile库函数)来完成lua脚本和字节码统一返回原型数据,并通过string.dump库函数生成完整的字节码文件。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 骨传导耳机哪款更值得入手?这五款精选让你避免踩雷的风险!
  • 阿里云数智服务创新挑战赛总决赛铜奖比赛攻略_NJUSME队
  • 【JVM原理】类加载机制
  • 《比较教育研究》
  • Qt Creator 配置pcl1.14.1
  • 电脑屏幕怎么添加水印
  • Qt 学习第7天:Qt核心特性
  • Vue——认识day04_计算属性(案例:实时预览)
  • 望繁信科技亮相2024数博会:以流程智能引领数字化转型新未来
  • KTH5701 系列低功耗、高精度 3D 霍尔传感器
  • 【蓝牙协议栈】【BLE】【GATT】精讲GATT Profile架构(图文并茂精华版)
  • Cesium 和 three.js 对数深度缓冲原理简析
  • 【58同城-注册安全分析报告】
  • 计算机网络 TCPUDP、IP、ARPRARP、NAT总结
  • 源代码加密软件有哪些?11款超好用的源代码加密软件推荐
  • 「译」Node.js Streams 基础
  • Angular js 常用指令ng-if、ng-class、ng-option、ng-value、ng-click是如何使用的?
  • Apache的80端口被占用以及访问时报错403
  • C++11: atomic 头文件
  • CAP 一致性协议及应用解析
  • CSS魔法堂:Absolute Positioning就这个样
  • CSS相对定位
  • MD5加密原理解析及OC版原理实现
  • mysql外键的使用
  • PyCharm搭建GO开发环境(GO语言学习第1课)
  • Python实现BT种子转化为磁力链接【实战】
  • 对JS继承的一点思考
  • 工作手记之html2canvas使用概述
  • 记录:CentOS7.2配置LNMP环境记录
  • 将回调地狱按在地上摩擦的Promise
  • 浏览器缓存机制分析
  • 你真的知道 == 和 equals 的区别吗?
  • 深度学习在携程攻略社区的应用
  • 双管齐下,VMware的容器新战略
  • 栈实现走出迷宫(C++)
  • 《天龙八部3D》Unity技术方案揭秘
  • 翻译 | The Principles of OOD 面向对象设计原则
  • ​html.parser --- 简单的 HTML 和 XHTML 解析器​
  • ​MySQL主从复制一致性检测
  • ​业务双活的数据切换思路设计(下)
  • #etcd#安装时出错
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #传输# #传输数据判断#
  • (C语言)求出1,2,5三个数不同个数组合为100的组合个数
  • (done) ROC曲线 和 AUC值 分别是什么?
  • (html转换)StringEscapeUtils类的转义与反转义方法
  • (MATLAB)第五章-矩阵运算
  • (windows2012共享文件夹和防火墙设置
  • (翻译)Entity Framework技巧系列之七 - Tip 26 – 28
  • (附源码)ssm高校运动会管理系统 毕业设计 020419
  • (附源码)基于ssm的模具配件账单管理系统 毕业设计 081848
  • (七)Appdesigner-初步入门及常用组件的使用方法说明
  • (四)opengl函数加载和错误处理
  • (微服务实战)预付卡平台支付交易系统卡充值业务流程设计
  • (转) Face-Resources