[√]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);
目录
相关文章
lua.c:82:10: fatal error: readline/readline.h: 没有那个文件或目录
lua.c:82:10: fatal error: readline/readline.h: 没有那个文件或目录
34 0
|
XML 自然语言处理 Java
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
560 0
【Lua基础 第5章 】unpack()和pack()、Lua 中的文件 I/O、简单模式下io的部分方法、完全模式下file的部分方法、日期和时间、闭包使用
|
网络协议 C语言
Wireshark lua dissector 对TCP消息包合并分析
Wireshark lua dissector 对TCP消息包合并分析
688 0
【Lua篇】静态代码扫描分析(四)规则检查
通过前面三篇文章已经初步实现了将Lua源代码文件读取解析成语法树,现在就可以通过得到的语法树进行指定规则的代码扫描检查。下图简单列举了一下单个Lua文件内部的语法关系情况(注意并非真正的类图,也没有列举完全部的节点类型)。
402 0
【Lua篇】静态代码扫描分析(四)规则检查
|
自然语言处理 C++
【Lua篇】静态代码扫描分析(三)语法分析
一、语法分析 通过将词法分析获取的Token流按照目标语言的语法进行解析的过程,例如解析函数声明、函数调用、变量声明、各种语句等。 二、Lua语法分析 在写语法分析程序前,先需要了解Lua的语句和语法,然后进行逐个解析。 下面简单列举一下Lua的语句:
365 0
【Lua篇】静态代码扫描分析(三)语法分析
|
自然语言处理
【Lua篇】静态代码扫描分析(二)词法分析
词法分析(英语:lexical analysis)是计算机科学中将字符序列转换为单词(Token)序列的过程。进行词法分析的程序或者函数叫作词法分析器(Lexical analyzer,简称Lexer),也叫扫描器(Scanner)。词法分析器一般以函数的形式存在,供语法分析器调用。
312 0
【Lua篇】静态代码扫描分析(二)词法分析
|
安全
【Lua篇】静态代码扫描分析(一)
静态代码分析是一种通过检查代码而不是执行程序来发现源代码中错误的手段。通常可以帮助我们发现常见的编码错误,例如: 语法错误 违反制定的标准编码 未定义的变量 安全性问题 静态代码分析可以通过评估编写的代码来提高代码质量;可以稳定的运行且可以轻松自动化;增加了在源代码中发现漏洞的可能性,从而提高应用安全;由于是针对源码扫描可以在离线的开发环境中完成。但是静态代码分析并不能完全保证编写的代码没有Bug,它也有一些缺点,
817 0
【Lua篇】静态代码扫描分析(一)

相关产品

  • 云迁移中心