lua_call, lua_pcall, lua_cpcall, lua_pushcclosure,
1 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 |
+---------+ +---------+
| ... | | ... |
+---------+ +---------+
2 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); // ¿¡·¯ ó¸® ÇÔ¼ö¸¦ Á¦°ÅÇÑ´Ù.
3 lua_cpcall
int lua_cpcall (lua_State *L, lua_CFunction func, void *ud);
4 lua_pushcclosure
void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n);
SeriousMoin v1 (koMoinMoin 1.0a4 Modified)