28static const char udatatypename[] =
"userdata";
30LUAI_DDEF
const char *
const luaT_typenames_[LUA_TOTALTYPES] = {
32 "nil",
"boolean", udatatypename,
"number",
33 "string",
"table",
"function", udatatypename,
"thread",
39 static const char *
const luaT_eventname[] = {
40 "__index",
"__newindex",
41 "__gc",
"__mode",
"__len",
"__eq",
42 "__add",
"__sub",
"__mul",
"__mod",
"__pow",
44 "__band",
"__bor",
"__bxor",
"__shl",
"__shr",
45 "__unm",
"__bnot",
"__lt",
"__le",
46 "__concat",
"__call",
"__close"
49 for (i=0; i<TM_N; i++) {
50 G(L)->tmname[i] = luaS_new(L, luaT_eventname[i]);
51 luaC_fix(L, obj2gco(G(L)->tmname[i]));
61 const TValue *tm = luaH_getshortstr(events, ename);
62 lua_assert(event <= TM_EQ);
64 events->flags |= cast_byte(1u<<event);
75 mt = hvalue(o)->metatable;
78 mt = uvalue(o)->metatable;
81 mt = G(L)->mt[ttype(o)];
83 return (mt ? luaH_getshortstr(mt, G(L)->tmname[event]) : &G(L)->nilvalue);
93 if ((ttistable(o) && (mt = hvalue(o)->metatable) != NULL) ||
94 (ttisfulluserdata(o) && (mt = uvalue(o)->metatable) != NULL)) {
95 const TValue *name = luaH_getshortstr(mt, luaS_new(L,
"__name"));
97 return getstr(tsvalue(name));
99 return ttypename(ttype(o));
105 StkId func = L->top.p;
106 setobj2s(L, func, f);
107 setobj2s(L, func + 1, p1);
108 setobj2s(L, func + 2, p2);
109 setobj2s(L, func + 3, p3);
112 if (isLuacode(L->ci))
113 luaD_call(L, func, 0);
115 luaD_callnoyield(L, func, 0);
120 const TValue *p2, StkId res) {
121 ptrdiff_t result = savestack(L, res);
122 StkId func = L->top.p;
123 setobj2s(L, func, f);
124 setobj2s(L, func + 1, p1);
125 setobj2s(L, func + 2, p2);
128 if (isLuacode(L->ci))
129 luaD_call(L, func, 1);
131 luaD_callnoyield(L, func, 1);
132 res = restorestack(L, result);
133 setobjs2s(L, res, --L->top.p);
138 StkId res, TMS event) {
139 const TValue *tm = luaT_gettmbyobj(L, p1, event);
141 tm = luaT_gettmbyobj(L, p2, event);
142 if (notm(tm))
return 0;
143 luaT_callTMres(L, tm, p1, p2, res);
149 StkId res, TMS event) {
150 if (l_unlikely(!callbinTM(L, p1, p2, res, event))) {
152 case TM_BAND:
case TM_BOR:
case TM_BXOR:
153 case TM_SHL:
case TM_SHR:
case TM_BNOT: {
154 if (ttisnumber(p1) && ttisnumber(p2))
155 luaG_tointerror(L, p1, p2);
157 luaG_opinterror(L, p1, p2,
"perform bitwise operation on");
161 luaG_opinterror(L, p1, p2,
"perform arithmetic on");
168 StkId top = L->top.p;
169 if (l_unlikely(!callbinTM(L, s2v(top - 2), s2v(top - 1), top - 2,
171 luaG_concaterror(L, s2v(top - 2), s2v(top - 1));
176 int flip, StkId res, TMS event) {
178 luaT_trybinTM(L, p2, p1, res, event);
180 luaT_trybinTM(L, p1, p2, res, event);
185 int flip, StkId res, TMS event) {
188 luaT_trybinassocTM(L, p1, &aux, flip, res, event);
203 if (callbinTM(L, p1, p2, L->top.p, event))
204 return !l_isfalse(s2v(L->top.p));
205#if defined(LUA_COMPAT_LT_LE)
206 else if (event == TM_LE) {
208 L->ci->callstatus |= CIST_LEQ;
209 if (callbinTM(L, p2, p1, L->top.p, TM_LT)) {
210 L->ci->callstatus ^= CIST_LEQ;
211 return l_isfalse(s2v(L->top.p));
216 luaG_ordererror(L, p1, p2);
222 int flip,
int isfloat, TMS event) {
225 setfltvalue(&aux, cast_num(v2));
234 return luaT_callorderTM(L, p1, p2, event);
241 int actual = cast_int(L->top.p - ci->func.p) - 1;
242 int nextra = actual - nfixparams;
243 ci->u.l.nextraargs = nextra;
244 luaD_checkstack(L, p->maxstacksize + 1);
246 setobjs2s(L, L->top.p++, ci->func.p);
248 for (i = 1; i <= nfixparams; i++) {
249 setobjs2s(L, L->top.p++, ci->func.p + i);
250 setnilvalue(s2v(ci->func.p + i));
252 ci->func.p += actual + 1;
253 ci->top.p += actual + 1;
254 lua_assert(L->top.p <= ci->top.p && ci->top.p <= L->stack_last.p);
260 int nextra = ci->u.l.nextraargs;
263 checkstackGCp(L, nextra, where);
264 L->top.p = where + nextra;
266 for (i = 0; i < wanted && i < nextra; i++)
267 setobjs2s(L, where + i, ci->func.p - nextra + i);
268 for (; i < wanted; i++)
269 setnilvalue(s2v(where + i));