[√]lua binding模版文件分析

简介: [√]lua binding模版文件分析

layout_head.h和layout_foot.h控制头文件

image.png

layout_head.c 和layout_foot.c控制注册入口

image.png

遇到的一个问题

正常情况下,生成的lua-binding代码

// 定义指针变量
cocos2d::Texture2D* arg0;
// 将lua层的值赋给arg0,对to_object来说,他需要的是二级指针
ok &= luaval_to_object<cocos2d::Texture2D>(tolua_S, 2, "cc.Texture2D",&arg0, "cc.GarbageCollection:addGcIgnoreWithTexture");
// 传递给接口
bool ret = cobj->addGcIgnoreWithTexture(arg0);

不能满足需求的binding代码如下

 cocos2d::Vec2* arg2;
 // 对luaval_to_vec2来说,它需要args2是一个可写的内存区域,显然这部分binding代码有问题
 ok &= luaval_to_vec2(tolua_S, 4, &arg2, "MapUtil:Pixel2Grid");
 cocos2d::Vec2 ret = MapUtil::Pixel2Grid(arg0, arg1, arg2);

Pixel2Grid函数的c++实现如下,第三个参数是一个指针,本意是希望外部分配好内存,接口内部修改就行了

Vec2 Pixel2Grid(Vec2 pixel, bool needPosInGrid = false, Vec2* out = nullptr){}

所以我修改了luabing的处理逻辑

def to_string(self, generator):
    # ...
    if self.is_pointer and name.endswith('*'):
        name = name[:-1] #将*去掉了

最终生成的binding代码如下

cocos2d::Vec2 arg2;// 定义为局部变量
ok &= luaval_to_vec2(tolua_S, 4, &arg2, "MapUtil:Pixel2Grid");
//                                                  取地址
cocos2d::Vec2 ret = MapUtil::Pixel2Grid(arg0, arg1, &arg2);

binding代码是符合了预期,但是让流程变得不通用,导致其他binding出现了问题

解决办法只能暂时手动修改了

本质原因,如果参数是Vec2*指针类型,说明数据来自lua层,就需要定义为局部变量

sfunction.c中arg.to_string($generator)决定了参数类型是怎么生成的

总结

使用cheetah模版lua binding也存在局限性,灵活性还有学习成本有点高,其实js的模版引擎有很多,在生态方面也要比python更好,并且配套的vscode体验也非常好,不过碍于当年nodejs并没有起来,所以只能选择使用python。

我使用过的js模版引擎有ejsjade

EJS(Embedded JavaScript)和 Jade(现在改名为 Pug)都是流行的模板引擎,用于在服务器端生成 HTML 或其它文本格式的内容。它们具有不同的语法和特性。

以下是 EJS 和 Pug(Jade)的简介和使用方法:

EJS:

  • 语法更接近于原生的 JavaScript,使用 <% %> 标签来执行 JavaScript 代码,使用 <%= %> 来输出变量值。
  • 可以直接在模板中嵌入 JavaScript 代码,非常灵活。
  • 支持循环和条件语句等常见控制结构。
  • 安装 EJS:npm install ejs

使用示例:

const ejs = require('ejs');
const template = 'Hello, <%= name %>!';
const html = ejs.render(template, { name: 'Alice' });
console.log(html);

Pug(Jade):

  • 使用缩进代替大括号来表示代码块,使用类似于 CSS 选择器的语法来描述 HTML 结构。
  • 语法简洁、优雅,减少了冗余的标记符号。
  • 支持混合(mixins)和布局(layout)的功能,方便地重用代码和组织页面结构。
  • 安装 Pug(Jade):npm install pug

使用示例:

const pug = require('pug');
const template = `html
  head
    title My Page
  body
    h1 Hello, #{name}!`;
const compiledTemplate = pug.compile(template);
const html = compiledTemplate({ name: 'Alice' });
console.log(html);
目录
相关文章
|
1月前
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
Lua的面向对象编程、协同线程与协同函数的概念和使用,以及Lua文件I/O操作的基本方法。
27 4
lua面向对象(类)和lua协同线程与协同函数、Lua文件I/O
|
5月前
|
XML 编译器 C++
一篇文章讲明白lua文件是什么?
一篇文章讲明白lua文件是什么?
64 1
|
5月前
|
数据挖掘 Linux 数据处理
探索Linux下的Lua命令:轻量级脚本语言在数据处理和分析中的应用
**探索Linux上的Lua:轻量级脚本语言用于数据处理。Lua通过命令行解释器执行,适用于游戏开发、数据分析及自动化。特点包括小巧、高效、可扩展和动态类型。使用`lua`或`luajit`,配合-e、-l、-i参数执行脚本或互动模式。示例:执行`hello.lua`脚本打印&quot;Hello, Lua!&quot;。最佳实践涉及版本兼容、性能优化、使用C API、测试和文档编写。**
|
网络协议 C语言
Wireshark lua dissector 对TCP消息包合并分析
Wireshark lua dissector 对TCP消息包合并分析
819 0
|
C++
[✔️]unreal插件lua-profiler:分析lua性能
[✔️]unreal插件lua-profiler:分析lua性能
356 0
|
XML 自然语言处理 Java
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
860 0
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
lua.c:82:10: fatal error: readline/readline.h: 没有那个文件或目录
lua.c:82:10: fatal error: readline/readline.h: 没有那个文件或目录
80 0
|
安全
【Lua篇】静态代码扫描分析(一)
静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段。通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问题 静态代码分析可以通过评估编写的代码来提高代码质量;可以稳定的运行且可以轻松自动化;增加了在源代码中发现漏洞的可能性,从而提高应用安全;由于是针对源码扫描可以在离线的开发环境中完成。但是静态代码分析并不能完全保证编写的代码没有Bug,它也有一些缺点,
974 0
【Lua篇】静态代码扫描分析(一)
【Lua篇】静态代码扫描分析(四)规则检查
通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查。下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图,也没有列举完全部的节点类型)。
514 0
【Lua篇】静态代码扫描分析(四)规则检查