diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-06-09 14:28:14 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-06-09 14:28:14 -0300 |
| commit | dd22ea4da550c3a158e0f11b928c349336184f85 (patch) | |
| tree | b73e2ae0498c4efa30dee04f710fb1a349f164ed /fallback.c | |
| parent | 5fdcfeb353d726a9bcd6d4db5dd0b62b9b8e4b02 (diff) | |
| download | lua-dd22ea4da550c3a158e0f11b928c349336184f85.tar.gz lua-dd22ea4da550c3a158e0f11b928c349336184f85.tar.bz2 lua-dd22ea4da550c3a158e0f11b928c349336184f85.zip | |
new implementation for udata (again they are just void *);
new implementation for the API: most operations now do not disturb
structures lua2C and C2lua.
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 | } |
