标签: lua-api

使用嵌入式lua从C代码打印stacktrace

如果我理解正确,默认情况下Lua会在发生错误时调用调试库"debug.traceback".

但是,当将Lua嵌入到C代码中时,就像这里的示例中所做的那样: 简单的Lua API示例

我们只在堆栈顶部提供错误消息.

if (status) {
    /* If something went wrong, error message is at the top of */
    /* the stack */
    fprintf(stderr, "Couldn't load file: %s\n", lua_tostring(L, -1));

    /* I want to print a stacktrace here. How do I do that? */
    exit(1);
}
Run Code Online (Sandbox Code Playgroud)

初始错误后如何从C打印堆栈跟踪?

lua stack-trace traceback lua-api

19
推荐指数
3
解决办法
1万
查看次数

从C API调用的Lua脚本的执行时间限制

luaL_loadfile(mState, path.c_str());
lua_pcall(mState, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

有没有办法为那两个加载然后执行lua文件的C++语句设置执行时间限制(例如10-20秒)?

由于Lua文件不受信任,我不希望恶意用户在Lua代码中无限循环地无限期挂起程序.

标记C因为Lua API是C,标记C++因为我使用的是C++

c c++ lua lua-api

9
推荐指数
1
解决办法
3916
查看次数

如何使用C API创建嵌套的Lua表

我想创建一个像这样的表

myTable = {
    [0] = { ["a"] = 4, ["b"] = 2 },
    [1] = { ["a"] = 13, ["b"] = 37 }
}
Run Code Online (Sandbox Code Playgroud)

使用C API?

我目前的做法是

lua_createtable(L, 0, 2);
int c = lua_gettop(L);
lua_pushstring(L, "a");
lua_pushnumber(L, 4);
lua_settable(L, c);
lua_pushstring(L, "b");
lua_pushnumber(L, 2);
lua_settable(L, c);
Run Code Online (Sandbox Code Playgroud)

在循环中创建内部表.之前,这个循环,我用

lua_createtable(L, 2, 0);
int outertable = lua_gettop(L);
Run Code Online (Sandbox Code Playgroud)

为2个数字槽创建外部表.

但是如何将内部表保存到外部表?

c++ lua lua-api lua-table

8
推荐指数
2
解决办法
2万
查看次数

在Lua C API中克隆Lua表

有很多关于如何在Lua中克隆Lua表的示例,但是我无法找到如何使用本机Lua C API执行此操作的任何示例.我试图用手做两次,但结果却是一个真正的(虽然有效)混乱.

有没有人有关于如何在C API中优雅地执行Lua表的浅表副本的任何提示或链接?

c lua lua-api

7
推荐指数
1
解决办法
2805
查看次数

从lua_pcall(L,0,0,0)获取所有错误

是否有可能从C/C++中获取lua堆栈中的所有错误?这是我尝试过的

C++

int main()
{
    lua_State* L = luaL_newstate();
    luaL_openlibs(L);

    if (luaL_loadfile(L, "LuaBridgeScript.lua"))
    {
        throw std::runtime_error("Unable to find lua file");
    }

    int error = lua_pcall(L, 0, 0, 0);
    while (error && lua_gettop(L))
    {
        std::cout << "stack = " << lua_gettop(L) << "\n";
        std::cout << "error = " << error << "\n";
        std::cout << "message = " << lua_tostring(L, -1) << "\n";
        lua_pop(L, 1);
        error = lua_pcall(L, 0, 0, 0);
    }
}
Run Code Online (Sandbox Code Playgroud)

LUA:

printMessage("hi")
printMessage2("hi2")
Run Code Online (Sandbox Code Playgroud)

输出:

stack = 1
error = …
Run Code Online (Sandbox Code Playgroud)

c++ lua lua-api

7
推荐指数
1
解决办法
3428
查看次数

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

我想通过调用lua_setfenv()在自己的环境中执行不受信任的.lua文件,这样它就不会影响我的任何代码.

该功能的文档虽然只解释了如何调用函数,而不是如何执行文件.

目前运行我使用的文件:

int error = luaL_loadfile(mState, path.c_str()) || lua_pcall(mState, 0, 0, 0);
Run Code Online (Sandbox Code Playgroud)

我是否必须使用C API调用"dofile"lua函数lua_setfenv,或者是否有更优雅的方法来执行此操作?

c c++ lua lua-api

6
推荐指数
2
解决办法
4033
查看次数

lua_open使用luaJIT返回null

使用最近的luaJIT lua_open返回null.常规的lua库不会发生这种情况.

lua_State *L = lua_open();
std::cout << L << std::endl;
Run Code Online (Sandbox Code Playgroud)

输出: 0x0

我怎样才能让luaJIT工作?

SSCCE:

#include <iostream>
#include <luajit-2.0/lua.hpp>
//linked library: libluajit-5.1.a

int main(int argc, const char * argv[])
{
    lua_State *L = luaL_newstate(); // lua_open();
    std::cout << L << std::endl; // 0x0
}
Run Code Online (Sandbox Code Playgroud)

其他信息:从源内置在OSX 10.9(尝试都2.0.2和从GIT)与makemake install.使用编译器:

$ cc --version
Apple LLVM version 5.0 (clang-500.2.79) (based on LLVM 3.3svn)
Target: x86_64-apple-darwin13.0.0
Thread model: posix
Run Code Online (Sandbox Code Playgroud)

(使用luajit命令行应用程序luajit工作正常,测试脚本可以正常执行.)

c++ lua embedding luajit lua-api

6
推荐指数
1
解决办法
2156
查看次数

从C读Lua表

我正在尝试将Lua表传递给我的C程序,但我不知道该怎么做.

我的Lua代码:

local stages = {}
stages[1] = stage1
stages[2] = stage2
stages[3] = stage3

lstage.buildpollingtable(stages)
Run Code Online (Sandbox Code Playgroud)

我的C代码:

static int lstage_build_polling_table (lua_State * L) {    
    luaL_checktype(L, 1, LUA_TTABLE);

    lua_getfield(L, 1, "stage1");
    lua_getfield(L, 1, "stage2");
    lua_getfield(L, 1, "stage3");

    stage_t s1 = lstage_tostage(L, -3);
    stage_t s2 = lstage_tostage(L, -2);
    stage_t s3 = lstage_tostage(L, -1);

    printf("%d\n",s1->priority);
    printf("%d\n",s2->priority);
    printf("%d\n",s3->priority);

    return 1;
}
Run Code Online (Sandbox Code Playgroud)

我需要做什么来运行所有元素?此代码生成如下错误:

错误的参数#-3到'buildpollingtable'(lstage-Stage*预期,得到表)

谁能解释我做错了什么?

c lua lua-api lua-table

6
推荐指数
1
解决办法
609
查看次数

lua_Integer和lua_createtable(表大小限制)

在Lua 5.3中,C API中的表相关函数接收和返回lua_Integer.

void lua_rawgeti (lua_State *L, int idx, lua_Integer n);
void lua_rawseti (lua_State *L, int idx, lua_Integer n);
lua_Integer luaL_len (lua_State *L, int index);
Run Code Online (Sandbox Code Playgroud)

但是,lua_createtable仍然收到int.

void lua_createtable (lua_State *L, int narr, int nrec);
Run Code Online (Sandbox Code Playgroud)

在下面的示例函数中,源表的长度用于创建大小相同的副本.

static int copy_sequence(lua_State *L) {
   lua_Integer len, i;
   luaL_checktype(L, 1, LUA_TTABLE);
   len = luaL_len(L, 1);
   lua_createtable(L, (int)len, 0); /* conversion warning */
   for (i = 1; i <= len; i++) {
      lua_rawgeti(L, 1, i);
      lua_rawseti(L, -2, i);
   }
   return …
Run Code Online (Sandbox Code Playgroud)

c lua lua-api lua-5.3

6
推荐指数
1
解决办法
736
查看次数

从C语言中,如何打印Lua堆栈的内容?

我的 C 程序可能有一个愚蠢的错误。在某个点上,Lua 堆栈不包含我认为应该包含的值。

为了调试它,我想在程序的某个点打印Lua堆栈的内容。我怎样才能做到这一点而不弄乱进程中的堆栈?

c lua lua-api

6
推荐指数
2
解决办法
4873
查看次数

标签 统计

lua ×10

lua-api ×10

c ×6

c++ ×5

lua-table ×2

embedding ×1

lua-5.3 ×1

luajit ×1

stack-trace ×1

traceback ×1