Lua如何处理堆栈?
Posted
技术标签:
【中文标题】Lua如何处理堆栈?【英文标题】:How Lua deal with the stack? 【发布时间】:2012-08-06 08:29:24 【问题描述】:我正在尝试 Lua,想知道 lua_State 是如何工作的 代码及结果:
state.c
#include <stdio.h>
#include "lua/src/lua.h"
#include "lua/src/lauxlib.h"
static void stackDump(lua_State *L)
int i;
int top = lua_gettop(L);
for(i = 1; i<= top; i++)
int t = lua_type(L, i);
switch(t)
case LUA_TSTRING:
printf("'%s'", lua_tostring(L, i));
break;
case LUA_TBOOLEAN:
printf(lua_toboolean(L, i) ?"true":"false");
break;
case LUA_TNUMBER:
printf("%g", lua_tonumber(L, i));
break;
default:
printf("%s", lua_typename(L, t));
break;
printf(" ");
printf("\n");
static int divide(struct lua_State *L)
double a = lua_tonumber(L, 1);
double b = lua_tonumber(L, 2);
printf("%p\n", L);
stackDump(L);
int quot = (int)a / (int)b;
int rem = (int)a % (int)b;
lua_pushnumber(L, quot);
lua_pushnumber(L, rem);
stackDump(L);
printf("---end div---\n");
return 2;
int main(void)
struct lua_State *L = lua_open();
lua_pushboolean(L, 1);
lua_pushnumber(L, 10);
lua_pushnil(L);
lua_pushstring(L, "hello");
printf("%p\n", L);
stackDump(L);
lua_register(L, "div", divide);
luaL_dofile(L, "div.lua");
stackDump(L);
lua_close(L);
return 0;
div.lualocal c = div(20, 10)
0x100c009e0 真 10 nil '你好' ---开始 div--- 0x100c009e0 20 10 20 10 2 0 ---结束 div--- true 10 nil '你好'
我看到divide
中的lua_State
与main
相同,但是它们在堆栈中有不同的数据,这是怎么做的?
我知道最好的方法是阅读 Lua 的源代码,也许你可以告诉我在哪里可以找到合适的地方。
【问题讨论】:
我不明白你的问题。您是在问为什么他们在堆栈上有不同的信息,或者究竟是什么? 是的,就像你说的那样。(相同的 lua_State 但保存不同的数据)。对不起我的英语不好:) 这并没有把事情弄清楚。您是在问如何它获取不同的数据(即:Lua 在幕后对lua_State
做了什么来提供新数据),还是为什么堆栈有不同的数据?还是您完全是在问别的问题?
how it gets different data
,这个问题。
【参考方案1】:
认为 lua_State 包含 Lua 堆栈,以及界定堆栈当前可见部分的索引。当你调用一个 Lua 函数时,看起来你有一个新的堆栈,但实际上只有索引发生了变化。这是简化版。
lua_State
在lstate.h
中定义。我已经为您提取了相关部分。 stack
是包含所有内容的大 Lua 堆栈的开始。 base
是当前函数堆栈的开头。这就是您的函数在执行时所看到的“堆栈”。
struct lua_State
/* ... */
StkId top; /* first free slot in the stack */
StkId base; /* base of current function */
/* ... */
StkId stack_last; /* last free slot in the stack */
StkId stack; /* stack base */
/* ... */
;
Programming in Lua, 2nd Edition 在第 30 章:线程和状态中讨论了 Lua 状态。你会在那里找到一些很好的信息。例如,lua_State
不仅代表一个 Lua 状态,还代表一个处于该状态的线程。此外,所有线程都有自己的堆栈。
【讨论】:
【参考方案2】:它以相同的方式获取不同的数据任何东西获取不同的数据:代码更改对象内部的数据。
struct Object
int val;
;
void more_stuff(Object *the_data)
//the_data->val has 5 in it now.
void do_stuff(Object *the_data)
int old_val = the_data->val;
the_data->val = 5;
more_stuff(the_data);
the_data->val = old_val;
int main()
Object my_data;
my_data.val = 1;
//my_data.val has 1.
do_stuff(&my_data);
//my_data.val still has 1.
【讨论】:
我可以想象逻辑.....也许它只是简单。我会阅读 Lua 代码,谢谢。【参考方案3】:当 Lua 调用一个注册的 C 函数时,它会给它一个新的栈帧。
【讨论】:
以上是关于Lua如何处理堆栈?的主要内容,如果未能解决你的问题,请参考以下文章
lua中是 ffi 解析 是如何处理数据包的/pkt是如何传进去的