diff options
Diffstat (limited to 'fallback.c')
-rw-r--r-- | fallback.c | 21 |
1 files changed, 14 insertions, 7 deletions
@@ -3,7 +3,7 @@ | |||
3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
4 | */ | 4 | */ |
5 | 5 | ||
6 | char *rcs_fallback="$Id: fallback.c,v 2.4 1997/04/07 14:48:53 roberto Exp roberto $"; | 6 | char *rcs_fallback="$Id: fallback.c,v 2.5 1997/04/24 22:59:57 roberto Exp roberto $"; |
7 | 7 | ||
8 | #include <stdio.h> | 8 | #include <stdio.h> |
9 | #include <string.h> | 9 | #include <string.h> |
@@ -116,16 +116,20 @@ struct IM *luaI_IMtable = NULL; | |||
116 | static int IMtable_size = 0; | 116 | static int IMtable_size = 0; |
117 | static int last_tag = LUA_T_NIL; /* ORDER LUA_T */ | 117 | static int last_tag = LUA_T_NIL; /* ORDER LUA_T */ |
118 | 118 | ||
119 | |||
120 | /* events in LUA_T_LINE are all allowed, since this is used as a | ||
121 | * 'placeholder' for "default" fallbacks | ||
122 | */ | ||
119 | static char validevents[NUM_TYPES][IM_N] = { /* ORDER LUA_T, ORDER IM */ | 123 | static char validevents[NUM_TYPES][IM_N] = { /* ORDER LUA_T, ORDER IM */ |
120 | {1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_T_USERDATA */ | 124 | {1, 1, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 1}, /* LUA_T_USERDATA */ |
121 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* LUA_T_LINE */ | 125 | {1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_T_LINE */ |
122 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* LUA_T_CMARK */ | 126 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* LUA_T_CMARK */ |
123 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* LUA_T_MARK */ | 127 | {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, /* LUA_T_MARK */ |
124 | {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CFUNCTION */ | 128 | {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_CFUNCTION */ |
125 | {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_FUNCTION */ | 129 | {1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0}, /* LUA_T_FUNCTION */ |
126 | {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_T_ARRAY */ | 130 | {0, 0, 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1}, /* LUA_T_ARRAY */ |
127 | {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */ | 131 | {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1}, /* LUA_T_STRING */ |
128 | {1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1}, /* LUA_T_NUMBER */ | 132 | {1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 1}, /* LUA_T_NUMBER */ |
129 | {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0} /* LUA_T_NIL */ | 133 | {0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0} /* LUA_T_NIL */ |
130 | }; | 134 | }; |
131 | 135 | ||
@@ -186,6 +190,9 @@ void luaI_settag (int tag, TObject *o) | |||
186 | case LUA_T_ARRAY: | 190 | case LUA_T_ARRAY: |
187 | o->value.a->htag = tag; | 191 | o->value.a->htag = tag; |
188 | break; | 192 | break; |
193 | case LUA_T_USERDATA: | ||
194 | o->value.ts->tag = tag; | ||
195 | break; | ||
189 | default: | 196 | default: |
190 | luaL_verror("cannot change the tag of a %s", luaI_typenames[-ttype(o)]); | 197 | luaL_verror("cannot change the tag of a %s", luaI_typenames[-ttype(o)]); |
191 | } | 198 | } |
@@ -318,7 +325,7 @@ void luaI_setfallback (void) | |||
318 | break; | 325 | break; |
319 | case 2: { /* old arith fallback */ | 326 | case 2: { /* old arith fallback */ |
320 | int i; | 327 | int i; |
321 | oldfunc = *luaI_getim(LUA_T_USERDATA, IM_POW); | 328 | oldfunc = *luaI_getim(LUA_T_NUMBER, IM_POW); |
322 | for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ | 329 | for (i=IM_ADD; i<=IM_UNM; i++) /* ORDER IM */ |
323 | fillvalids(i, luaI_Address(func)); | 330 | fillvalids(i, luaI_Address(func)); |
324 | replace = typeFB; | 331 | replace = typeFB; |
@@ -326,7 +333,7 @@ void luaI_setfallback (void) | |||
326 | } | 333 | } |
327 | case 3: { /* old order fallback */ | 334 | case 3: { /* old order fallback */ |
328 | int i; | 335 | int i; |
329 | oldfunc = *luaI_getim(LUA_T_USERDATA, IM_LT); | 336 | oldfunc = *luaI_getim(LUA_T_LINE, IM_LT); |
330 | for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ | 337 | for (i=IM_LT; i<=IM_GE; i++) /* ORDER IM */ |
331 | fillvalids(i, luaI_Address(func)); | 338 | fillvalids(i, luaI_Address(func)); |
332 | replace = typeFB; | 339 | replace = typeFB; |
@@ -335,7 +342,7 @@ void luaI_setfallback (void) | |||
335 | default: { | 342 | default: { |
336 | int e; | 343 | int e; |
337 | if ((e = luaI_findstring(name, luaI_eventname)) >= 0) { | 344 | if ((e = luaI_findstring(name, luaI_eventname)) >= 0) { |
338 | oldfunc = *luaI_getim(LUA_T_USERDATA, e); | 345 | oldfunc = *luaI_getim(LUA_T_LINE, e); |
339 | fillvalids(e, luaI_Address(func)); | 346 | fillvalids(e, luaI_Address(func)); |
340 | replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; | 347 | replace = (e == IM_GC || e == IM_INDEX) ? nilFB : typeFB; |
341 | } | 348 | } |