aboutsummaryrefslogtreecommitdiff
path: root/fallback.c
diff options
context:
space:
mode:
Diffstat (limited to 'fallback.c')
-rw-r--r--fallback.c21
1 files changed, 14 insertions, 7 deletions
diff --git a/fallback.c b/fallback.c
index 834e2dcd..4aed4690 100644
--- a/fallback.c
+++ b/fallback.c
@@ -3,7 +3,7 @@
3** TecCGraf - PUC-Rio 3** TecCGraf - PUC-Rio
4*/ 4*/
5 5
6char *rcs_fallback="$Id: fallback.c,v 2.4 1997/04/07 14:48:53 roberto Exp roberto $"; 6char *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;
116static int IMtable_size = 0; 116static int IMtable_size = 0;
117static int last_tag = LUA_T_NIL; /* ORDER LUA_T */ 117static 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*/
119static char validevents[NUM_TYPES][IM_N] = { /* ORDER LUA_T, ORDER IM */ 123static 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 }