diff options
author | Lua Team <team@lua.org> | 1999-07-08 12:00:00 +0000 |
---|---|---|
committer | repogen <> | 1999-07-08 12:00:00 +0000 |
commit | afb67002d94ef22c14741910ba83da262a6e9338 (patch) | |
tree | b51ab3502813f590a4b115997f6fe41da43b6586 /src/ltm.c | |
parent | 377347776f1f3d820f92151f70bec667f96d5e6b (diff) | |
download | lua-github-3.2.tar.gz |
Lua 3.23.2
Diffstat (limited to 'src/ltm.c')
-rw-r--r-- | src/ltm.c | 91 |
1 files changed, 38 insertions, 53 deletions
@@ -1,5 +1,5 @@ /* -** $Id: ltm.c,v 1.16 1998/06/18 16:57:03 roberto Exp $ +** $Id: ltm.c,v 1.25 1999/05/21 19:41:49 roberto Exp $ ** Tag methods ** See Copyright Notice in lua.h */ @@ -22,8 +22,7 @@ char *luaT_eventname[] = { /* ORDER IM */ }; -static int luaI_checkevent (char *name, char *list[]) -{ +static int luaI_checkevent (char *name, char *list[]) { int e = luaL_findstring(name, list); if (e < 0) luaL_verror("`%.50s' is not a valid event name", name); @@ -35,7 +34,7 @@ static int luaI_checkevent (char *name, char *list[]) /* events in LUA_T_NIL are all allowed, since this is used as a * 'placeholder' for "default" fallbacks */ -static char validevents[NUM_TAGS][IM_N] = { /* ORDER LUA_T, ORDER IM */ +static char luaT_validevents[NUM_TAGS][IM_N] = { /* ORDER LUA_T, ORDER IM */ {1, 1, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_USERDATA */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_NUMBER */ {1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */ @@ -45,71 +44,59 @@ static char validevents[NUM_TAGS][IM_N] = { /* ORDER LUA_T, ORDER IM */ {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1} /* LUA_T_NIL */ }; - -static int validevent (int t, int e) -{ /* ORDER LUA_T */ - return (t < LUA_T_NIL) ? 1 : validevents[-t][e]; +static int luaT_validevent (int t, int e) { /* ORDER LUA_T */ + return (t < LUA_T_NIL) ? 1 : luaT_validevents[-t][e]; } -static void init_entry (int tag) -{ +static void init_entry (int tag) { int i; for (i=0; i<IM_N; i++) ttype(luaT_getim(tag, i)) = LUA_T_NIL; } -void luaT_init (void) -{ +void luaT_init (void) { int t; - L->IMtable_size = NUM_TAGS*2; L->last_tag = -(NUM_TAGS-1); - L->IMtable = luaM_newvector(L->IMtable_size, struct IM); + luaM_growvector(L->IMtable, 0, NUM_TAGS, struct IM, arrEM, MAX_INT); for (t=L->last_tag; t<=0; t++) init_entry(t); } -int lua_newtag (void) -{ +int lua_newtag (void) { --L->last_tag; - if ((-L->last_tag) >= L->IMtable_size) - L->IMtable_size = luaM_growvector(&L->IMtable, L->IMtable_size, - struct IM, memEM, MAX_INT); + luaM_growvector(L->IMtable, -(L->last_tag), 1, struct IM, arrEM, MAX_INT); init_entry(L->last_tag); return L->last_tag; } -static void checktag (int tag) -{ +static void checktag (int tag) { if (!(L->last_tag <= tag && tag <= 0)) luaL_verror("%d is not a valid tag", tag); } -void luaT_realtag (int tag) -{ +void luaT_realtag (int tag) { if (!(L->last_tag <= tag && tag < LUA_T_NIL)) - luaL_verror("tag %d is not result of `newtag'", tag); + luaL_verror("tag %d was not created by `newtag'", tag); } -int lua_copytagmethods (int tagto, int tagfrom) -{ +int lua_copytagmethods (int tagto, int tagfrom) { int e; checktag(tagto); checktag(tagfrom); for (e=0; e<IM_N; e++) { - if (validevent(tagto, e)) + if (luaT_validevent(tagto, e)) *luaT_getim(tagto, e) = *luaT_getim(tagfrom, e); } return tagto; } -int luaT_efectivetag (TObject *o) -{ +int luaT_effectivetag (TObject *o) { int t; switch (t = ttype(o)) { case LUA_T_ARRAY: @@ -131,36 +118,34 @@ int luaT_efectivetag (TObject *o) } -TObject *luaT_gettagmethod (int t, char *event) -{ +TObject *luaT_gettagmethod (int t, char *event) { int e = luaI_checkevent(event, luaT_eventname); checktag(t); - if (validevent(t, e)) + if (luaT_validevent(t, e)) return luaT_getim(t,e); else return &luaO_nilobject; } -void luaT_settagmethod (int t, char *event, TObject *func) -{ - TObject temp = *func; +void luaT_settagmethod (int t, char *event, TObject *func) { + TObject temp; int e = luaI_checkevent(event, luaT_eventname); checktag(t); - if (!validevent(t, e)) - luaL_verror("settagmethod: cannot change tag method `%.20s' for tag %d", - luaT_eventname[e], t); + if (!luaT_validevent(t, e)) + luaL_verror("cannot change tag method `%.20s' for type `%.20s'%.20s", + luaT_eventname[e], luaO_typenames[-t], + (t == LUA_T_ARRAY || t == LUA_T_USERDATA) ? " with default tag" + : ""); + temp = *func; *func = *luaT_getim(t,e); *luaT_getim(t, e) = temp; } -char *luaT_travtagmethods (int (*fn)(TObject *)) -{ +char *luaT_travtagmethods (int (*fn)(TObject *)) { /* ORDER IM */ int e; - if (fn(&L->errorim)) - return "error"; - for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { /* ORDER IM */ + for (e=IM_GETTABLE; e<=IM_FUNCTION; e++) { int t; for (t=0; t>=L->last_tag; t--) if (fn(luaT_getim(t,e))) @@ -177,6 +162,7 @@ char *luaT_travtagmethods (int (*fn)(TObject *)) #ifdef LUA_COMPAT2_5 #include "lapi.h" +#include "lstring.h" static void errorFB (void) { @@ -191,23 +177,20 @@ static void errorFB (void) static void nilFB (void) { } -static void typeFB (void) -{ +static void typeFB (void) { lua_error("unexpected type"); } -static void fillvalids (IMS e, TObject *func) -{ +static void fillvalids (IMS e, TObject *func) { int t; for (t=LUA_T_NIL; t<=LUA_T_USERDATA; t++) - if (validevent(t, e)) + if (luaT_validevent(t, e)) *luaT_getim(t, e) = *func; } -void luaT_setfallback (void) -{ +void luaT_setfallback (void) { static char *oldnames [] = {"error", "getglobal", "arith", "order", NULL}; TObject oldfunc; lua_CFunction replace; @@ -215,11 +198,13 @@ void luaT_setfallback (void) lua_Object func = lua_getparam(2); luaL_arg_check(lua_isfunction(func), 2, "function expected"); switch (luaL_findstring(name, oldnames)) { - case 0: /* old error fallback */ - oldfunc = L->errorim; - L->errorim = *luaA_Address(func); + case 0: { /* old error fallback */ + TObject *em = &(luaS_new("_ERRORMESSAGE")->u.s.globalval); + oldfunc = *em; + *em = *luaA_Address(func); replace = errorFB; break; + } case 1: /* old getglobal fallback */ oldfunc = *luaT_getim(LUA_T_NIL, IM_GETGLOBAL); *luaT_getim(LUA_T_NIL, IM_GETGLOBAL) = *luaA_Address(func); |