Tolua++技术文档 【转】

2023-11-23 06:58
文章标签 文档 技术 tolua

本文主要是介绍Tolua++技术文档 【转】,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!



原文地址:http://lua.codemach.com/tolua-ji-shu-wen-dang.html

1.简介

Tolua++是一个编程语言文本转换工具,主要用来将C/C++文件转化成lua需要的接口形式。即把大量的函数转成static int XXX(lua_State* tolua_S)形式,以供注册到lua里面。

Tolua++通过pkg文件来导出需要的类型,函数,对象。

Tolua –o test.c tarray.pkg

tarray.pkg里面是对应的要导出的内容,通常是用相应的.h文件通过pkg的编写规则改写过来。将生成的test.c与程序链接并添加少量代码,即可在lua脚本中访问导出的类和函数。具体介绍请看: http://www.codenix.com/~tolua/tolua++.html

2.实现原理

    C++在进行函数调用的时候是this指针+函数地址

     Lua提供用户自定义的userdata

      一般lua中持有c++对象是使用userdata来实现的(userdata 类型用来将任意 C 数据保存在 Lua 变量中. 这个类型相当于一块原生的内存, 除了赋值和相同性判断, Lua 没有为之预定义任何操作.通过使用 metatable (元表), 程序员可以为 userdata 自定义一组操作. metatable 中还可以定义一个函数gc让 userdata 作垃圾收集时调用它。

     因此,metatable可以用来模拟C++里面的函数,通过替换它来实现函数,类成员的查找。Userdata可以很方便的获取到转换成C++里面this指针。通过this指针+类的函数地址即可调用C++里面的类成员函数。

3.实现

  A.tolua++整体目录结构

src的目录中有

Src\bin下面是tolua++ 可执行的源码,主要是处理pkg文件生成.c文件

Src\lib 是tolua++ lib的源码,主要是为生成的.c文件里面的函数,类,对象映射给lua调用。

 

Bin的目录结构

Tolua.c文件主要是接收用户的命令行参数进行处理。并将相应参数的值放在lua栈中,存放在flags的表中,在lua的代码中也可以见到。后面根据宏TOLUA_SCRIPT_RUN进行判断是调用

C++的代码还是转调用lua代码。当修改了lua代码我们想马上看到效果的时候,应该定义这个宏。默认情况下,该宏是没有定义的。意味着将会调用C++的代码,在toluabind文件里面。

Toluabind.c这个文件也是由tolua++这个工具生成的,它将src\bin\lua下的lua代码生成这个c文件。将lua代码生成.c文件,主要是为了效率。Toluabind.c里面的代码对应于src\bin\lua\all.lua,主要加载src\bin\lua下面的lua代码。

 

Lib的目录结构

Tolua_event 主要提供模块,类对应的lua元方法。

Tolua_is 主要提供基础类型和用户定义类型的类型判断。

Tolua_map 很重要的一个类,添加模块,类,函数,成员,包括类的继承以及一些全局方法。

Tolua_push 提供压入基础类型,用户定义类型给lua

Tolua_to提供从lua中的对象还原到基础类型或者用户定义类型。

 

B.导出类型

   类型首先会被用tolua_usertype函数进行注册,内部也就是创建一个表。

 

C.导出成员变量

   成员变量主要通过tolua_variable(tolua_S,"x",tolua_get_Point_x,tolua_set_Point_x);来导出,tolua_variable将该变量的get和set方法分别放进了.get和.se表中。

 

D.导出函数

   函数会通过tolua_function导出,直接放在当前的模块表或者类表中。

 

E.导出对象

对象会通过tolua_cclass导出

TOLUA_API void tolua_cclass (lua_State*L, const char* lname, const char* name, const char* base, lua_CFunction col)

{

    …

         mapinheritance(L,name,base);  设置继承关系,默认继承自base

         mapinheritance(L,cname,name);

         …

         luaL_getmetatable(L,name);

         lua_rawset(L,-3);            设置类的metatable给module

 

}

 

F.关联

   在创建一个元表的时候,会调用tolua_newmetatable方法,代码如下:

   static inttolua_newmetatable (lua_State*L, char* name)

{

         int r = luaL_newmetatable(L,name);

         …

         if (r)

                   tolua_classevents(L); /* set meta events   */

         lua_pop(L,1);

         return r;

}

会调用tolua_classevents,这个函数会向当前的元表注册新的函数

         lua_pushstring(L,"__index");

         lua_pushcfunction(L,class_index_event);

         lua_rawset(L,-3);

         lua_pushstring(L,"__newindex");

         lua_pushcfunction(L,class_newindex_event);

         lua_rawset(L,-3);

         …

 

   __index对应的函数为class_index_event,当我们查找某个成员的时候,会路由到class_index_event中,在class_index_event中会向.get表进行查询,看看是否有相应的函数,这个函数在生成的.c文件中已经被注册了,所以可以正常访问。

   访问函数也是一样,通过

         lua_pushstring(L,"__call");

         lua_pushcfunction(L,class_call_event);

         lua_rawset(L,-3);

    路由到,class_call_event,,class_call_event直接查.call表找类的处理函数。

 

G综上,tolua++的内部主要靠表结构+替换元表的机制来实现在lua层模拟C++对象。

 

 

4.tolua++提供的机制

  A.Tolua++不仅仅可以处理pkg文件,也可以处理lua文件。所以在使用tolua++的过程中,可以通过-L属性来加载lua代码的文件,实现对指定类的补丁。

  B.tolua++支持在处理pkg代码的各个阶段进行hook,可实现function preparse_hook(package)等lua接口,详见
     http://www.codenix.com/~tolua/tolua++.html

  C. tolua++支持定制指定类的pushusertype,isusertype,tousertype操作

    _is_functions['Vector3'] = 'custom_is_vector3' -- checks for a 3d vector
                                               -- (either userdata, or a table with 3 values)
_to_functions['Vector3'] = 'custom_to_vector3' -- convertes the eventual table to a Vector3
 
_base_push_functions['Widget'] = 'custom_push_widget' -- pushes anything that inherits from Widget
  D.我们可以通过修改tolua++中的lua代码提供更多的机制,如自定义gc等。
 
5.tolua++对pkg格式的解析 
    
         调用 Package (name,fn)函数对文件进行解析,启动doit函数

                push(p)

                   pre_output_hook(p)

                   pop()

                   p:preamble()  //生成前言部分

                   p:supcode()   //生成代码

                   push(p)

                   pre_register_hook(p)

                   pop()

                   p:register()   //生成注册部分

                  push(p)

                   post_output_hook(p)

                   pop()

这篇关于Tolua++技术文档 【转】的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/416161

相关文章

使用Python快速实现链接转word文档

《使用Python快速实现链接转word文档》这篇文章主要为大家详细介绍了如何使用Python快速实现链接转word文档功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 演示代码展示from newspaper import Articlefrom docx import

浅析如何使用Swagger生成带权限控制的API文档

《浅析如何使用Swagger生成带权限控制的API文档》当涉及到权限控制时,如何生成既安全又详细的API文档就成了一个关键问题,所以这篇文章小编就来和大家好好聊聊如何用Swagger来生成带有... 目录准备工作配置 Swagger权限控制给 API 加上权限注解查看文档注意事项在咱们的开发工作里,API

SpringBoot3集成swagger文档的使用方法

《SpringBoot3集成swagger文档的使用方法》本文介绍了Swagger的诞生背景、主要功能以及如何在SpringBoot3中集成Swagger文档,Swagger可以帮助自动生成API文档... 目录一、前言1. API 文档自动生成2. 交互式 API 测试3. API 设计和开发协作二、使用

基于C#实现将图片转换为PDF文档

《基于C#实现将图片转换为PDF文档》将图片(JPG、PNG)转换为PDF文件可以帮助我们更好地保存和分享图片,所以本文将介绍如何使用C#将JPG/PNG图片转换为PDF文档,需要的可以参考下... 目录介绍C# 将单张图片转换为PDF文档C# 将多张图片转换到一个PDF文档介绍将图片(JPG、PNG)转

【专题】2024飞行汽车技术全景报告合集PDF分享(附原数据表)

原文链接: https://tecdat.cn/?p=37628 6月16日,小鹏汇天旅航者X2在北京大兴国际机场临空经济区完成首飞,这也是小鹏汇天的产品在京津冀地区进行的首次飞行。小鹏汇天方面还表示,公司准备量产,并计划今年四季度开启预售小鹏汇天分体式飞行汽车,探索分体式飞行汽车城际通勤。阅读原文,获取专题报告合集全文,解锁文末271份飞行汽车相关行业研究报告。 据悉,业内人士对飞行汽车行业

活用c4d官方开发文档查询代码

当你问AI助手比如豆包,如何用python禁止掉xpresso标签时候,它会提示到 这时候要用到两个东西。https://developers.maxon.net/论坛搜索和开发文档 比如这里我就在官方找到正确的id描述 然后我就把参数标签换过来

金融业开源技术 术语

金融业开源技术  术语 1  范围 本文件界定了金融业开源技术的常用术语。 本文件适用于金融业中涉及开源技术的相关标准及规范性文件制定和信息沟通等活动。

计算机毕业设计 大学志愿填报系统 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试

🍊作者:计算机编程-吉哥 🍊简介:专业从事JavaWeb程序开发,微信小程序开发,定制化项目、 源码、代码讲解、文档撰写、ppt制作。做自己喜欢的事,生活就是快乐的。 🍊心愿:点赞 👍 收藏 ⭐评论 📝 🍅 文末获取源码联系 👇🏻 精彩专栏推荐订阅 👇🏻 不然下次找不到哟~Java毕业设计项目~热门选题推荐《1000套》 目录 1.技术选型 2.开发工具 3.功能

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出

AI(文生语音)-TTS 技术线路探索学习:从拼接式参数化方法到Tacotron端到端输出 在数字化时代,文本到语音(Text-to-Speech, TTS)技术已成为人机交互的关键桥梁,无论是为视障人士提供辅助阅读,还是为智能助手注入声音的灵魂,TTS 技术都扮演着至关重要的角色。从最初的拼接式方法到参数化技术,再到现今的深度学习解决方案,TTS 技术经历了一段长足的进步。这篇文章将带您穿越时

系统架构设计师: 信息安全技术

简简单单 Online zuozuo: 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo 简简单单 Online zuozuo :本心、输入输出、结果 简简单单 Online zuozuo : 文章目录 系统架构设计师: 信息安全技术前言信息安全的基本要素:信息安全的范围:安全措施的目标:访问控制技术要素:访问控制包括:等保