2012-05-15 4 views
2

루아 C API를 사용하는 데 문제가 있습니다. pcall (C API 함수)이 실패하면 오류가 스택에 푸시됩니다. lua_tostring은 스택에 오류를 표시하지만 lua_gettop 쇼에 스택이 비어 있다고 표시됩니다.루아 C API : pcall 오류 후 빈 스택

#include <lua5.2/lauxlib.h> 
#include <lua5.2/lua.h> 
#include <lua5.2/lualib.h> 

int main() 
{ 
    lua_State *L = luaL_newstate(); 
    lua_pcall(L, 0, 0, 0); 
    printf("%d\n", lua_gettop(L)); // outputs 0, indicating empty stack 
    printf("%s\n", lua_tostring(L, -1)); // outputs "attempt to call a nil value", indicating non-empty stack 
} 

컴파일과 : 전화 시도 : GCC main.c의`PKG-설정은 PKG-구성 --libs이

이 프로그램 디스플레이를 lua5.2``lua5.2` --cflags nil 값

lua_gettop (L) 스택 크기를 반환합니다. 여기에 나는 0이 생깁니다. 빈 스택에서 문자열을 얻으려면 어떻게해야합니까?

동작은 5.1 버전과 동일합니다.

답변

1

이것은 Lua 메일 링리스트에서 답변되었습니다. 동작은 정확합니다. 함수를 스택에 푸시하여 호출해야합니다. luaL_newstate 이후의 스택이 비어 있습니다.

편집 : OP는 "빈 스택에서 어떻게 문자열을 얻을 수 있습니까?"라고 말했습니다. 내 대답은 : 왜 빈 스택에서 무언가를 얻으려면 을 알고 lua_gettop이 0을 반환했기 때문에 비어 있습니까?

결론 :

  • 스택은 lua_pcall를 호출하기 전에 비어 있습니다. 이는 오류입니다. 루아는 회복되었지만 그럴 수는 없습니다.
  • lua_pcall 이후 스택이 비어 있습니다. 루아는 그렇게 생각하고 lua_gettop을 통해 이렇게 알려줍니다.
  • 빈 스택에서 값을 가져 오려고하면 안됩니다. 인쇄 된 문자열은 단지 쓰레기로 남은 것인데 lua_pcall으로 남겨 둡니다. 그러나 그 수는 믿을 수 없습니다.
+0

왜 그가 전화를 할 수 없다고 생각하는지 모르겠다. –

+1

나는 당신이 그 질문을 오해 한 것 같아. 그는'luaL_newstate' 이후에 스택이 비어 있다는 것을 알고 있고 스택을 호출하기 위해 스택에 함수를 푸시해야한다는 것을 알고있다. 그는 pcall로 하여금 의도적으로 오류를 발생 시키도록 강요하고있다. 질문은 왜 pcall *이 오류 메시지를 푸시 한 후 스택 맨이 여전히 0인지 *? 그의 출력은 스택에 에러 메시지가 있다는 것을 보여 주지만 (lil_gettop은 0을 반환한다. 매뉴얼에 따르면 * 빈 스택 *을 나타낸다. (http : // www .lua.org/manual/5.1/manual.html # lua_gettop). – Mud

+0

@Mud, Lua API는 손을 잡지 않습니다.쓰레기를 버리면 쓰레기가 나옵니다. 'lua_pcall'은 호출 될 스택에 함수가 있다고 가정합니다. – lhf

0

내가 아는 한 lua_pcall은 오류 문자열을 푸시하지 않습니다. 대신 스택의 맨 위에있는 값을 덮어 씁니다 (항상 이상이이되어야 함). 따라서 lua_pcall (또는 더 정확하게 debug.traceback)은 스택 포인터를 수정하지 않고 맹목적으로 스택의 맨 위에 겹쳐 씁니다.

따라서 lua_pcall이 반환하면 값은 스택 맨 위에 있지만 스택 포인터는 스택이 비어 있음을 나타냅니다 (lua_pcall을 호출 할 때와 같음).

더 심각한 오류 (예 : 메모리 손상 또는 메모리 부족 오류가 발생한 경우 오류 메시지에 대해 더 많은 스택 공간을 할당하고 싶지 않은 경우)을 피하기위한 조치라고 가정합니다.