2

私は 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.lua
local c = div(20, 10)

0x100c009e0
true 10 nil 'hello'
---start div---
0x100c009e0
20 10
20 10 2 0
---end div---
true 10 nil 'hello'

私はlua_State同じdivideものと同じですがmain、スタック内のデータが異なります。これはどのように行われますか?

これを理解する最善の方法は Lua のソース コードを読むことです。適切な場所を見つける場所を教えてください。

4

3 に答える 3

3

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 の状態だけでなく、その状態内のスレッドも表します。さらに、すべてのスレッドには独自のスタックがあります。

于 2012-10-10T02:01:44.467 に答える
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.
}
于 2012-08-09T08:21:00.460 に答える
0

Lua が登録済みの C 関数を呼び出すと、新しいスタック フレームが与えられます。

于 2012-08-09T11:38:46.067 に答える