Lua如何处理堆栈?

我正在尝试 Lua 并想知道 lua_State 如何工作。

state.c 中的代码和结果:

div.lua 中的代码:

local c = div(20, 10)

我发现 divide 函数中的 lua_Statemain 中的是相同的,但它们在栈中具有不同的数据,这是如何实现的?

我知道了解这个的最好方法是阅读 Lua 的源代码,也许您可以告诉我在哪里找到正确的位置。

点赞
用户734069
用户734069

它以与 任何事物 获取不同数据的方式获取不同的数据:代码改变对象内部的数据。

struct Object
{
  int val;
};

void more_stuff(Object *the_data)
{
  //the_data->val 现在等于 5。
}

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 等于 1。
  do_stuff(&my_data);
  //my_data.val 仍旧等于 1。
}
2012-08-09 08:21:00
用户107090
用户107090

当 Lua 调用一个已注册的 C 函数时,它会为其提供一个新的栈帧。

2012-08-09 11:38:46
用户856565
用户856565

lua_State想象为包含 Lua 堆栈以及界定当前可见部分的索引。当您调用Lua函数时,它可能看起来像您有一个新的堆栈,但实际上只有索引发生了更改。这是简化版本。

lua_Statelstate.h 中定义。 我已经为您提取了相关部分。 stack 是包含所有内容的大型 Lua 堆栈的开头。 base 是当前函数堆栈的开头。当函数执行时,这就是您的函数视为“堆栈”的内容。

struct lua_State {
  /* ... */
  StkId top;  /* 栈内第一个空闲槽 */
  StkId base;  /* 当前函数的栈基 */
  /* ... */
  StkId stack_last;  /* 栈内最后一个空闲槽 */
  StkId stack;  /* 栈底 */
  /* ... */
};

第30章“线程和状态”讨论了 Lua 状态,您将在其中找到一些有用的信息。例如,lua_State 不仅表示 Lua 状态,而且还表示该状态中的一个线程。此外,所有线程都有自己的堆栈。

2012-10-10 02:01:44