2

私のゲーム エンジンは、関数へのパラメーターとして値を lua スタックにプッシュし、lua_pcall を使用してそれを呼び出します。lua コードが実行され、追加の lua 関数が呼び出されます。最終的に、この lua コードは C 関数を呼び出します。この関数は、最初にスタックにプッシュされた値を取得できますか?

こんな感じです:

<engine function A>
  pushes parameter value X on to stack for lua
<lua func>
<lua func>
<lua func>
<engine function B>
  can I extract the values X that was pushed by function A here?
4

1 に答える 1

2

はい、getinfo、getlocal、getupvalue を組み合わせて使用​​すると、すべての情報を取得できます (set* 関数を使用してこれらの値を変更することもできます)。

これはMobDebugからのフラグメントで、各レベルのローカルと上位値のテーブルと共にスタック情報を返します。各レベルの変数は、コードに表示されるのと同じ順序で (パラメーターから開始して) インデックスが付けられます。各 get* 関数には、C の同等の関数 (lua_getinfo、lua_getlocal、および lua_getupvalue) を使用できますが、ロジックはまったく同じである必要があります。

local function stack(start)
  local function vars(f)
    local func = debug.getinfo(f, "f").func
    local i = 1
    local locals = {}
    while true do
      local name, value = debug.getlocal(f, i)
      if not name then break end
      if string.sub(name, 1, 1) ~= '(' then locals[name] = {value, tostring(value)} end
      i = i + 1
    end
    i = 1
    local ups = {}
    while func and true do -- check for func as it may be nil for tail calls
      local name, value = debug.getupvalue(func, i)
      if not name then break end
      ups[name] = {value, tostring(value)}
      i = i + 1
    end
    return locals, ups
  end

  local stack = {}
  for i = (start or 0), 100 do
    local source = debug.getinfo(i, "Snl")
    if not source then break end
    table.insert(stack, {
      {source.name, source.source, source.linedefined,
       source.currentline, source.what, source.namewhat, source.short_src},
      vars(i+1)})
    if source.what == 'main' then break end
  end
  return stack
end
于 2012-09-01T05:09:52.090 に答える