Tag: lua

使用C API的弱表和GC终结器

我试图通过使用C API将其存储在弱表中来为函数值创建GC终结器。 我开始在纯Lua 5.2中编写原型: local function myfinalizer() print ‘Called finalizer’ end function myfunc() print ‘Called myfunc’ end local sentinels = setmetatable({}, { __mode=’k’ }) sentinels[myfunc] = setmetatable({}, { __gc=myfinalizer }) myfunc() myfunc = nil collectgarbage ‘collect’ print ‘Closing Lua’ 结果输出: Called myfunc Called finalizer Closing Lua 原型似乎按预期工作。 以下是C版: #include #include #include “lua.h” #include “lualib.h” #include […]

C的哪些部分最便携?

我最近阅读了Lua共同创作者Luiz H. de Figueredo和Roberto Ierusalimschy的采访,他们在那里讨论了Lua的设计和实现。 至少可以说是非常有趣的。 然而,讨论的一部分在我的脑海中带来了一些东西。 Roberto称Lua是一个“ 独立应用程序 ”(也就是说,它是纯粹的ANSI C,它不使用操作系统。)他说,Lua的核心是完全可移植的,并且因为它的纯度已经能够移植很多更容易和甚至从未考虑过的平台(例如机器人和嵌入式设备)。 现在这让我很奇怪。 C一般来说是一种非常便携的语言。 那么,C的哪些部分(即标准库中的部分)是最不可移植的? 什么是可以预期在大多数平台上工作的? 是否应该只使用一组有限的数据类型(例如避免short和可能float )? FILE和stdio系统怎么样? malloc和free ? 似乎Lua避免了所有这些。 这会把事情发挥到极致吗? 或者它们是可移植性问题的根源? 除此之外,还有什么其他方法可以使代码非常便携? 我问这一切的原因是因为我目前正在用纯C89编写一个应用程序,并且它最好是尽可能便携。 我愿意采取一条中间路来实现它(足够便携,但没有那么多,我必须从头开始编写所有内容。)无论如何,我只是想看看编写最佳C代码的关键。 最后,所有这些讨论仅与C89有关。

为什么内部Lua字符串以他们的方式存储?

我想要一个简单的字符串表来存储一堆常量,我想“嘿!Lua那样做,让我使用一些函数!” 这主要是在lstring.h / lstring.c文件中(我使用的是5.2) 我将首先展示我很好奇的代码。 它来自lobject.h /* ** Header for string value; string bytes follow the end of this structure */ typedef union TString { L_Umaxalign dummy; /* ensures maximum alignment for strings */ struct { CommonHeader; lu_byte reserved; unsigned int hash; size_t len; /* number of characters in string */ } tsv; } TString; […]

LuaL_openlibs()和沙盒脚本

我在一个C / C ++应用程序中嵌入了Lua(5.1)。 我正在使用LuaL_openlibs()函数来加载基础库。 但是,此函数会加载一些我想要禁用的其他库,以便它们不能用于我的Lua脚本。 具体来说,我想禁用IO和OS模块。 是否有一个函数我可以调用程序性地禁用(或卸载)这些模块,以便我可以创建一个安全的沙箱环境来运行Lua脚本?

如何从C API在自己的环境中执行不受信任的Lua文件

我想通过调用lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码。 该function的文档虽然只解释了如何调用函数,而不是如何执行文件。 目前运行我使用的文件: int error = luaL_loadfile(mState, path.c_str()) || lua_pcall(mState, 0, 0, 0); 我是否必须使用lua_setfenv从C API调用“dofile”lua函数,还是有更优雅的方法呢?

使用Lua表C API创建一个简单的表

我正在运行一个总是返回4行的MySQL查询: row->name , row->date , row->ip , row->custom 我想要实现的是基于上面的结果创建一个简单的表,所以它看起来像: { “name” = result of row->name, “date” = result of row->date, “ip” = result of row->ip, “custom” = result of row->custom } 我已经尝试了多种可能性,但发布的示例确实多种多样,我在使其工作时遇到了问题。 我最后一次尝试不成功: lua_createtable(L, 0, 4); top = lua_gettop(L); lua_pushstring(L, “name”); lua_pushstring(L, row->name); lua_pushstring(L, “date”); lua_pushnumber(L, row->date); lua_pushstring(L, “ip”); lua_pushstring(L, row->ip); lua_pushstring(L, “custom”); lua_pushstring(L, row->custom); […]

