사용자 도구

사이트 도구


kb:luaapifunction

LuaApi/Function

함수 다루기

lua_call

void lua_call (lua_State *L, int nargs, int nresults);

루아 함수를 호출한다. nargs는 함수 호출시 같이 주어지는 인자의 갯수이고, nresults는 해당하는 함수가 반환하는 반환값의 갯수이다. 함수 호출 이전에 함수 자체와 인수들을 스택에 푸쉬해 놓아야 한다.

2개의 인자를 가지고, 1개의 반환값을 가지는 함수 호출 예제

lua_State* L = ...
 
lua_getglobal(L, "some_function_name");
lua_pushnumber(L, arg1);
lua_pushnumber(L, arg2);
 
if (lua_call(L, 2, 1) != 0)
{
    // need error handling here
    ...
}
 
int result = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
호출 전의 스택                       호출 후의 스택
+---------+
|  arg2   |
+---------+
|  arg1   |
+---------+                          +---------+
|  func   |                          | retval  |
+---------+                          +---------+
|   ...   |                          |   ...   |
+---------+                          +---------+

lua_pcall

int lua_pcall (lua_State *L, int nargs, int nresults, int errfunc);

루아 함수를 호출한다. lua_call 함수와 마찬가지로 nargs는 함수 호출시 같이 주어지는 인자의 갯수이고, nresults는 해당하는 함수가 반환하는 반환값의 갯수이다. 함수 호출 이전에 함수 자체와 인수들을 스택에 푸쉬해 놓아야 하는 점도 같다.

단 하나 틀린 점은 해당 함수를 실행하다가 에러가 발생한 경우, 실행할 함수를 지정할 수 있다는 점이다. 마지막 인수인 errfunc 값이 에러 처리 함수의 스택 인덱스이다. 에러 처리 함수를 지정하기 싫다면 그냥 0을 주면 된다.

2개의 인자를 가지고, 1개의 반환값을 가지는 함수 호출 예제

lua_State* L = ...
 
lua_getglobal(L, "some_function_name");
 
int errorfunc = lua_gettop(L); // 현재 스택의 꼭대기, 즉 방금 집어넣은 함수의 스택 인덱스를 가져온다.
lua_getglobal(L, "_TRACEBACK"); // _TRACEBACK은 전역 함수로서 콜스택을 출력하는 함수다.
lua_insert(L, errorfunc); // 호출하고자하는 함수 밑에다 _TRACEBACK 함수를 집어넣는다.
 
lua_pushnumber(L, arg1);
lua_pushnumber(L, arg2);
 
if (lua_pcall(L, 2, 1, errorfunc) != 0)
{
    // 에러가 발생한 경우, _TRACEBACK 함수가 호출된다. 
    // 이 함수는 현재 콜스택을 스택의 제일 위에다 문자열로서 푸쉬한다.
    string errormsg = lua_tostring(L, -1);
    ...
}
 
int result = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
호출 전의 스택                       호출 후의 스택
+---------+
|  arg2   |
+---------+
|  arg1   |
+---------+                          +---------+
|  func   |                          | retval  |
+---------+                          +---------+
| errfunc |                          | errfunc |
+---------+                          +---------+

주의할 점이 하나 있는데, 스택 모양에서도 알 수 있듯이 에러 처리 함수는 스택에서 제거되지 않는다. 그러므로 함수를 지정했다면, 반드시 이에 대한 처리를 해줘야한다. 위의 예에서는 호출할 함수 바로 밑에다 에러 처리 함수를 집어넣었으므로, 리턴값을 뽑아낸 다음, 에러 처리 함수를 뽑아내면 된다.

int result = (int)lua_tonumber(L, -1);
lua_pop(L, 1);
lua_pop(L, 1); // 에러 처리 함수를 제거한다.

lua_cpcall

int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);

lua_pushcclosure

void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);

kb/luaapifunction.txt · 마지막으로 수정됨: 2014/11/07 10:03 (바깥 편집)