diff options
| -rw-r--r-- | fallback.c | 130 | ||||
| -rw-r--r-- | fallback.h | 28 | ||||
| -rw-r--r-- | hash.c | 5 | ||||
| -rw-r--r-- | hash.h | 19 | ||||
| -rw-r--r-- | inout.c | 205 | ||||
| -rw-r--r-- | inout.h | 14 | ||||
| -rw-r--r-- | lua.h | 30 | ||||
| -rw-r--r-- | opcode.c | 196 | ||||
| -rw-r--r-- | table.c | 41 | ||||
| -rw-r--r-- | table.h | 3 |
10 files changed, 438 insertions, 233 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 1.24 1996/04/22 18:00:37 roberto Exp roberto $"; | 6 | char *rcs_fallback="$Id: fallback.c,v 1.25 1996/04/25 14:10:00 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <stdio.h> | 8 | #include <stdio.h> |
| 9 | #include <string.h> | 9 | #include <string.h> |
| @@ -13,6 +13,8 @@ char *rcs_fallback="$Id: fallback.c,v 1.24 1996/04/22 18:00:37 roberto Exp rober | |||
| 13 | #include "opcode.h" | 13 | #include "opcode.h" |
| 14 | #include "lua.h" | 14 | #include "lua.h" |
| 15 | #include "table.h" | 15 | #include "table.h" |
| 16 | #include "tree.h" | ||
| 17 | #include "hash.h" | ||
| 16 | 18 | ||
| 17 | 19 | ||
| 18 | static void errorFB (void); | 20 | static void errorFB (void); |
| @@ -29,8 +31,6 @@ static void funcFB (void); | |||
| 29 | ** Warning: This list must be in the same order as the #define's | 31 | ** Warning: This list must be in the same order as the #define's |
| 30 | */ | 32 | */ |
| 31 | struct FB luaI_fallBacks[] = { | 33 | struct FB luaI_fallBacks[] = { |
| 32 | {"error", {LUA_T_CFUNCTION, {errorFB}}, 1, 0}, | ||
| 33 | {"index", {LUA_T_CFUNCTION, {indexFB}}, 2, 1}, | ||
| 34 | {"gettable", {LUA_T_CFUNCTION, {gettableFB}}, 2, 1}, | 34 | {"gettable", {LUA_T_CFUNCTION, {gettableFB}}, 2, 1}, |
| 35 | {"arith", {LUA_T_CFUNCTION, {arithFB}}, 3, 1}, | 35 | {"arith", {LUA_T_CFUNCTION, {arithFB}}, 3, 1}, |
| 36 | {"order", {LUA_T_CFUNCTION, {orderFB}}, 3, 1}, | 36 | {"order", {LUA_T_CFUNCTION, {orderFB}}, 3, 1}, |
| @@ -39,12 +39,26 @@ struct FB luaI_fallBacks[] = { | |||
| 39 | {"gc", {LUA_T_CFUNCTION, {GDFB}}, 1, 0}, | 39 | {"gc", {LUA_T_CFUNCTION, {GDFB}}, 1, 0}, |
| 40 | {"function", {LUA_T_CFUNCTION, {funcFB}}, -1, -1}, | 40 | {"function", {LUA_T_CFUNCTION, {funcFB}}, -1, -1}, |
| 41 | /* no fixed number of params or results */ | 41 | /* no fixed number of params or results */ |
| 42 | {"getglobal", {LUA_T_CFUNCTION, {indexFB}}, 1, 1} | 42 | {"getglobal", {LUA_T_CFUNCTION, {indexFB}}, 1, 1}, |
| 43 | /* same default behavior of index FB */ | 43 | /* same default behavior of index FB */ |
| 44 | {"index", {LUA_T_CFUNCTION, {indexFB}}, 2, 1}, | ||
| 45 | {"error", {LUA_T_CFUNCTION, {errorFB}}, 1, 0} | ||
| 44 | }; | 46 | }; |
| 45 | 47 | ||
| 46 | #define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB)) | 48 | #define N_FB (sizeof(luaI_fallBacks)/sizeof(struct FB)) |
| 47 | 49 | ||
| 50 | static int luaI_findevent (char *name) | ||
| 51 | { | ||
| 52 | int i; | ||
| 53 | for (i=0; i<N_FB; i++) | ||
| 54 | if (strcmp(luaI_fallBacks[i].kind, name) == 0) | ||
| 55 | return i; | ||
| 56 | /* name not found */ | ||
| 57 | lua_error("invalid event name"); | ||
| 58 | return 0; /* to avoid warnings */ | ||
| 59 | } | ||
| 60 | |||
| 61 | |||
| 48 | void luaI_setfallback (void) | 62 | void luaI_setfallback (void) |
| 49 | { | 63 | { |
| 50 | int i; | 64 | int i; |
| @@ -52,17 +66,9 @@ void luaI_setfallback (void) | |||
| 52 | lua_Object func = lua_getparam(2); | 66 | lua_Object func = lua_getparam(2); |
| 53 | if (name == NULL || !lua_isfunction(func)) | 67 | if (name == NULL || !lua_isfunction(func)) |
| 54 | lua_error("incorrect argument to function `setfallback'"); | 68 | lua_error("incorrect argument to function `setfallback'"); |
| 55 | for (i=0; i<N_FB; i++) | 69 | i = luaI_findevent(name); |
| 56 | { | 70 | luaI_pushobject(&luaI_fallBacks[i].function); |
| 57 | if (strcmp(luaI_fallBacks[i].kind, name) == 0) | 71 | luaI_fallBacks[i].function = *luaI_Address(func); |
| 58 | { | ||
| 59 | luaI_pushobject(&luaI_fallBacks[i].function); | ||
| 60 | luaI_fallBacks[i].function = *luaI_Address(func); | ||
| 61 | return; | ||
| 62 | } | ||
| 63 | } | ||
| 64 | /* name not found */ | ||
| 65 | lua_error("incorrect argument to function `setfallback'"); | ||
| 66 | } | 72 | } |
| 67 | 73 | ||
| 68 | 74 | ||
| @@ -112,7 +118,7 @@ static void funcFB (void) | |||
| 112 | } | 118 | } |
| 113 | 119 | ||
| 114 | 120 | ||
| 115 | /* | 121 | /* ------------------------------------------- |
| 116 | ** Reference routines | 122 | ** Reference routines |
| 117 | */ | 123 | */ |
| 118 | 124 | ||
| @@ -189,3 +195,95 @@ char *luaI_travfallbacks (int (*fn)(Object *)) | |||
| 189 | return luaI_fallBacks[i].kind; | 195 | return luaI_fallBacks[i].kind; |
| 190 | return NULL; | 196 | return NULL; |
| 191 | } | 197 | } |
| 198 | |||
| 199 | |||
| 200 | /* ------------------------------------------- | ||
| 201 | * Internal Methods | ||
| 202 | */ | ||
| 203 | #define BASE_TAG 1000 | ||
| 204 | |||
| 205 | static struct IM { | ||
| 206 | lua_Type tp; | ||
| 207 | Object int_method[FB_N]; | ||
| 208 | } *luaI_IMtable = NULL; | ||
| 209 | static int IMtable_size = 0; | ||
| 210 | static int last_tag = BASE_TAG-1; | ||
| 211 | |||
| 212 | int lua_newtag (char *t) | ||
| 213 | { | ||
| 214 | int i; | ||
| 215 | ++last_tag; | ||
| 216 | if ((last_tag-BASE_TAG) >= IMtable_size) | ||
| 217 | IMtable_size = growvector(&luaI_IMtable, IMtable_size, | ||
| 218 | struct IM, memEM, MAX_INT); | ||
| 219 | if (strcmp(t, "table") == 0) | ||
| 220 | luaI_IMtable[last_tag-BASE_TAG].tp = LUA_T_ARRAY; | ||
| 221 | else if (strcmp(t, "userdata") == 0) | ||
| 222 | luaI_IMtable[last_tag-BASE_TAG].tp = LUA_T_USERDATA; | ||
| 223 | else | ||
| 224 | lua_error("invalid type for new tag"); | ||
| 225 | for (i=0; i<FB_N; i++) | ||
| 226 | luaI_IMtable[last_tag-BASE_TAG].int_method[i].tag = LUA_T_NIL; | ||
| 227 | return last_tag; | ||
| 228 | } | ||
| 229 | |||
| 230 | static int validtag (int tag) | ||
| 231 | { | ||
| 232 | return (BASE_TAG <= tag && tag <= last_tag); | ||
| 233 | } | ||
| 234 | |||
| 235 | static void checktag (int tag) | ||
| 236 | { | ||
| 237 | if (!validtag(tag)) | ||
| 238 | lua_error("invalid tag"); | ||
| 239 | } | ||
| 240 | |||
| 241 | void luaI_settag (int tag, Object *o) | ||
| 242 | { | ||
| 243 | checktag(tag); | ||
| 244 | if (tag(o) != luaI_IMtable[tag-BASE_TAG].tp) | ||
| 245 | lua_error("Tag is not compatible with this type"); | ||
| 246 | if (o->tag == LUA_T_ARRAY) | ||
| 247 | o->value.a->htag = tag; | ||
| 248 | else /* must be userdata */ | ||
| 249 | o->value.ts->tag = tag; | ||
| 250 | } | ||
| 251 | |||
| 252 | int luaI_tag (Object *o) | ||
| 253 | { | ||
| 254 | lua_Type t = tag(o); | ||
| 255 | if (t == LUA_T_USERDATA) | ||
| 256 | return o->value.ts->tag; | ||
| 257 | else if (t == LUA_T_ARRAY) | ||
| 258 | return o->value.a->htag; | ||
| 259 | else return t; | ||
| 260 | } | ||
| 261 | |||
| 262 | Object *luaI_getim (int tag, int event) | ||
| 263 | { | ||
| 264 | if (tag == 0) | ||
| 265 | return &luaI_fallBacks[event].function; | ||
| 266 | else if (validtag(tag)) { | ||
| 267 | Object *func = &luaI_IMtable[tag-BASE_TAG].int_method[event]; | ||
| 268 | if (func->tag == LUA_T_NIL) | ||
| 269 | return NULL; | ||
| 270 | else | ||
| 271 | return func; | ||
| 272 | } | ||
| 273 | else return NULL; | ||
| 274 | } | ||
| 275 | |||
| 276 | void luaI_setintmethod (void) | ||
| 277 | { | ||
| 278 | lua_Object tag = lua_getparam(1); | ||
| 279 | lua_Object event = lua_getparam(2); | ||
| 280 | lua_Object func = lua_getparam(3); | ||
| 281 | if (!(lua_isnumber(tag) && lua_isstring(event) && lua_isfunction(func))) | ||
| 282 | lua_error("incorrect arguments to function `setintmethod'"); | ||
| 283 | else { | ||
| 284 | int i = luaI_findevent(lua_getstring(event)); | ||
| 285 | int t = lua_getnumber(tag); | ||
| 286 | checktag(t); | ||
| 287 | luaI_IMtable[t-BASE_TAG].int_method[i] = *luaI_Address(func); | ||
| 288 | } | ||
| 289 | } | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: fallback.h,v 1.12 1996/04/22 18:00:37 roberto Exp roberto $ | 2 | ** $Id: fallback.h,v 1.13 1996/04/25 14:10:00 roberto Exp roberto $ |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | #ifndef fallback_h | 5 | #ifndef fallback_h |
| @@ -15,16 +15,17 @@ extern struct FB { | |||
| 15 | int nResults; | 15 | int nResults; |
| 16 | } luaI_fallBacks[]; | 16 | } luaI_fallBacks[]; |
| 17 | 17 | ||
| 18 | #define FB_ERROR 0 | 18 | #define FB_GETTABLE 0 |
| 19 | #define FB_INDEX 1 | 19 | #define FB_ARITH 1 |
| 20 | #define FB_GETTABLE 2 | 20 | #define FB_ORDER 2 |
| 21 | #define FB_ARITH 3 | 21 | #define FB_CONCAT 3 |
| 22 | #define FB_ORDER 4 | 22 | #define FB_SETTABLE 4 |
| 23 | #define FB_CONCAT 5 | 23 | #define FB_GC 5 |
| 24 | #define FB_SETTABLE 6 | 24 | #define FB_FUNCTION 6 |
| 25 | #define FB_GC 7 | 25 | #define FB_GETGLOBAL 7 |
| 26 | #define FB_FUNCTION 8 | 26 | #define FB_INDEX 8 |
| 27 | #define FB_GETGLOBAL 9 | 27 | #define FB_ERROR 9 |
| 28 | #define FB_N 10 | ||
| 28 | 29 | ||
| 29 | void luaI_setfallback (void); | 30 | void luaI_setfallback (void); |
| 30 | int luaI_ref (Object *object, int lock); | 31 | int luaI_ref (Object *object, int lock); |
| @@ -33,5 +34,10 @@ void luaI_travlock (int (*fn)(Object *)); | |||
| 33 | void luaI_invalidaterefs (void); | 34 | void luaI_invalidaterefs (void); |
| 34 | char *luaI_travfallbacks (int (*fn)(Object *)); | 35 | char *luaI_travfallbacks (int (*fn)(Object *)); |
| 35 | 36 | ||
| 37 | void luaI_settag (int tag, Object *o); | ||
| 38 | Object *luaI_getim (int tag, int event); | ||
| 39 | int luaI_tag (Object *o); | ||
| 40 | void luaI_setintmethod (void); | ||
| 41 | |||
| 36 | #endif | 42 | #endif |
| 37 | 43 | ||
| @@ -3,7 +3,7 @@ | |||
| 3 | ** hash manager for lua | 3 | ** hash manager for lua |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_hash="$Id: hash.c,v 2.32 1996/11/18 13:48:44 roberto Exp roberto $"; | 6 | char *rcs_hash="$Id: hash.c,v 2.33 1997/02/11 11:35:05 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | 8 | ||
| 9 | #include "mem.h" | 9 | #include "mem.h" |
| @@ -24,6 +24,8 @@ char *rcs_hash="$Id: hash.c,v 2.32 1996/11/18 13:48:44 roberto Exp roberto $"; | |||
| 24 | 24 | ||
| 25 | #define REHASH_LIMIT 0.70 /* avoid more than this % full */ | 25 | #define REHASH_LIMIT 0.70 /* avoid more than this % full */ |
| 26 | 26 | ||
| 27 | #define TagDefault LUA_T_ARRAY; | ||
| 28 | |||
| 27 | 29 | ||
| 28 | static Hash *listhead = NULL; | 30 | static Hash *listhead = NULL; |
| 29 | 31 | ||
| @@ -121,6 +123,7 @@ static Hash *hashcreate (int nhash) | |||
| 121 | nhash(t) = nhash; | 123 | nhash(t) = nhash; |
| 122 | nuse(t) = 0; | 124 | nuse(t) = 0; |
| 123 | markarray(t) = 0; | 125 | markarray(t) = 0; |
| 126 | t->htag = TagDefault; | ||
| 124 | return t; | 127 | return t; |
| 125 | } | 128 | } |
| 126 | 129 | ||
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** hash.h | 2 | ** hash.h |
| 3 | ** hash manager for lua | 3 | ** hash manager for lua |
| 4 | ** $Id: hash.h,v 2.11 1996/03/08 12:04:04 roberto Exp roberto $ | 4 | ** $Id: hash.h,v 2.12 1996/05/06 14:30:27 roberto Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef hash_h | 7 | #ifndef hash_h |
| @@ -10,19 +10,18 @@ | |||
| 10 | #include "types.h" | 10 | #include "types.h" |
| 11 | #include "opcode.h" | 11 | #include "opcode.h" |
| 12 | 12 | ||
| 13 | typedef struct node | 13 | typedef struct node { |
| 14 | { | ||
| 15 | Object ref; | 14 | Object ref; |
| 16 | Object val; | 15 | Object val; |
| 17 | } Node; | 16 | } Node; |
| 18 | 17 | ||
| 19 | typedef struct Hash | 18 | typedef struct Hash { |
| 20 | { | 19 | struct Hash *next; |
| 21 | struct Hash *next; | 20 | Node *node; |
| 22 | Node *node; | 21 | int nhash; |
| 23 | int nhash; | 22 | int nuse; |
| 24 | int nuse; | 23 | int htag; |
| 25 | char mark; | 24 | char mark; |
| 26 | } Hash; | 25 | } Hash; |
| 27 | 26 | ||
| 28 | 27 | ||
| @@ -5,7 +5,7 @@ | |||
| 5 | ** Also provides some predefined lua functions. | 5 | ** Also provides some predefined lua functions. |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | char *rcs_inout="$Id: inout.c,v 2.42 1996/09/24 21:46:44 roberto Exp roberto $"; | 8 | char *rcs_inout="$Id: inout.c,v 2.43 1996/09/25 12:57:22 roberto Exp roberto $"; |
| 9 | 9 | ||
| 10 | #include <stdio.h> | 10 | #include <stdio.h> |
| 11 | #include <string.h> | 11 | #include <string.h> |
| @@ -16,7 +16,9 @@ char *rcs_inout="$Id: inout.c,v 2.42 1996/09/24 21:46:44 roberto Exp roberto $"; | |||
| 16 | #include "table.h" | 16 | #include "table.h" |
| 17 | #include "tree.h" | 17 | #include "tree.h" |
| 18 | #include "lua.h" | 18 | #include "lua.h" |
| 19 | #include "hash.h" | ||
| 19 | #include "mem.h" | 20 | #include "mem.h" |
| 21 | #include "fallback.h" | ||
| 20 | 22 | ||
| 21 | 23 | ||
| 22 | /* Exported variables */ | 24 | /* Exported variables */ |
| @@ -109,6 +111,21 @@ static void check_arg (int cond, char *func) | |||
| 109 | } | 111 | } |
| 110 | } | 112 | } |
| 111 | 113 | ||
| 114 | static char *check_string (int numArg, char *funcname) | ||
| 115 | { | ||
| 116 | lua_Object o = lua_getparam(numArg); | ||
| 117 | check_arg(lua_isstring(o), funcname); | ||
| 118 | return lua_getstring(o); | ||
| 119 | } | ||
| 120 | |||
| 121 | static int check_number (int numArg, char *funcname) | ||
| 122 | { | ||
| 123 | lua_Object o = lua_getparam(numArg); | ||
| 124 | check_arg(lua_isnumber(o), funcname); | ||
| 125 | return (int)lua_getnumber(o); | ||
| 126 | } | ||
| 127 | |||
| 128 | |||
| 112 | 129 | ||
| 113 | static int passresults (void) | 130 | static int passresults (void) |
| 114 | { | 131 | { |
| @@ -122,10 +139,9 @@ static int passresults (void) | |||
| 122 | /* | 139 | /* |
| 123 | ** Internal function: do a string | 140 | ** Internal function: do a string |
| 124 | */ | 141 | */ |
| 125 | void lua_internaldostring (void) | 142 | static void lua_internaldostring (void) |
| 126 | { | 143 | { |
| 127 | lua_Object obj = lua_getparam (1); | 144 | if (lua_dostring(check_string(1, "dostring")) == 0) |
| 128 | if (lua_isstring(obj) && lua_dostring(lua_getstring(obj)) == 0) | ||
| 129 | if (passresults() == 0) | 145 | if (passresults() == 0) |
| 130 | lua_pushuserdata(NULL); /* at least one result to signal no errors */ | 146 | lua_pushuserdata(NULL); /* at least one result to signal no errors */ |
| 131 | } | 147 | } |
| @@ -133,7 +149,7 @@ void lua_internaldostring (void) | |||
| 133 | /* | 149 | /* |
| 134 | ** Internal function: do a file | 150 | ** Internal function: do a file |
| 135 | */ | 151 | */ |
| 136 | void lua_internaldofile (void) | 152 | static void lua_internaldofile (void) |
| 137 | { | 153 | { |
| 138 | lua_Object obj = lua_getparam (1); | 154 | lua_Object obj = lua_getparam (1); |
| 139 | char *fname = NULL; | 155 | char *fname = NULL; |
| @@ -150,36 +166,24 @@ void lua_internaldofile (void) | |||
| 150 | 166 | ||
| 151 | static char *tostring (lua_Object obj) | 167 | static char *tostring (lua_Object obj) |
| 152 | { | 168 | { |
| 153 | char *buff = luaI_buffer(20); | ||
| 154 | if (lua_isstring(obj)) /* get strings and numbers */ | 169 | if (lua_isstring(obj)) /* get strings and numbers */ |
| 155 | return lua_getstring(obj); | 170 | return lua_getstring(obj); |
| 156 | else switch(lua_type(obj)) | 171 | else if (lua_istable(obj)) |
| 157 | { | 172 | return "<table>"; |
| 158 | case LUA_T_FUNCTION: | 173 | else if (lua_isfunction(obj)) |
| 159 | sprintf(buff, "function: %p", (luaI_Address(obj))->value.tf); | 174 | return "<function>"; |
| 160 | break; | 175 | else if (lua_isnil(obj)) |
| 161 | case LUA_T_CFUNCTION: | 176 | return "nil"; |
| 162 | sprintf(buff, "cfunction: %p", lua_getcfunction(obj)); | 177 | else /* if (lua_isuserdata(obj)) */ |
| 163 | break; | 178 | return "<userdata>"; |
| 164 | case LUA_T_ARRAY: | ||
| 165 | sprintf(buff, "table: %p", avalue(luaI_Address(obj))); | ||
| 166 | break; | ||
| 167 | case LUA_T_NIL: | ||
| 168 | sprintf(buff, "nil"); | ||
| 169 | break; | ||
| 170 | default: | ||
| 171 | sprintf(buff, "userdata: %p", lua_getuserdata(obj)); | ||
| 172 | break; | ||
| 173 | } | ||
| 174 | return buff; | ||
| 175 | } | 179 | } |
| 176 | 180 | ||
| 177 | void luaI_tostring (void) | 181 | static void luaI_tostring (void) |
| 178 | { | 182 | { |
| 179 | lua_pushstring(tostring(lua_getparam(1))); | 183 | lua_pushstring(tostring(lua_getparam(1))); |
| 180 | } | 184 | } |
| 181 | 185 | ||
| 182 | void luaI_print (void) | 186 | static void luaI_print (void) |
| 183 | { | 187 | { |
| 184 | int i = 1; | 188 | int i = 1; |
| 185 | lua_Object obj; | 189 | lua_Object obj; |
| @@ -190,42 +194,35 @@ void luaI_print (void) | |||
| 190 | /* | 194 | /* |
| 191 | ** Internal function: return an object type. | 195 | ** Internal function: return an object type. |
| 192 | */ | 196 | */ |
| 193 | void luaI_type (void) | 197 | static void luaI_type (void) |
| 194 | { | 198 | { |
| 195 | lua_Object o = lua_getparam(1); | 199 | lua_Object o = lua_getparam(1); |
| 196 | int t; | 200 | int t = lua_tag(o); |
| 197 | if (o == LUA_NOOBJECT) | 201 | char *s; |
| 202 | if (t == LUA_T_NUMBER) | ||
| 203 | s = "number"; | ||
| 204 | else if (lua_isstring(o)) | ||
| 205 | s = "string"; | ||
| 206 | else if (lua_istable(o)) | ||
| 207 | s = "table"; | ||
| 208 | else if (lua_isnil(o)) | ||
| 209 | s = "nil"; | ||
| 210 | else if (lua_isfunction(o)) | ||
| 211 | s = "function"; | ||
| 212 | else if (lua_isuserdata(o)) | ||
| 213 | s = "userdata"; | ||
| 214 | else { | ||
| 198 | lua_error("no parameter to function 'type'"); | 215 | lua_error("no parameter to function 'type'"); |
| 199 | t = lua_type(o); | 216 | return; /* to avoid warnings */ |
| 200 | switch (t) | ||
| 201 | { | ||
| 202 | case LUA_T_NIL : | ||
| 203 | lua_pushliteral("nil"); | ||
| 204 | break; | ||
| 205 | case LUA_T_NUMBER : | ||
| 206 | lua_pushliteral("number"); | ||
| 207 | break; | ||
| 208 | case LUA_T_STRING : | ||
| 209 | lua_pushliteral("string"); | ||
| 210 | break; | ||
| 211 | case LUA_T_ARRAY : | ||
| 212 | lua_pushliteral("table"); | ||
| 213 | break; | ||
| 214 | case LUA_T_FUNCTION : | ||
| 215 | case LUA_T_CFUNCTION : | ||
| 216 | lua_pushliteral("function"); | ||
| 217 | break; | ||
| 218 | default : | ||
| 219 | lua_pushliteral("userdata"); | ||
| 220 | break; | ||
| 221 | } | 217 | } |
| 218 | lua_pushliteral(s); | ||
| 222 | lua_pushnumber(t); | 219 | lua_pushnumber(t); |
| 223 | } | 220 | } |
| 224 | 221 | ||
| 225 | /* | 222 | /* |
| 226 | ** Internal function: convert an object to a number | 223 | ** Internal function: convert an object to a number |
| 227 | */ | 224 | */ |
| 228 | void lua_obj2number (void) | 225 | static void lua_obj2number (void) |
| 229 | { | 226 | { |
| 230 | lua_Object o = lua_getparam(1); | 227 | lua_Object o = lua_getparam(1); |
| 231 | if (lua_isnumber(o)) | 228 | if (lua_isnumber(o)) |
| @@ -233,39 +230,36 @@ void lua_obj2number (void) | |||
| 233 | } | 230 | } |
| 234 | 231 | ||
| 235 | 232 | ||
| 236 | void luaI_error (void) | 233 | static void luaI_error (void) |
| 237 | { | 234 | { |
| 238 | char *s = lua_getstring(lua_getparam(1)); | 235 | char *s = lua_getstring(lua_getparam(1)); |
| 239 | if (s == NULL) s = "(no message)"; | 236 | if (s == NULL) s = "(no message)"; |
| 240 | lua_error(s); | 237 | lua_error(s); |
| 241 | } | 238 | } |
| 242 | 239 | ||
| 243 | void luaI_assert (void) | 240 | static void luaI_assert (void) |
| 244 | { | 241 | { |
| 245 | lua_Object p = lua_getparam(1); | 242 | lua_Object p = lua_getparam(1); |
| 246 | if (p == LUA_NOOBJECT || lua_isnil(p)) | 243 | if (p == LUA_NOOBJECT || lua_isnil(p)) |
| 247 | lua_error("assertion failed!"); | 244 | lua_error("assertion failed!"); |
| 248 | } | 245 | } |
| 249 | 246 | ||
| 250 | void luaI_setglobal (void) | 247 | static void luaI_setglobal (void) |
| 251 | { | 248 | { |
| 252 | lua_Object name = lua_getparam(1); | ||
| 253 | lua_Object value = lua_getparam(2); | 249 | lua_Object value = lua_getparam(2); |
| 254 | check_arg(lua_isstring(name), "setglobal"); | 250 | check_arg(value != LUA_NOOBJECT, "setglobal"); |
| 255 | lua_pushobject(value); | 251 | lua_pushobject(value); |
| 256 | lua_storeglobal(lua_getstring(name)); | 252 | lua_storeglobal(check_string(1, "setglobal")); |
| 257 | lua_pushobject(value); /* return given value */ | 253 | lua_pushobject(value); /* return given value */ |
| 258 | } | 254 | } |
| 259 | 255 | ||
| 260 | void luaI_getglobal (void) | 256 | static void luaI_getglobal (void) |
| 261 | { | 257 | { |
| 262 | lua_Object name = lua_getparam(1); | 258 | lua_pushobject(lua_getglobal(check_string(1, "getglobal"))); |
| 263 | check_arg(lua_isstring(name), "getglobal"); | ||
| 264 | lua_pushobject(lua_getglobal(lua_getstring(name))); | ||
| 265 | } | 259 | } |
| 266 | 260 | ||
| 267 | #define MAXPARAMS 256 | 261 | #define MAXPARAMS 256 |
| 268 | void luaI_call (void) | 262 | static void luaI_call (void) |
| 269 | { | 263 | { |
| 270 | lua_Object f = lua_getparam(1); | 264 | lua_Object f = lua_getparam(1); |
| 271 | lua_Object arg = lua_getparam(2); | 265 | lua_Object arg = lua_getparam(2); |
| @@ -298,3 +292,86 @@ void luaI_call (void) | |||
| 298 | else | 292 | else |
| 299 | passresults(); | 293 | passresults(); |
| 300 | } | 294 | } |
| 295 | |||
| 296 | static void luaIl_settag (void) | ||
| 297 | { | ||
| 298 | lua_Object o = lua_getparam(1); | ||
| 299 | check_arg(o != LUA_NOOBJECT, "settag"); | ||
| 300 | lua_pushobject(o); | ||
| 301 | lua_settag(check_number(2, "settag")); | ||
| 302 | } | ||
| 303 | |||
| 304 | static void luaIl_newtag (void) | ||
| 305 | { | ||
| 306 | lua_pushnumber(lua_newtag(check_string(1, "newtag"))); | ||
| 307 | } | ||
| 308 | |||
| 309 | static void basicindex (void) | ||
| 310 | { | ||
| 311 | lua_Object t = lua_getparam(1); | ||
| 312 | lua_Object i = lua_getparam(2); | ||
| 313 | check_arg(t != LUA_NOOBJECT && i != LUA_NOOBJECT, "basicindex"); | ||
| 314 | lua_pushobject(t); | ||
| 315 | lua_pushobject(i); | ||
| 316 | lua_pushobject(lua_basicindex()); | ||
| 317 | } | ||
| 318 | |||
| 319 | static void basicstoreindex (void) | ||
| 320 | { | ||
| 321 | lua_Object t = lua_getparam(1); | ||
| 322 | lua_Object i = lua_getparam(2); | ||
| 323 | lua_Object v = lua_getparam(3); | ||
| 324 | check_arg(t != LUA_NOOBJECT && i != LUA_NOOBJECT && v != LUA_NOOBJECT, | ||
| 325 | "basicindex"); | ||
| 326 | lua_pushobject(t); | ||
| 327 | lua_pushobject(i); | ||
| 328 | lua_pushobject(v); | ||
| 329 | lua_basicstoreindex(); | ||
| 330 | } | ||
| 331 | |||
| 332 | |||
| 333 | |||
| 334 | /* | ||
| 335 | ** Internal functions | ||
| 336 | */ | ||
| 337 | static struct { | ||
| 338 | char *name; | ||
| 339 | lua_CFunction func; | ||
| 340 | } int_funcs[] = { | ||
| 341 | {"assert", luaI_assert}, | ||
| 342 | {"call", luaI_call}, | ||
| 343 | {"basicindex", basicindex}, | ||
| 344 | {"basicstoreindex", basicstoreindex}, | ||
| 345 | {"settag", luaIl_settag}, | ||
| 346 | {"dofile", lua_internaldofile}, | ||
| 347 | {"dostring", lua_internaldostring}, | ||
| 348 | {"error", luaI_error}, | ||
| 349 | {"getglobal", luaI_getglobal}, | ||
| 350 | {"next", lua_next}, | ||
| 351 | {"nextvar", luaI_nextvar}, | ||
| 352 | {"newtag", luaIl_newtag}, | ||
| 353 | {"print", luaI_print}, | ||
| 354 | {"setfallback", luaI_setfallback}, | ||
| 355 | {"setintmethod", luaI_setintmethod}, | ||
| 356 | {"setglobal", luaI_setglobal}, | ||
| 357 | {"tonumber", lua_obj2number}, | ||
| 358 | {"tostring", luaI_tostring}, | ||
| 359 | {"type", luaI_type} | ||
| 360 | }; | ||
| 361 | |||
| 362 | #define INTFUNCSIZE (sizeof(int_funcs)/sizeof(int_funcs[0])) | ||
| 363 | |||
| 364 | |||
| 365 | void luaI_predefine (void) | ||
| 366 | { | ||
| 367 | int i; | ||
| 368 | Word n; | ||
| 369 | for (i=0; i<INTFUNCSIZE; i++) { | ||
| 370 | n = luaI_findsymbolbyname(int_funcs[i].name); | ||
| 371 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func; | ||
| 372 | } | ||
| 373 | n = luaI_findsymbolbyname("_VERSION_"); | ||
| 374 | s_tag(n) = LUA_T_STRING; s_tsvalue(n) = lua_createstring(LUA_VERSION); | ||
| 375 | } | ||
| 376 | |||
| 377 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: inout.h,v 1.15 1996/03/15 18:21:58 roberto Exp roberto $ | 2 | ** $Id: inout.h,v 1.16 1996/05/28 21:07:32 roberto Exp roberto $ |
| 3 | */ | 3 | */ |
| 4 | 4 | ||
| 5 | 5 | ||
| @@ -19,16 +19,6 @@ void lua_closefile (void); | |||
| 19 | void lua_openstring (char *s); | 19 | void lua_openstring (char *s); |
| 20 | void lua_closestring (void); | 20 | void lua_closestring (void); |
| 21 | 21 | ||
| 22 | void lua_internaldofile (void); | 22 | void luaI_predefine (void); |
| 23 | void lua_internaldostring (void); | ||
| 24 | void luaI_tostring (void); | ||
| 25 | void luaI_print (void); | ||
| 26 | void luaI_type (void); | ||
| 27 | void lua_obj2number (void); | ||
| 28 | void luaI_error (void); | ||
| 29 | void luaI_assert (void); | ||
| 30 | void luaI_setglobal (void); | ||
| 31 | void luaI_getglobal (void); | ||
| 32 | void luaI_call (void); | ||
| 33 | 23 | ||
| 34 | #endif | 24 | #endif |
| @@ -2,7 +2,7 @@ | |||
| 2 | ** LUA - Linguagem para Usuarios de Aplicacao | 2 | ** LUA - Linguagem para Usuarios de Aplicacao |
| 3 | ** Grupo de Tecnologia em Computacao Grafica | 3 | ** Grupo de Tecnologia em Computacao Grafica |
| 4 | ** TeCGraf - PUC-Rio | 4 | ** TeCGraf - PUC-Rio |
| 5 | ** $Id: lua.h,v 3.33 1997/02/11 11:40:01 roberto Exp roberto $ | 5 | ** $Id: lua.h,v 3.34 1997/02/20 15:51:14 roberto Exp roberto $ |
| 6 | */ | 6 | */ |
| 7 | 7 | ||
| 8 | 8 | ||
| @@ -19,13 +19,19 @@ | |||
| 19 | typedef void (*lua_CFunction) (void); | 19 | typedef void (*lua_CFunction) (void); |
| 20 | typedef unsigned int lua_Object; | 20 | typedef unsigned int lua_Object; |
| 21 | 21 | ||
| 22 | lua_Object lua_setfallback (char *name, lua_CFunction fallback); | 22 | lua_Object lua_setfallback (char *event, lua_CFunction fallback); |
| 23 | void lua_setintmethod (int tag, char *event, lua_CFunction method); | ||
| 24 | |||
| 25 | int lua_newtag (char *t); | ||
| 26 | void lua_settag (int tag); /* In: object */ | ||
| 23 | 27 | ||
| 24 | void lua_error (char *s); | 28 | void lua_error (char *s); |
| 25 | int lua_dofile (char *filename); | 29 | int lua_dofile (char *filename); /* Out: returns */ |
| 26 | int lua_dostring (char *string); | 30 | int lua_dostring (char *string); /* Out: returns */ |
| 27 | int lua_callfunction (lua_Object function); | 31 | int lua_callfunction (lua_Object f); |
| 32 | /* In: parameters; Out: returns */ | ||
| 28 | int lua_call (char *funcname); | 33 | int lua_call (char *funcname); |
| 34 | /* In: parameters; Out: returns */ | ||
| 29 | 35 | ||
| 30 | void lua_beginblock (void); | 36 | void lua_beginblock (void); |
| 31 | void lua_endblock (void); | 37 | void lua_endblock (void); |
| @@ -56,15 +62,17 @@ void lua_pushusertag (void *u, int tag); | |||
| 56 | void lua_pushobject (lua_Object object); | 62 | void lua_pushobject (lua_Object object); |
| 57 | 63 | ||
| 58 | lua_Object lua_getglobal (char *name); | 64 | lua_Object lua_getglobal (char *name); |
| 59 | void lua_storeglobal (char *name); | 65 | void lua_storeglobal (char *name); /* In: value */ |
| 60 | 66 | ||
| 61 | void lua_storesubscript (void); | 67 | void lua_storesubscript (void); /* In: table, index, value */ |
| 62 | lua_Object lua_getsubscript (void); | 68 | void lua_basicstoreindex (void); /* In: table, index, value */ |
| 69 | lua_Object lua_getsubscript (void); /* In: table, index */ | ||
| 70 | lua_Object lua_basicindex (void); /* In: table, index */ | ||
| 63 | 71 | ||
| 64 | int lua_type (lua_Object object); | 72 | int lua_tag (lua_Object object); |
| 65 | 73 | ||
| 66 | 74 | ||
| 67 | int lua_ref (int lock); | 75 | int lua_ref (int lock); /* In: value */ |
| 68 | lua_Object lua_getref (int ref); | 76 | lua_Object lua_getref (int ref); |
| 69 | void lua_pushref (int ref); | 77 | void lua_pushref (int ref); |
| 70 | void lua_unref (int ref); | 78 | void lua_unref (int ref); |
| @@ -84,6 +92,8 @@ lua_Object lua_createtable (void); | |||
| 84 | 92 | ||
| 85 | /* for compatibility with old versions. Avoid using these macros */ | 93 | /* for compatibility with old versions. Avoid using these macros */ |
| 86 | 94 | ||
| 95 | #define lua_type(o) (lua_tag(o)) | ||
| 96 | |||
| 87 | #define lua_getuserdata(o) (*(void **)lua_getbinarydata(o)) | 97 | #define lua_getuserdata(o) (*(void **)lua_getbinarydata(o)) |
| 88 | 98 | ||
| 89 | #define lua_lockobject(o) lua_refobject(o,1) | 99 | #define lua_lockobject(o) lua_refobject(o,1) |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** TecCGraf - PUC-Rio | 3 | ** TecCGraf - PUC-Rio |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_opcode="$Id: opcode.c,v 3.80 1997/02/11 11:35:05 roberto Exp roberto $"; | 6 | char *rcs_opcode="$Id: opcode.c,v 3.81 1997/02/20 15:51:14 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include <setjmp.h> | 8 | #include <setjmp.h> |
| 9 | #include <stdio.h> | 9 | #include <stdio.h> |
| @@ -261,15 +261,20 @@ static StkId callC (lua_CFunction func, StkId base) | |||
| 261 | return firstResult; | 261 | return firstResult; |
| 262 | } | 262 | } |
| 263 | 263 | ||
| 264 | static void callIM (Object *f, int nParams, int nResults) | ||
| 265 | { | ||
| 266 | open_stack(nParams); | ||
| 267 | *(top-nParams-1) = *f; | ||
| 268 | do_call((top-stack)-nParams, nResults); | ||
| 269 | } | ||
| 270 | |||
| 264 | /* | 271 | /* |
| 265 | ** Call the specified fallback, putting it on the stack below its arguments | 272 | ** Call the specified fallback, putting it on the stack below its arguments |
| 266 | */ | 273 | */ |
| 267 | static void callFB (int fb) | 274 | static void callFB (int fb) |
| 268 | { | 275 | { |
| 269 | int nParams = luaI_fallBacks[fb].nParams; | 276 | callIM(&luaI_fallBacks[fb].function, luaI_fallBacks[fb].nParams, |
| 270 | open_stack(nParams); | 277 | luaI_fallBacks[fb].nResults); |
| 271 | *(top-nParams-1) = luaI_fallBacks[fb].function; | ||
| 272 | do_call((top-stack)-nParams, luaI_fallBacks[fb].nResults); | ||
| 273 | } | 278 | } |
| 274 | 279 | ||
| 275 | 280 | ||
| @@ -320,35 +325,77 @@ static void do_call (StkId base, int nResults) | |||
| 320 | */ | 325 | */ |
| 321 | static void pushsubscript (void) | 326 | static void pushsubscript (void) |
| 322 | { | 327 | { |
| 328 | int tg = luaI_tag(top-2); | ||
| 329 | Object *im = luaI_getim(tg, FB_GETTABLE); | ||
| 330 | if (tag(top-2) == LUA_T_ARRAY && im == NULL) { | ||
| 331 | Object *h = lua_hashget(avalue(top-2), top-1); | ||
| 332 | if (h != NULL && tag(h) != LUA_T_NIL) { | ||
| 333 | --top; | ||
| 334 | *(top-1) = *h; | ||
| 335 | } | ||
| 336 | else if (tg == LUA_T_ARRAY && | ||
| 337 | (im=luaI_getim(0, FB_INDEX)) != NULL) | ||
| 338 | callIM(im, 2, 1); | ||
| 339 | else { | ||
| 340 | --top; | ||
| 341 | tag(top-1) = LUA_T_NIL; | ||
| 342 | } | ||
| 343 | } | ||
| 344 | else { /* object is not a table, and/or has a specific "gettable" method */ | ||
| 345 | if (im) | ||
| 346 | callIM(im, 2, 1); | ||
| 347 | else | ||
| 348 | lua_error("indexed expression not a table"); | ||
| 349 | } | ||
| 350 | } | ||
| 351 | |||
| 352 | |||
| 353 | lua_Object lua_basicindex (void) | ||
| 354 | { | ||
| 355 | adjustC(2); | ||
| 323 | if (tag(top-2) != LUA_T_ARRAY) | 356 | if (tag(top-2) != LUA_T_ARRAY) |
| 324 | callFB(FB_GETTABLE); | 357 | lua_error("indexed expression not a table in basic indexing"); |
| 325 | else | 358 | else { |
| 326 | { | ||
| 327 | Object *h = lua_hashget(avalue(top-2), top-1); | 359 | Object *h = lua_hashget(avalue(top-2), top-1); |
| 328 | if (h == NULL || tag(h) == LUA_T_NIL) | 360 | --top; |
| 329 | callFB(FB_INDEX); | 361 | if (h != NULL) |
| 330 | else | ||
| 331 | { | ||
| 332 | --top; | ||
| 333 | *(top-1) = *h; | 362 | *(top-1) = *h; |
| 334 | } | 363 | else |
| 364 | tag(top-1) = LUA_T_NIL; | ||
| 335 | } | 365 | } |
| 366 | CLS_current.base++; /* incorporate object in the stack */ | ||
| 367 | return (Ref(top-1)); | ||
| 336 | } | 368 | } |
| 337 | 369 | ||
| 338 | 370 | ||
| 339 | /* | 371 | /* |
| 340 | ** Function to store indexed based on values at the top | 372 | ** Function to store indexed based on values at the top |
| 373 | ** mode = 0: basic store (without internal methods) | ||
| 374 | ** mode = 1: normal store (with internal methods) | ||
| 375 | ** mode = 2: "deep stack" store (with internal methods) | ||
| 341 | */ | 376 | */ |
| 342 | static void storesubscript (void) | 377 | static void storesubscript (Object *t, int mode) |
| 343 | { | 378 | { |
| 344 | if (tag(top-3) != LUA_T_ARRAY) | 379 | Object *im = (mode == 0) ? NULL : luaI_getim(luaI_tag(t), FB_SETTABLE); |
| 345 | callFB(FB_SETTABLE); | 380 | if (tag(t) == LUA_T_ARRAY && im == NULL) { |
| 346 | else | 381 | Object *h = lua_hashdefine(avalue(t), t+1); |
| 347 | { | 382 | *h = *(top-1); |
| 348 | Object *h = lua_hashdefine (avalue(top-3), top-2); | 383 | top -= (mode == 2) ? 1 : 3; |
| 349 | *h = *(top-1); | 384 | } |
| 350 | top -= 3; | 385 | else { /* object is not a table, and/or has a specific "settable" method */ |
| 351 | } | 386 | if (im) { |
| 387 | if (mode == 2) { | ||
| 388 | lua_checkstack(top+2); | ||
| 389 | *(top+1) = *(top-1); | ||
| 390 | *(top) = *(t+1); | ||
| 391 | *(top-1) = *t; | ||
| 392 | top += 2; | ||
| 393 | } | ||
| 394 | callIM(im, 3, 0); | ||
| 395 | } | ||
| 396 | else | ||
| 397 | lua_error("indexed expression not a table"); | ||
| 398 | } | ||
| 352 | } | 399 | } |
| 353 | 400 | ||
| 354 | 401 | ||
| @@ -450,6 +497,26 @@ int lua_setlocal (lua_Function func, int local_number) | |||
| 450 | return 0; | 497 | return 0; |
| 451 | } | 498 | } |
| 452 | 499 | ||
| 500 | /* | ||
| 501 | ** Call the function at CLS_current.base, and incorporate results on | ||
| 502 | ** the Lua2C structure. | ||
| 503 | */ | ||
| 504 | static void do_callinc (int nResults) | ||
| 505 | { | ||
| 506 | do_call(CLS_current.base+1, nResults); | ||
| 507 | CLS_current.num = (top-stack) - CLS_current.base; /* number of results */ | ||
| 508 | CLS_current.base += CLS_current.num; /* incorporate results on the stack */ | ||
| 509 | } | ||
| 510 | |||
| 511 | static void do_unprotectedrun (lua_CFunction f, int nParams, int nResults) | ||
| 512 | { | ||
| 513 | adjustC(nParams); | ||
| 514 | open_stack((top-stack)-CLS_current.base); | ||
| 515 | stack[CLS_current.base].tag = LUA_T_CFUNCTION; | ||
| 516 | stack[CLS_current.base].value.f = f; | ||
| 517 | do_callinc(nResults); | ||
| 518 | } | ||
| 519 | |||
| 453 | 520 | ||
| 454 | /* | 521 | /* |
| 455 | ** Execute a protected call. Assumes that function is at CLS_current.base and | 522 | ** Execute a protected call. Assumes that function is at CLS_current.base and |
| @@ -462,15 +529,11 @@ static int do_protectedrun (int nResults) | |||
| 462 | struct C_Lua_Stack oldCLS = CLS_current; | 529 | struct C_Lua_Stack oldCLS = CLS_current; |
| 463 | jmp_buf *oldErr = errorJmp; | 530 | jmp_buf *oldErr = errorJmp; |
| 464 | errorJmp = &myErrorJmp; | 531 | errorJmp = &myErrorJmp; |
| 465 | if (setjmp(myErrorJmp) == 0) | 532 | if (setjmp(myErrorJmp) == 0) { |
| 466 | { | 533 | do_callinc(nResults); |
| 467 | do_call(CLS_current.base+1, nResults); | ||
| 468 | CLS_current.num = (top-stack) - CLS_current.base; /* number of results */ | ||
| 469 | CLS_current.base += CLS_current.num; /* incorporate results on the stack */ | ||
| 470 | status = 0; | 534 | status = 0; |
| 471 | } | 535 | } |
| 472 | else | 536 | else { /* an error occurred: restore CLS_current and top */ |
| 473 | { /* an error occurred: restore CLS_current and top */ | ||
| 474 | CLS_current = oldCLS; | 537 | CLS_current = oldCLS; |
| 475 | top = stack+CLS_current.base; | 538 | top = stack+CLS_current.base; |
| 476 | status = 1; | 539 | status = 1; |
| @@ -586,15 +649,18 @@ int lua_dostring (char *str) | |||
| 586 | */ | 649 | */ |
| 587 | lua_Object lua_setfallback (char *name, lua_CFunction fallback) | 650 | lua_Object lua_setfallback (char *name, lua_CFunction fallback) |
| 588 | { | 651 | { |
| 589 | adjustC(1); /* one slot for the pseudo-function */ | ||
| 590 | stack[CLS_current.base].tag = LUA_T_CFUNCTION; | ||
| 591 | stack[CLS_current.base].value.f = luaI_setfallback; | ||
| 592 | lua_pushstring(name); | 652 | lua_pushstring(name); |
| 593 | lua_pushcfunction(fallback); | 653 | lua_pushcfunction(fallback); |
| 594 | if (do_protectedrun(1) == 0) | 654 | do_unprotectedrun(luaI_setfallback, 2, 1); |
| 595 | return (Ref(top-1)); | 655 | return (Ref(top-1)); |
| 596 | else | 656 | } |
| 597 | return LUA_NOOBJECT; | 657 | |
| 658 | void lua_setintmethod (int tag, char *event, lua_CFunction method) | ||
| 659 | { | ||
| 660 | lua_pushnumber(tag); | ||
| 661 | lua_pushstring(event); | ||
| 662 | lua_pushcfunction (method); | ||
| 663 | do_unprotectedrun(luaI_setintmethod, 3, 0); | ||
| 598 | } | 664 | } |
| 599 | 665 | ||
| 600 | 666 | ||
| @@ -637,13 +703,25 @@ void lua_endblock (void) | |||
| 637 | adjustC(0); | 703 | adjustC(0); |
| 638 | } | 704 | } |
| 639 | 705 | ||
| 706 | void lua_settag (int tag) | ||
| 707 | { | ||
| 708 | adjustC(1); | ||
| 709 | luaI_settag(tag, --top); | ||
| 710 | } | ||
| 711 | |||
| 640 | /* | 712 | /* |
| 641 | ** API: receives on the stack the table, the index, and the new value. | 713 | ** API: receives on the stack the table, the index, and the new value. |
| 642 | */ | 714 | */ |
| 643 | void lua_storesubscript (void) | 715 | void lua_storesubscript (void) |
| 644 | { | 716 | { |
| 645 | adjustC(3); | 717 | adjustC(3); |
| 646 | storesubscript(); | 718 | storesubscript(top-3, 1); |
| 719 | } | ||
| 720 | |||
| 721 | void lua_basicstoreindex (void) | ||
| 722 | { | ||
| 723 | adjustC(3); | ||
| 724 | storesubscript(top-3, 0); | ||
| 647 | } | 725 | } |
| 648 | 726 | ||
| 649 | /* | 727 | /* |
| @@ -688,7 +766,7 @@ int lua_isuserdata (lua_Object o) | |||
| 688 | 766 | ||
| 689 | int lua_iscfunction (lua_Object o) | 767 | int lua_iscfunction (lua_Object o) |
| 690 | { | 768 | { |
| 691 | int t = lua_type(o); | 769 | int t = lua_tag(o); |
| 692 | return (t == LUA_T_CMARK) || (t == LUA_T_CFUNCTION); | 770 | return (t == LUA_T_CMARK) || (t == LUA_T_CFUNCTION); |
| 693 | } | 771 | } |
| 694 | 772 | ||
| @@ -699,13 +777,13 @@ int lua_isnumber (lua_Object o) | |||
| 699 | 777 | ||
| 700 | int lua_isstring (lua_Object o) | 778 | int lua_isstring (lua_Object o) |
| 701 | { | 779 | { |
| 702 | int t = lua_type(o); | 780 | int t = lua_tag(o); |
| 703 | return (t == LUA_T_STRING) || (t == LUA_T_NUMBER); | 781 | return (t == LUA_T_STRING) || (t == LUA_T_NUMBER); |
| 704 | } | 782 | } |
| 705 | 783 | ||
| 706 | int lua_isfunction (lua_Object o) | 784 | int lua_isfunction (lua_Object o) |
| 707 | { | 785 | { |
| 708 | int t = lua_type(o); | 786 | int t = lua_tag(o); |
| 709 | return (t == LUA_T_FUNCTION) || (t == LUA_T_CFUNCTION) || | 787 | return (t == LUA_T_FUNCTION) || (t == LUA_T_CFUNCTION) || |
| 710 | (t == LUA_T_MARK) || (t == LUA_T_CMARK); | 788 | (t == LUA_T_MARK) || (t == LUA_T_CMARK); |
| 711 | } | 789 | } |
| @@ -893,16 +971,9 @@ void lua_pushobject (lua_Object o) | |||
| 893 | incr_top; | 971 | incr_top; |
| 894 | } | 972 | } |
| 895 | 973 | ||
| 896 | int lua_type (lua_Object o) | 974 | int lua_tag (lua_Object o) |
| 897 | { | 975 | { |
| 898 | if (o == LUA_NOOBJECT) | 976 | return (o == LUA_NOOBJECT) ? LUA_T_NIL : luaI_tag(Address(o)); |
| 899 | return LUA_T_NIL; | ||
| 900 | else { | ||
| 901 | lua_Type t = tag(Address(o)); | ||
| 902 | if (t == LUA_T_USERDATA) | ||
| 903 | return (Address(o))->value.ts->tag; | ||
| 904 | else return t; | ||
| 905 | } | ||
| 906 | } | 977 | } |
| 907 | 978 | ||
| 908 | 979 | ||
| @@ -1085,29 +1156,14 @@ static StkId lua_execute (Byte *pc, StkId base) | |||
| 1085 | break; | 1156 | break; |
| 1086 | 1157 | ||
| 1087 | case STOREINDEXED0: | 1158 | case STOREINDEXED0: |
| 1088 | storesubscript(); | 1159 | storesubscript(top-3, 1); |
| 1089 | break; | 1160 | break; |
| 1090 | 1161 | ||
| 1091 | case STOREINDEXED: | 1162 | case STOREINDEXED: { |
| 1092 | { | 1163 | int n = *pc++; |
| 1093 | int n = *pc++; | 1164 | storesubscript(top-3-n, 2); |
| 1094 | if (tag(top-3-n) != LUA_T_ARRAY) | 1165 | break; |
| 1095 | { | ||
| 1096 | lua_checkstack(top+2); | ||
| 1097 | *(top+1) = *(top-1); | ||
| 1098 | *(top) = *(top-2-n); | ||
| 1099 | *(top-1) = *(top-3-n); | ||
| 1100 | top += 2; | ||
| 1101 | callFB(FB_SETTABLE); | ||
| 1102 | } | ||
| 1103 | else | ||
| 1104 | { | ||
| 1105 | Object *h = lua_hashdefine (avalue(top-3-n), top-2-n); | ||
| 1106 | *h = *(top-1); | ||
| 1107 | top--; | ||
| 1108 | } | ||
| 1109 | } | 1166 | } |
| 1110 | break; | ||
| 1111 | 1167 | ||
| 1112 | case STORELIST0: | 1168 | case STORELIST0: |
| 1113 | case STORELIST: | 1169 | case STORELIST: |
| @@ -3,7 +3,7 @@ | |||
| 3 | ** Module to control static tables | 3 | ** Module to control static tables |
| 4 | */ | 4 | */ |
| 5 | 5 | ||
| 6 | char *rcs_table="$Id: table.c,v 2.57 1996/07/12 20:00:26 roberto Exp roberto $"; | 6 | char *rcs_table="$Id: table.c,v 2.58 1996/11/01 12:47:45 roberto Exp roberto $"; |
| 7 | 7 | ||
| 8 | #include "mem.h" | 8 | #include "mem.h" |
| 9 | #include "opcode.h" | 9 | #include "opcode.h" |
| @@ -29,47 +29,12 @@ static Long lua_maxconstant = 0; | |||
| 29 | 29 | ||
| 30 | #define GARBAGE_BLOCK 50 | 30 | #define GARBAGE_BLOCK 50 |
| 31 | 31 | ||
| 32 | static void lua_nextvar (void); | ||
| 33 | |||
| 34 | /* | ||
| 35 | ** Internal functions | ||
| 36 | */ | ||
| 37 | static struct { | ||
| 38 | char *name; | ||
| 39 | lua_CFunction func; | ||
| 40 | } int_funcs[] = { | ||
| 41 | {"assert", luaI_assert}, | ||
| 42 | {"call", luaI_call}, | ||
| 43 | {"dofile", lua_internaldofile}, | ||
| 44 | {"dostring", lua_internaldostring}, | ||
| 45 | {"error", luaI_error}, | ||
| 46 | {"getglobal", luaI_getglobal}, | ||
| 47 | {"next", lua_next}, | ||
| 48 | {"nextvar", lua_nextvar}, | ||
| 49 | {"print", luaI_print}, | ||
| 50 | {"setfallback", luaI_setfallback}, | ||
| 51 | {"setglobal", luaI_setglobal}, | ||
| 52 | {"tonumber", lua_obj2number}, | ||
| 53 | {"tostring", luaI_tostring}, | ||
| 54 | {"type", luaI_type} | ||
| 55 | }; | ||
| 56 | |||
| 57 | #define INTFUNCSIZE (sizeof(int_funcs)/sizeof(int_funcs[0])) | ||
| 58 | |||
| 59 | 32 | ||
| 60 | void luaI_initsymbol (void) | 33 | void luaI_initsymbol (void) |
| 61 | { | 34 | { |
| 62 | int i; | ||
| 63 | Word n; | ||
| 64 | lua_maxsymbol = BUFFER_BLOCK; | 35 | lua_maxsymbol = BUFFER_BLOCK; |
| 65 | lua_table = newvector(lua_maxsymbol, Symbol); | 36 | lua_table = newvector(lua_maxsymbol, Symbol); |
| 66 | for (i=0; i<INTFUNCSIZE; i++) | 37 | luaI_predefine(); |
| 67 | { | ||
| 68 | n = luaI_findsymbolbyname(int_funcs[i].name); | ||
| 69 | s_tag(n) = LUA_T_CFUNCTION; s_fvalue(n) = int_funcs[i].func; | ||
| 70 | } | ||
| 71 | n = luaI_findsymbolbyname("_VERSION_"); | ||
| 72 | s_tag(n) = LUA_T_STRING; s_tsvalue(n) = lua_createstring(LUA_VERSION); | ||
| 73 | } | 38 | } |
| 74 | 39 | ||
| 75 | 40 | ||
| @@ -225,7 +190,7 @@ void lua_pack (void) | |||
| 225 | /* | 190 | /* |
| 226 | ** Internal function: return next global variable | 191 | ** Internal function: return next global variable |
| 227 | */ | 192 | */ |
| 228 | static void lua_nextvar (void) | 193 | void luaI_nextvar (void) |
| 229 | { | 194 | { |
| 230 | Word next; | 195 | Word next; |
| 231 | lua_Object o = lua_getparam(1); | 196 | lua_Object o = lua_getparam(1); |
| @@ -1,7 +1,7 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** Module to control static tables | 2 | ** Module to control static tables |
| 3 | ** TeCGraf - PUC-Rio | 3 | ** TeCGraf - PUC-Rio |
| 4 | ** $Id: table.h,v 2.20 1996/03/14 15:57:19 roberto Exp roberto $ | 4 | ** $Id: table.h,v 2.21 1996/04/22 18:00:37 roberto Exp roberto $ |
| 5 | */ | 5 | */ |
| 6 | 6 | ||
| 7 | #ifndef table_h | 7 | #ifndef table_h |
| @@ -28,6 +28,7 @@ Word luaI_findsymbolbyname (char *name); | |||
| 28 | Word luaI_findsymbol (TaggedString *t); | 28 | Word luaI_findsymbol (TaggedString *t); |
| 29 | Word luaI_findconstant (TaggedString *t); | 29 | Word luaI_findconstant (TaggedString *t); |
| 30 | Word luaI_findconstantbyname (char *name); | 30 | Word luaI_findconstantbyname (char *name); |
| 31 | void luaI_nextvar (void); | ||
| 31 | TaggedString *luaI_createfixedstring (char *str); | 32 | TaggedString *luaI_createfixedstring (char *str); |
| 32 | int lua_markobject (Object *o); | 33 | int lua_markobject (Object *o); |
| 33 | int luaI_ismarked (Object *o); | 34 | int luaI_ismarked (Object *o); |
