diff options
Diffstat (limited to 'ltm.c')
| -rw-r--r-- | ltm.c | 31 |
1 files changed, 30 insertions, 1 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.c,v 2.14 2011/06/02 19:31:40 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 2.15 2013/04/12 19:07:09 roberto Exp roberto $ |
| 3 | ** Tag methods | 3 | ** Tag methods |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -12,6 +12,7 @@ | |||
| 12 | 12 | ||
| 13 | #include "lua.h" | 13 | #include "lua.h" |
| 14 | 14 | ||
| 15 | #include "ldo.h" | ||
| 15 | #include "lobject.h" | 16 | #include "lobject.h" |
| 16 | #include "lstate.h" | 17 | #include "lstate.h" |
| 17 | #include "lstring.h" | 18 | #include "lstring.h" |
| @@ -75,3 +76,31 @@ const TValue *luaT_gettmbyobj (lua_State *L, const TValue *o, TMS event) { | |||
| 75 | return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); | 76 | return (mt ? luaH_getstr(mt, G(L)->tmname[event]) : luaO_nilobject); |
| 76 | } | 77 | } |
| 77 | 78 | ||
| 79 | |||
| 80 | void luaT_callTM (lua_State *L, const TValue *f, const TValue *p1, | ||
| 81 | const TValue *p2, TValue *p3, int hasres) { | ||
| 82 | ptrdiff_t result = savestack(L, p3); | ||
| 83 | setobj2s(L, L->top++, f); /* push function */ | ||
| 84 | setobj2s(L, L->top++, p1); /* 1st argument */ | ||
| 85 | setobj2s(L, L->top++, p2); /* 2nd argument */ | ||
| 86 | if (!hasres) /* no result? 'p3' is third argument */ | ||
| 87 | setobj2s(L, L->top++, p3); /* 3rd argument */ | ||
| 88 | /* metamethod may yield only when called from Lua code */ | ||
| 89 | luaD_call(L, L->top - (4 - hasres), hasres, isLua(L->ci)); | ||
| 90 | if (hasres) { /* if has result, move it to its place */ | ||
| 91 | p3 = restorestack(L, result); | ||
| 92 | setobjs2s(L, p3, --L->top); | ||
| 93 | } | ||
| 94 | } | ||
| 95 | |||
| 96 | |||
| 97 | int luaT_callbinTM (lua_State *L, const TValue *p1, const TValue *p2, | ||
| 98 | StkId res, TMS event) { | ||
| 99 | const TValue *tm = luaT_gettmbyobj(L, p1, event); /* try first operand */ | ||
| 100 | if (ttisnil(tm)) | ||
| 101 | tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ | ||
| 102 | if (ttisnil(tm)) return 0; | ||
| 103 | luaT_callTM(L, tm, p1, p2, res, 1); | ||
| 104 | return 1; | ||
| 105 | } | ||
| 106 | |||