现代VM如何处理内存分配?

我正在研究用C编写的简单堆栈机器,主要用于学习目的。 在使用malloc/free进行内存操作之后,我认为从现代虚拟机中读取一些特定于内存分配的代码是个好主意。 我下载了Lua源代码并开始阅读它。 过了一会儿,我意识到涉及很多宏的东西,我找不到真正的内存分配完成的代码(即malloc调用)。 find . -exec grep -i “malloc” ‘{}’ \; -print 它只打印了一些名称中包含malloc单词的Lua宏。 Lua VM(和编程语言)根本不使用malloc ! 所以这引出了一个问题:现代VM如何处理内存分配? Lua如何从堆中分配内存? 除了malloc之外,还有什么方法可以进行分配吗? 其他方法的优缺点是什么? 我也想知道安全地处理分配的内存的最佳实践,设计模式等。 我在Lua的源代码中看到,在分配内存之前有很多间接。 我在哪里可以了解这些东西?

从freeRTOS运行应用程序

我目前正在开发我公司正在开发的消费电子产品的操作系统。 我已经决定将freeRTOS作为我们操作系统的主干,并且正在努力在操作系统中实现硬件function。 但是,我遇到了一个关于在freeRTOS中运行第三方应用程序的问题。 最初我认为任务是一个应用程序,基本上你有“myapplication.c”和“myapplication.h”包含所有应用程序必需的函数,代码将驻留在任务中的for(;;)循环中(作为一个主要的while循环)。 然后,当用户决定运行该应用程序时,会将一个函数指针传递给队列,然后我的app_launcher任务会使用第三方任务或应用程序创建新任务。 然而,这种方法的问题是操作系统已经被编译并驻留在微控制器上,并且可以根据用户的需要安装和删除应用程序……显然,应用程序需要从操作系统进行编译和执行。 在标准的unix机器上,我会使用fork之类的东西来选择可执行文件并给它自己的进程。 但是我在freeRTOS中找不到类似的function..我的另一个想法是接近应用程序开发的脚本语言,但我不知道如何启动这些应用程序…… 所以问题是,我如何让freeRTOS从尚未融入操作系统的第三方开发人员那里运行应用程序?

使用Lua C API迭代表的表

我正在尝试迭代Lua中的表格并输出: 每个表的关键。 每个表中每个条目的键/值对。 这是代码: void print_table(lua_State *L) { lua_pushnil(L); while(lua_next(L, -2) != 0) { const char *key = lua_tostring(L, -2); if(lua_isstring(L, -1)) printf(“%s = %s”, key, lua_tostring(L, -1)); else if(lua_isnumber(L, -1)) printf(“%s = %d”, key, lua_tonumber(L, -1)); else if(lua_istable(L, -1)) { printf(“%s”, key); PrintTable(L); } lua_pop(L, 1); } } } 这是我正在尝试输出的一个表的示例: s = { p […]

如何使用作为参数传递给lua C函数的表?

我将用C语言实现一个函数,它将由Lua脚本调用。 这个函数应该接收一个lua表作为参数,所以我应该读取表中的字段。我试着像下面这样做,但是当我运行它时我的函数崩溃了。 任何人都可以帮助我找到问题吗? /* function findImage(options) imagePath = options.imagePath fuzzy = options.fuzzy ignoreColor = options.ignoreColor; end Call Example: findImage {imagePath=”/var/image.png”, fuzzy=0.5, ignoreColor=0xffffff} */ // implement the function by C language static int findImgProxy(lua_State *L) { luaL_checktype(L, 1, LUA_TTABLE); lua_getfield(L, -1, “imagePath”); if (!lua_isstring(L, -1)) { error(); } const char * imagePath = lua_tostring(L, -2); lua_pop(L, […]