diff options
| -rw-r--r-- | lapi.c | 118 | ||||
| -rw-r--r-- | ldblib.c | 17 | ||||
| -rw-r--r-- | liolib.c | 75 | ||||
| -rw-r--r-- | lstate.c | 21 | ||||
| -rw-r--r-- | lstrlib.c | 4 | ||||
| -rw-r--r-- | ltests.c | 30 | ||||
| -rw-r--r-- | ltm.c | 17 | ||||
| -rw-r--r-- | ltm.h | 4 | ||||
| -rw-r--r-- | lua.c | 17 | ||||
| -rw-r--r-- | lua.h | 24 | ||||
| -rw-r--r-- | lualib.h | 23 | ||||
| -rw-r--r-- | lvm.c | 126 | ||||
| -rw-r--r-- | lvm.h | 11 |
13 files changed, 262 insertions, 225 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.92 2000/08/31 20:23:40 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.93 2000/08/31 21:01:43 roberto Exp roberto $ |
| 3 | ** Lua API | 3 | ** Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -69,25 +69,24 @@ void lua_settop (lua_State *L, int index) { | |||
| 69 | } | 69 | } |
| 70 | 70 | ||
| 71 | 71 | ||
| 72 | void lua_move (lua_State *L, int index) { | 72 | void lua_remove (lua_State *L, int index) { |
| 73 | TObject *p = Index(L, index); | 73 | StkId p = Index(L, index); |
| 74 | TObject temp = *p; | ||
| 75 | while (++p < L->top) *(p-1) = *p; | 74 | while (++p < L->top) *(p-1) = *p; |
| 76 | *(L->top-1) = temp; | 75 | L->top--; |
| 77 | } | 76 | } |
| 78 | 77 | ||
| 79 | 78 | ||
| 80 | void lua_insert (lua_State *L, int index) { | 79 | void lua_insert (lua_State *L, int index) { |
| 81 | TObject temp = *(L->top-1); | 80 | TObject temp = *(L->top-1); |
| 82 | TObject *p = Index(L, index); | 81 | StkId p = Index(L, index); |
| 83 | TObject *q; | 82 | StkId q; |
| 84 | for (q = L->top-1; q>p; q--) | 83 | for (q = L->top-1; q>p; q--) |
| 85 | *q = *(q-1); | 84 | *q = *(q-1); |
| 86 | *p = temp; | 85 | *p = temp; |
| 87 | } | 86 | } |
| 88 | 87 | ||
| 89 | 88 | ||
| 90 | void lua_pushobject (lua_State *L, int index) { | 89 | void lua_pushvalue (lua_State *L, int index) { |
| 91 | *L->top = *Index(L, index); | 90 | *L->top = *Index(L, index); |
| 92 | api_incr_top(L); | 91 | api_incr_top(L); |
| 93 | } | 92 | } |
| @@ -133,17 +132,24 @@ int lua_isnumber (lua_State *L, int index) { | |||
| 133 | 132 | ||
| 134 | int lua_tag (lua_State *L, int index) { | 133 | int lua_tag (lua_State *L, int index) { |
| 135 | btest(L, index, | 134 | btest(L, index, |
| 136 | ((ttype(o) == TAG_USERDATA) ? tsvalue(o)->u.d.tag : luaT_effectivetag(L, o)), | 135 | ((ttype(o) == TAG_USERDATA) ? tsvalue(o)->u.d.tag : |
| 137 | -1); | 136 | luaT_effectivetag(L, o)), -1); |
| 138 | } | 137 | } |
| 139 | 138 | ||
| 140 | int lua_equal(lua_State *L, int index1, int index2) { | 139 | int lua_equal (lua_State *L, int index1, int index2) { |
| 141 | StkId o1 = Index(L, index1); | 140 | StkId o1 = Index(L, index1); |
| 142 | StkId o2 = Index(L, index2); | 141 | StkId o2 = Index(L, index2); |
| 143 | if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */ | 142 | if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */ |
| 144 | else return luaO_equalObj(o1, o2); | 143 | else return luaO_equalObj(o1, o2); |
| 145 | } | 144 | } |
| 146 | 145 | ||
| 146 | int lua_lessthan (lua_State *L, int index1, int index2) { | ||
| 147 | StkId o1 = Index(L, index1); | ||
| 148 | StkId o2 = Index(L, index2); | ||
| 149 | if (o1 >= L->top || o2 >= L->top) return 0; /* index out-of-range */ | ||
| 150 | else return luaV_lessthan(L, o1, o2, L->top); | ||
| 151 | } | ||
| 152 | |||
| 147 | 153 | ||
| 148 | 154 | ||
| 149 | double lua_tonumber (lua_State *L, int index) { | 155 | double lua_tonumber (lua_State *L, int index) { |
| @@ -168,14 +174,13 @@ void *lua_touserdata (lua_State *L, int index) { | |||
| 168 | } | 174 | } |
| 169 | 175 | ||
| 170 | const void *lua_topointer (lua_State *L, int index) { | 176 | const void *lua_topointer (lua_State *L, int index) { |
| 171 | const TObject *o = Index(L, index); | 177 | StkId o = Index(L, index); |
| 172 | switch (ttype(o)) { | 178 | switch (ttype(o)) { |
| 173 | case TAG_NUMBER: case TAG_NIL: | 179 | case TAG_NUMBER: case TAG_NIL: |
| 174 | return NULL; | 180 | return NULL; |
| 175 | case TAG_STRING: | 181 | case TAG_STRING: |
| 176 | return tsvalue(o)->str; | ||
| 177 | case TAG_USERDATA: | 182 | case TAG_USERDATA: |
| 178 | return tsvalue(o)->u.d.value; | 183 | return tsvalue(o); |
| 179 | case TAG_TABLE: | 184 | case TAG_TABLE: |
| 180 | return hvalue(o); | 185 | return hvalue(o); |
| 181 | case TAG_CCLOSURE: case TAG_LCLOSURE: | 186 | case TAG_CCLOSURE: case TAG_LCLOSURE: |
| @@ -243,31 +248,38 @@ void lua_pushusertag (lua_State *L, void *u, int tag) { /* ORDER LUA_T */ | |||
| 243 | 248 | ||
| 244 | 249 | ||
| 245 | void lua_getglobal (lua_State *L, const char *name) { | 250 | void lua_getglobal (lua_State *L, const char *name) { |
| 246 | luaV_getglobal(L, luaS_new(L, name), L->top++); | 251 | StkId top = L->top; |
| 252 | *top = *luaV_getglobal(L, luaS_new(L, name)); | ||
| 253 | L->top = top+1; | ||
| 247 | } | 254 | } |
| 248 | 255 | ||
| 249 | 256 | ||
| 250 | void lua_gettable (lua_State *L) { | 257 | void lua_gettable (lua_State *L, int tableindex) { |
| 251 | luaV_gettable(L, L->top--); | 258 | StkId t = Index(L, tableindex); |
| 259 | StkId top = L->top; | ||
| 260 | *(top-1) = *luaV_gettable(L, t); | ||
| 261 | L->top = top; /* tag method may change top */ | ||
| 252 | } | 262 | } |
| 253 | 263 | ||
| 254 | 264 | ||
| 255 | void lua_rawget (lua_State *L) { | 265 | void lua_rawget (lua_State *L, int tableindex) { |
| 256 | LUA_ASSERT(ttype(L->top-2) == TAG_TABLE, "table expected"); | 266 | StkId t = Index(L, tableindex); |
| 257 | *(L->top - 2) = *luaH_get(L, hvalue(L->top - 2), L->top - 1); | 267 | LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); |
| 258 | L->top--; | 268 | *(L->top - 1) = *luaH_get(L, hvalue(t), L->top - 1); |
| 259 | } | 269 | } |
| 260 | 270 | ||
| 261 | 271 | ||
| 262 | void lua_getglobals (lua_State *L) { | 272 | void lua_rawgeti (lua_State *L, int index, int n) { |
| 263 | hvalue(L->top) = L->gt; | 273 | StkId o = Index(L, index); |
| 264 | ttype(L->top) = TAG_TABLE; | 274 | LUA_ASSERT(ttype(o) == TAG_TABLE, "table expected"); |
| 275 | *L->top = *luaH_getnum(hvalue(o), n); | ||
| 265 | api_incr_top(L); | 276 | api_incr_top(L); |
| 266 | } | 277 | } |
| 267 | 278 | ||
| 268 | 279 | ||
| 269 | void lua_gettagmethod (lua_State *L, int tag, const char *event) { | 280 | void lua_getglobals (lua_State *L) { |
| 270 | *L->top = *luaT_gettagmethod(L, tag, event); | 281 | hvalue(L->top) = L->gt; |
| 282 | ttype(L->top) = TAG_TABLE; | ||
| 271 | api_incr_top(L); | 283 | api_incr_top(L); |
| 272 | } | 284 | } |
| 273 | 285 | ||
| @@ -300,38 +312,40 @@ void lua_newtable (lua_State *L) { | |||
| 300 | 312 | ||
| 301 | 313 | ||
| 302 | void lua_setglobal (lua_State *L, const char *name) { | 314 | void lua_setglobal (lua_State *L, const char *name) { |
| 303 | luaV_setglobal(L, luaS_new(L, name), L->top--); | 315 | StkId top = L->top; |
| 316 | luaV_setglobal(L, luaS_new(L, name)); | ||
| 317 | L->top = top-1; /* remove element from the top */ | ||
| 304 | } | 318 | } |
| 305 | 319 | ||
| 306 | 320 | ||
| 307 | void lua_settable (lua_State *L) { | 321 | void lua_settable (lua_State *L, int tableindex) { |
| 322 | StkId t = Index(L, tableindex); | ||
| 308 | StkId top = L->top; | 323 | StkId top = L->top; |
| 309 | luaV_settable(L, top-3, top); | 324 | luaV_settable(L, t, top-2); |
| 310 | L->top = top-3; /* pop table, index, and value */ | 325 | L->top = top-2; /* pop index and value */ |
| 311 | } | 326 | } |
| 312 | 327 | ||
| 313 | 328 | ||
| 314 | void lua_rawset (lua_State *L) { | 329 | void lua_rawset (lua_State *L, int tableindex) { |
| 315 | LUA_ASSERT(ttype(L->top-3) == TAG_TABLE, "table expected"); | 330 | StkId t = Index(L, tableindex); |
| 316 | *luaH_set(L, hvalue(L->top-3), L->top-2) = *(L->top-1); | 331 | LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); |
| 317 | L->top -= 3; | 332 | *luaH_set(L, hvalue(t), L->top-2) = *(L->top-1); |
| 333 | L->top -= 2; | ||
| 318 | } | 334 | } |
| 319 | 335 | ||
| 320 | 336 | ||
| 321 | void lua_setglobals (lua_State *L) { | 337 | void lua_rawseti (lua_State *L, int index, int n) { |
| 322 | TObject *newtable = --L->top; | 338 | StkId o = Index(L, index); |
| 323 | LUA_ASSERT(ttype(newtable) == TAG_TABLE, "table expected"); | 339 | LUA_ASSERT(ttype(o) == TAG_TABLE, "table expected"); |
| 324 | L->gt = hvalue(newtable); | 340 | *luaH_setint(L, hvalue(o), n) = *(L->top-1); |
| 341 | L->top--; | ||
| 325 | } | 342 | } |
| 326 | 343 | ||
| 327 | 344 | ||
| 328 | void lua_settagmethod (lua_State *L, int tag, const char *event) { | 345 | void lua_setglobals (lua_State *L) { |
| 329 | TObject *method = L->top - 1; | 346 | StkId newtable = --L->top; |
| 330 | if (ttype(method) != TAG_NIL && | 347 | LUA_ASSERT(ttype(newtable) == TAG_TABLE, "table expected"); |
| 331 | ttype(method) != TAG_CCLOSURE && | 348 | L->gt = hvalue(newtable); |
| 332 | ttype(method) != TAG_LCLOSURE) | ||
| 333 | lua_error(L, "Lua API error - tag method must be a function or nil"); | ||
| 334 | luaT_settagmethod(L, tag, event, method); | ||
| 335 | } | 349 | } |
| 336 | 350 | ||
| 337 | 351 | ||
| @@ -362,7 +376,6 @@ int lua_ref (lua_State *L, int lock) { | |||
| 362 | ** miscellaneous functions | 376 | ** miscellaneous functions |
| 363 | */ | 377 | */ |
| 364 | 378 | ||
| 365 | |||
| 366 | void lua_settag (lua_State *L, int tag) { | 379 | void lua_settag (lua_State *L, int tag) { |
| 367 | luaT_realtag(L, tag); | 380 | luaT_realtag(L, tag); |
| 368 | switch (ttype(L->top-1)) { | 381 | switch (ttype(L->top-1)) { |
| @@ -389,8 +402,8 @@ void lua_unref (lua_State *L, int ref) { | |||
| 389 | } | 402 | } |
| 390 | 403 | ||
| 391 | 404 | ||
| 392 | int lua_next (lua_State *L) { | 405 | int lua_next (lua_State *L, int tableindex) { |
| 393 | const TObject *t = Index(L, -2); | 406 | StkId t = Index(L, tableindex); |
| 394 | Node *n; | 407 | Node *n; |
| 395 | LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); | 408 | LUA_ASSERT(ttype(t) == TAG_TABLE, "table expected"); |
| 396 | n = luaH_next(L, hvalue(t), Index(L, -1)); | 409 | n = luaH_next(L, hvalue(t), Index(L, -1)); |
| @@ -401,7 +414,7 @@ int lua_next (lua_State *L) { | |||
| 401 | return 1; | 414 | return 1; |
| 402 | } | 415 | } |
| 403 | else { /* no more elements */ | 416 | else { /* no more elements */ |
| 404 | L->top -= 2; /* remove key and table */ | 417 | L->top -= 1; /* remove key */ |
| 405 | return 0; | 418 | return 0; |
| 406 | } | 419 | } |
| 407 | } | 420 | } |
| @@ -427,3 +440,10 @@ int lua_getn (lua_State *L, int index) { | |||
| 427 | } | 440 | } |
| 428 | } | 441 | } |
| 429 | 442 | ||
| 443 | |||
| 444 | void lua_concat (lua_State *L, int n) { | ||
| 445 | StkId top = L->top; | ||
| 446 | luaV_strconc(L, n, top); | ||
| 447 | L->top = top-(n-1); | ||
| 448 | } | ||
| 449 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldblib.c,v 1.18 2000/08/09 19:16:57 roberto Exp roberto $ | 2 | ** $Id: ldblib.c,v 1.19 2000/08/28 17:57:04 roberto Exp roberto $ |
| 3 | ** Interface from Lua to its debug API | 3 | ** Interface from Lua to its debug API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -18,18 +18,16 @@ | |||
| 18 | 18 | ||
| 19 | 19 | ||
| 20 | static void settabss (lua_State *L, const char *i, const char *v) { | 20 | static void settabss (lua_State *L, const char *i, const char *v) { |
| 21 | lua_pushobject(L, -1); | ||
| 22 | lua_pushstring(L, i); | 21 | lua_pushstring(L, i); |
| 23 | lua_pushstring(L, v); | 22 | lua_pushstring(L, v); |
| 24 | lua_settable(L); | 23 | lua_settable(L, -3); |
| 25 | } | 24 | } |
| 26 | 25 | ||
| 27 | 26 | ||
| 28 | static void settabsi (lua_State *L, const char *i, int v) { | 27 | static void settabsi (lua_State *L, const char *i, int v) { |
| 29 | lua_pushobject(L, -1); | ||
| 30 | lua_pushstring(L, i); | 28 | lua_pushstring(L, i); |
| 31 | lua_pushnumber(L, v); | 29 | lua_pushnumber(L, v); |
| 32 | lua_settable(L); | 30 | lua_settable(L, -3); |
| 33 | } | 31 | } |
| 34 | 32 | ||
| 35 | 33 | ||
| @@ -44,7 +42,7 @@ static int getinfo (lua_State *L) { | |||
| 44 | } | 42 | } |
| 45 | } | 43 | } |
| 46 | else if (lua_isfunction(L, 1)) { | 44 | else if (lua_isfunction(L, 1)) { |
| 47 | lua_pushobject(L, 1); | 45 | lua_pushvalue(L, 1); |
| 48 | sprintf(buff, ">%.10s", options); | 46 | sprintf(buff, ">%.10s", options); |
| 49 | options = buff; | 47 | options = buff; |
| 50 | } | 48 | } |
| @@ -71,10 +69,9 @@ static int getinfo (lua_State *L) { | |||
| 71 | settabss(L, "namewhat", ar.namewhat); | 69 | settabss(L, "namewhat", ar.namewhat); |
| 72 | break; | 70 | break; |
| 73 | case 'f': | 71 | case 'f': |
| 74 | lua_pushobject(L, -1); | ||
| 75 | lua_pushstring(L, "func"); | 72 | lua_pushstring(L, "func"); |
| 76 | lua_pushobject(L, -4); | 73 | lua_pushvalue(L, -3); |
| 77 | lua_settable(L); | 74 | lua_settable(L, -3); |
| 78 | break; | 75 | break; |
| 79 | } | 76 | } |
| 80 | } | 77 | } |
| @@ -90,7 +87,7 @@ static int getlocal (lua_State *L) { | |||
| 90 | name = lua_getlocal(L, &ar, luaL_check_int(L, 2)); | 87 | name = lua_getlocal(L, &ar, luaL_check_int(L, 2)); |
| 91 | if (name) { | 88 | if (name) { |
| 92 | lua_pushstring(L, name); | 89 | lua_pushstring(L, name); |
| 93 | lua_pushobject(L, -2); | 90 | lua_pushvalue(L, -2); |
| 94 | return 2; | 91 | return 2; |
| 95 | } | 92 | } |
| 96 | else { | 93 | else { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: liolib.c,v 1.75 2000/08/31 13:30:10 roberto Exp roberto $ | 2 | ** $Id: liolib.c,v 1.76 2000/08/31 20:23:40 roberto Exp roberto $ |
| 3 | ** Standard I/O (and system) library | 3 | ** Standard I/O (and system) library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -107,7 +107,7 @@ static FILE *getfilebyref (lua_State *L, IOCtrl *ctrl, int inout) { | |||
| 107 | FILE *f; | 107 | FILE *f; |
| 108 | lua_getglobals(L); | 108 | lua_getglobals(L); |
| 109 | lua_getref(L, ctrl->ref[inout]); | 109 | lua_getref(L, ctrl->ref[inout]); |
| 110 | lua_rawget(L); | 110 | lua_rawget(L, -2); |
| 111 | f = gethandle(L, ctrl, -1); | 111 | f = gethandle(L, ctrl, -1); |
| 112 | if (f == NULL) | 112 | if (f == NULL) |
| 113 | luaL_verror(L, "global variable `%.10s' is not a file handle", | 113 | luaL_verror(L, "global variable `%.10s' is not a file handle", |
| @@ -564,58 +564,77 @@ static int io_debug (lua_State *L) { | |||
| 564 | } | 564 | } |
| 565 | 565 | ||
| 566 | 566 | ||
| 567 | 567 | #define LEVELS1 12 /* size of the first part of the stack */ | |
| 568 | #define MESSAGESIZE 150 | 568 | #define LEVELS2 10 /* size of the second part of the stack */ |
| 569 | #define MAXMESSAGE (MESSAGESIZE*10) | ||
| 570 | |||
| 571 | 569 | ||
| 572 | static int errorfb (lua_State *L) { | 570 | static int errorfb (lua_State *L) { |
| 573 | char buff[MAXMESSAGE]; | ||
| 574 | int level = 1; /* skip level 0 (it's this function) */ | 571 | int level = 1; /* skip level 0 (it's this function) */ |
| 572 | int firstpart = 1; /* still before eventual `...' */ | ||
| 575 | lua_Debug ar; | 573 | lua_Debug ar; |
| 576 | sprintf(buff, "error: %.200s\n", lua_tostring(L, 1)); | 574 | lua_settop(L, 1); |
| 575 | luaL_checktype(L, 1, "string"); | ||
| 576 | lua_pushstring(L, "error: "); | ||
| 577 | lua_insert(L, 1); | ||
| 578 | lua_pushstring(L, "\nstack traceback:\n"); | ||
| 579 | lua_concat(L, 3); | ||
| 577 | while (lua_getstack(L, level++, &ar)) { | 580 | while (lua_getstack(L, level++, &ar)) { |
| 581 | char buff[120]; /* enough to fit following `sprintf's */ | ||
| 578 | char buffchunk[60]; | 582 | char buffchunk[60]; |
| 583 | int toconcat = 1; /* number of strings in the stack to concat */ | ||
| 584 | if (level > LEVELS1 && firstpart) { | ||
| 585 | /* no more than `LEVELS2' more levels? */ | ||
| 586 | if (!lua_getstack(L, level+LEVELS2, &ar)) | ||
| 587 | level--; /* keep going */ | ||
| 588 | else { | ||
| 589 | lua_pushstring(L, " ...\n"); /* too many levels */ | ||
| 590 | lua_concat(L, 2); | ||
| 591 | while (lua_getstack(L, level+LEVELS2, &ar)) /* get last levels */ | ||
| 592 | level++; | ||
| 593 | } | ||
| 594 | firstpart = 0; | ||
| 595 | continue; | ||
| 596 | } | ||
| 597 | sprintf(buff, "%4d: ", level-1); | ||
| 598 | lua_pushstring(L, buff); toconcat++; | ||
| 579 | lua_getinfo(L, "Snl", &ar); | 599 | lua_getinfo(L, "Snl", &ar); |
| 580 | luaL_chunkid(buffchunk, ar.source, sizeof(buffchunk)); | 600 | luaL_chunkid(buffchunk, ar.source, sizeof(buffchunk)); |
| 581 | if (level == 2) strcat(buff, "stack traceback:\n"); | ||
| 582 | strcat(buff, " "); | ||
| 583 | if (strlen(buff) > MAXMESSAGE-MESSAGESIZE) { | ||
| 584 | strcat(buff, "...\n"); | ||
| 585 | break; /* buffer is full */ | ||
| 586 | } | ||
| 587 | switch (*ar.namewhat) { | 601 | switch (*ar.namewhat) { |
| 588 | case 'g': case 'l': /* global, local */ | 602 | case 'g': case 'l': /* global, local */ |
| 589 | sprintf(buff+strlen(buff), "function `%.50s'", ar.name); | 603 | sprintf(buff, "function `%.50s'", ar.name); |
| 590 | break; | 604 | break; |
| 591 | case 'f': /* field */ | 605 | case 'f': /* field */ |
| 592 | sprintf(buff+strlen(buff), "method `%.50s'", ar.name); | 606 | sprintf(buff, "method `%.50s'", ar.name); |
| 593 | break; | 607 | break; |
| 594 | case 't': /* tag method */ | 608 | case 't': /* tag method */ |
| 595 | sprintf(buff+strlen(buff), "`%.50s' tag method", ar.name); | 609 | sprintf(buff, "`%.50s' tag method", ar.name); |
| 596 | break; | 610 | break; |
| 597 | default: { | 611 | default: { |
| 598 | if (*ar.what == 'm') /* main? */ | 612 | if (*ar.what == 'm') /* main? */ |
| 599 | sprintf(buff+strlen(buff), "main of %.70s", buffchunk); | 613 | sprintf(buff, "main of %.70s", buffchunk); |
| 600 | else if (*ar.what == 'C') /* C function? */ | 614 | else if (*ar.what == 'C') /* C function? */ |
| 601 | sprintf(buff+strlen(buff), "%.70s", buffchunk); | 615 | sprintf(buff, "%.70s", buffchunk); |
| 602 | else | 616 | else |
| 603 | sprintf(buff+strlen(buff), "function <%d:%.70s>", | 617 | sprintf(buff, "function <%d:%.70s>", ar.linedefined, buffchunk); |
| 604 | ar.linedefined, buffchunk); | ||
| 605 | ar.source = NULL; | 618 | ar.source = NULL; |
| 606 | } | 619 | } |
| 607 | } | 620 | } |
| 608 | if (ar.currentline > 0) | 621 | lua_pushstring(L, buff); toconcat++; |
| 609 | sprintf(buff+strlen(buff), " at line %d", ar.currentline); | 622 | if (ar.currentline > 0) { |
| 610 | if (ar.source) | 623 | sprintf(buff, " at line %d", ar.currentline); |
| 611 | sprintf(buff+strlen(buff), " [%.70s]", buffchunk); | 624 | lua_pushstring(L, buff); toconcat++; |
| 612 | strcat(buff, "\n"); | 625 | } |
| 626 | if (ar.source) { | ||
| 627 | sprintf(buff, " [%.70s]", buffchunk); | ||
| 628 | lua_pushstring(L, buff); toconcat++; | ||
| 629 | } | ||
| 630 | lua_pushstring(L, "\n"); toconcat++; | ||
| 631 | lua_concat(L, toconcat); | ||
| 613 | } | 632 | } |
| 614 | lua_getglobals(L); | 633 | lua_getglobals(L); |
| 615 | lua_pushstring(L, LUA_ALERT); | 634 | lua_pushstring(L, LUA_ALERT); |
| 616 | lua_rawget(L); | 635 | lua_rawget(L, -2); |
| 617 | if (lua_isfunction(L, -1)) { /* avoid loop if _ALERT is not defined */ | 636 | if (lua_isfunction(L, -1)) { /* avoid loop if _ALERT is not defined */ |
| 618 | lua_pushstring(L, buff); | 637 | lua_pushvalue(L, -3); /* error message */ |
| 619 | lua_call(L, 1, 0); | 638 | lua_call(L, 1, 0); |
| 620 | } | 639 | } |
| 621 | return 0; | 640 | return 0; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 1.34 2000/08/28 17:57:04 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 1.35 2000/08/31 13:30:39 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -9,7 +9,6 @@ | |||
| 9 | 9 | ||
| 10 | #include "lua.h" | 10 | #include "lua.h" |
| 11 | 11 | ||
| 12 | #include "lbuiltin.h" | ||
| 13 | #include "ldo.h" | 12 | #include "ldo.h" |
| 14 | #include "lgc.h" | 13 | #include "lgc.h" |
| 15 | #include "llex.h" | 14 | #include "llex.h" |
| @@ -20,7 +19,13 @@ | |||
| 20 | #include "ltm.h" | 19 | #include "ltm.h" |
| 21 | 20 | ||
| 22 | 21 | ||
| 23 | lua_State *lua_newstate (int stacksize, int put_builtin) { | 22 | #ifdef DEBUG |
| 23 | extern lua_State *lua_state; | ||
| 24 | void luaB_opentests (lua_State *L); | ||
| 25 | #endif | ||
| 26 | |||
| 27 | |||
| 28 | lua_State *lua_newstate (int stacksize) { | ||
| 24 | struct lua_longjmp myErrorJmp; | 29 | struct lua_longjmp myErrorJmp; |
| 25 | lua_State *L = luaM_new(NULL, lua_State); | 30 | lua_State *L = luaM_new(NULL, lua_State); |
| 26 | if (L == NULL) return NULL; /* memory allocation error */ | 31 | if (L == NULL) return NULL; /* memory allocation error */ |
| @@ -54,8 +59,9 @@ lua_State *lua_newstate (int stacksize, int put_builtin) { | |||
| 54 | luaS_init(L); | 59 | luaS_init(L); |
| 55 | luaX_init(L); | 60 | luaX_init(L); |
| 56 | luaT_init(L); | 61 | luaT_init(L); |
| 57 | if (put_builtin) | 62 | #ifdef DEBUG |
| 58 | luaB_predefine(L); | 63 | luaB_opentests(L); |
| 64 | #endif | ||
| 59 | L->GCthreshold = L->nblocks*4; | 65 | L->GCthreshold = L->nblocks*4; |
| 60 | L->errorJmp = NULL; | 66 | L->errorJmp = NULL; |
| 61 | return L; | 67 | return L; |
| @@ -67,10 +73,6 @@ lua_State *lua_newstate (int stacksize, int put_builtin) { | |||
| 67 | } | 73 | } |
| 68 | 74 | ||
| 69 | 75 | ||
| 70 | #ifdef DEBUG | ||
| 71 | extern lua_State *lua_state; | ||
| 72 | #endif | ||
| 73 | |||
| 74 | void lua_close (lua_State *L) { | 76 | void lua_close (lua_State *L) { |
| 75 | luaC_collect(L, 1); /* collect all elements */ | 77 | luaC_collect(L, 1); /* collect all elements */ |
| 76 | LUA_ASSERT(L->rootproto == NULL, "list should be empty"); | 78 | LUA_ASSERT(L->rootproto == NULL, "list should be empty"); |
| @@ -83,6 +85,7 @@ void lua_close (lua_State *L) { | |||
| 83 | luaM_free(L, L->Mbuffer); | 85 | luaM_free(L, L->Mbuffer); |
| 84 | LUA_ASSERT(L->nblocks == 0, "wrong count for nblocks"); | 86 | LUA_ASSERT(L->nblocks == 0, "wrong count for nblocks"); |
| 85 | luaM_free(L, L); | 87 | luaM_free(L, L); |
| 88 | LUA_ASSERT(L->Cbase == L->stack, "stack not empty"); | ||
| 86 | LUA_ASSERT(L != lua_state || memdebug_numblocks == 0, "memory leak!"); | 89 | LUA_ASSERT(L != lua_state || memdebug_numblocks == 0, "memory leak!"); |
| 87 | LUA_ASSERT(L != lua_state || memdebug_total == 0,"memory leak!"); | 90 | LUA_ASSERT(L != lua_state || memdebug_total == 0,"memory leak!"); |
| 88 | } | 91 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstrlib.c,v 1.49 2000/08/31 13:30:22 roberto Exp roberto $ | 2 | ** $Id: lstrlib.c,v 1.50 2000/08/31 20:23:40 roberto Exp roberto $ |
| 3 | ** Standard library for string operations and pattern-matching | 3 | ** Standard library for string operations and pattern-matching |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -469,7 +469,7 @@ static void add_s (lua_State *L, struct Capture *cap) { | |||
| 469 | size_t oldbuff; | 469 | size_t oldbuff; |
| 470 | int n; | 470 | int n; |
| 471 | const char *s; | 471 | const char *s; |
| 472 | lua_pushobject(L, 3); | 472 | lua_pushvalue(L, 3); |
| 473 | n = push_captures(L, cap); | 473 | n = push_captures(L, cap); |
| 474 | /* function may use buffer, so save it and create a new one */ | 474 | /* function may use buffer, so save it and create a new one */ |
| 475 | oldbuff = luaL_newbuffer(L, 0); | 475 | oldbuff = luaL_newbuffer(L, 0); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltests.c,v 1.38 2000/08/31 13:29:47 roberto Exp roberto $ | 2 | ** $Id: ltests.c,v 1.39 2000/08/31 20:23:40 roberto Exp roberto $ |
| 3 | ** Internal Module for Debugging of the Lua Implementation | 3 | ** Internal Module for Debugging of the Lua Implementation |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -38,10 +38,9 @@ void luaB_opentests (lua_State *L); | |||
| 38 | 38 | ||
| 39 | 39 | ||
| 40 | static void setnameval (lua_State *L, const char *name, int val) { | 40 | static void setnameval (lua_State *L, const char *name, int val) { |
| 41 | lua_pushobject(L, -1); | ||
| 42 | lua_pushstring(L, name); | 41 | lua_pushstring(L, name); |
| 43 | lua_pushnumber(L, val); | 42 | lua_pushnumber(L, val); |
| 44 | lua_settable(L); | 43 | lua_settable(L, -3); |
| 45 | } | 44 | } |
| 46 | 45 | ||
| 47 | 46 | ||
| @@ -100,10 +99,9 @@ static int listcode (lua_State *L) { | |||
| 100 | setnameval(L, "numparams", p->numparams); | 99 | setnameval(L, "numparams", p->numparams); |
| 101 | pc = 0; | 100 | pc = 0; |
| 102 | do { | 101 | do { |
| 103 | lua_pushobject(L, -1); | ||
| 104 | lua_pushnumber(L, pc+1); | 102 | lua_pushnumber(L, pc+1); |
| 105 | res = pushop(L, p, pc++); | 103 | res = pushop(L, p, pc++); |
| 106 | lua_settable(L); | 104 | lua_settable(L, -3); |
| 107 | } while (res); | 105 | } while (res); |
| 108 | return 1; | 106 | return 1; |
| 109 | } | 107 | } |
| @@ -116,10 +114,9 @@ static int liststrings (lua_State *L) { | |||
| 116 | p = clvalue(luaA_index(L, 1))->f.l; | 114 | p = clvalue(luaA_index(L, 1))->f.l; |
| 117 | lua_newtable(L); | 115 | lua_newtable(L); |
| 118 | for (i=0; i<p->nkstr; i++) { | 116 | for (i=0; i<p->nkstr; i++) { |
| 119 | lua_pushobject(L, -1); | ||
| 120 | lua_pushnumber(L, i+1); | 117 | lua_pushnumber(L, i+1); |
| 121 | lua_pushstring(L, p->kstr[i]->str); | 118 | lua_pushstring(L, p->kstr[i]->str); |
| 122 | lua_settable(L); | 119 | lua_settable(L, -3); |
| 123 | } | 120 | } |
| 124 | return 1; | 121 | return 1; |
| 125 | } | 122 | } |
| @@ -241,7 +238,7 @@ static int string_query (lua_State *L) { | |||
| 241 | 238 | ||
| 242 | static int tref (lua_State *L) { | 239 | static int tref (lua_State *L) { |
| 243 | luaL_checktype(L, 1, "any"); | 240 | luaL_checktype(L, 1, "any"); |
| 244 | lua_pushobject(L, 1); | 241 | lua_pushvalue(L, 1); |
| 245 | lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); | 242 | lua_pushnumber(L, lua_ref(L, luaL_opt_int(L, 2, 1))); |
| 246 | return 1; | 243 | return 1; |
| 247 | } | 244 | } |
| @@ -270,7 +267,7 @@ static int udataval (lua_State *L) { | |||
| 270 | } | 267 | } |
| 271 | 268 | ||
| 272 | static int newstate (lua_State *L) { | 269 | static int newstate (lua_State *L) { |
| 273 | lua_State *L1 = lua_newstate(luaL_check_int(L, 1), luaL_check_int(L, 2)); | 270 | lua_State *L1 = lua_newstate(luaL_check_int(L, 1)); |
| 274 | if (L1) | 271 | if (L1) |
| 275 | lua_pushuserdata(L, L1); | 272 | lua_pushuserdata(L, L1); |
| 276 | else | 273 | else |
| @@ -390,17 +387,20 @@ static int testC (lua_State *L) { | |||
| 390 | else if EQ("pushnum") { | 387 | else if EQ("pushnum") { |
| 391 | lua_pushnumber(L, getnum); | 388 | lua_pushnumber(L, getnum); |
| 392 | } | 389 | } |
| 393 | else if EQ("pushobject") { | 390 | else if EQ("pushvalue") { |
| 394 | lua_pushobject(L, getnum); | 391 | lua_pushvalue(L, getnum); |
| 395 | } | 392 | } |
| 396 | else if EQ("move") { | 393 | else if EQ("remove") { |
| 397 | lua_move(L, getnum); | 394 | lua_remove(L, getnum); |
| 398 | } | 395 | } |
| 399 | else if EQ("insert") { | 396 | else if EQ("insert") { |
| 400 | lua_insert(L, getnum); | 397 | lua_insert(L, getnum); |
| 401 | } | 398 | } |
| 402 | else if EQ("next") { | 399 | else if EQ("next") { |
| 403 | lua_next(L); | 400 | lua_next(L, -2); |
| 401 | } | ||
| 402 | else if EQ("concat") { | ||
| 403 | lua_concat(L, getnum); | ||
| 404 | } | 404 | } |
| 405 | else if EQ("call") { | 405 | else if EQ("call") { |
| 406 | int narg = getnum; | 406 | int narg = getnum; |
| @@ -445,7 +445,7 @@ static const struct luaL_reg tests_funcs[] = { | |||
| 445 | void luaB_opentests (lua_State *L) { | 445 | void luaB_opentests (lua_State *L) { |
| 446 | lua_newtable(L); | 446 | lua_newtable(L); |
| 447 | lua_getglobals(L); | 447 | lua_getglobals(L); |
| 448 | lua_pushobject(L, -2); | 448 | lua_pushvalue(L, -2); |
| 449 | lua_setglobals(L); | 449 | lua_setglobals(L); |
| 450 | luaL_openl(L, tests_funcs); /* open functions inside new table */ | 450 | luaL_openl(L, tests_funcs); /* open functions inside new table */ |
| 451 | lua_setglobals(L); /* restore old table of globals */ | 451 | lua_setglobals(L); /* restore old table of globals */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.c,v 1.45 2000/08/07 20:21:34 roberto Exp roberto $ | 2 | ** $Id: ltm.c,v 1.46 2000/08/09 19:16:57 roberto Exp roberto $ |
| 3 | ** Tag methods | 3 | ** Tag methods |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -119,20 +119,23 @@ int luaT_effectivetag (lua_State *L, const TObject *o) { | |||
| 119 | } | 119 | } |
| 120 | 120 | ||
| 121 | 121 | ||
| 122 | const TObject *luaT_gettagmethod (lua_State *L, int t, const char *event) { | 122 | void lua_gettagmethod (lua_State *L, int t, const char *event) { |
| 123 | int e; | 123 | int e; |
| 124 | e = luaI_checkevent(L, event, t); | 124 | e = luaI_checkevent(L, event, t); |
| 125 | checktag(L, t); | 125 | checktag(L, t); |
| 126 | if (luaT_validevent(t, e)) | 126 | if (luaT_validevent(t, e)) |
| 127 | return luaT_getim(L, t,e); | 127 | *L->top = *luaT_getim(L, t,e); |
| 128 | else | 128 | else |
| 129 | return &luaO_nilobject; | 129 | ttype(L->top) = TAG_NIL; |
| 130 | L->top++; | ||
| 130 | } | 131 | } |
| 131 | 132 | ||
| 132 | 133 | ||
| 133 | void luaT_settagmethod (lua_State *L, int t, const char *event, TObject *func) { | 134 | void lua_settagmethod (lua_State *L, int t, const char *event) { |
| 134 | TObject temp; | 135 | TObject temp; |
| 135 | int e; | 136 | int e; |
| 137 | LUA_ASSERT(lua_isnil(L, -1) || lua_isfunction(L, -1), | ||
| 138 | "function or nil expected"); | ||
| 136 | e = luaI_checkevent(L, event, t); | 139 | e = luaI_checkevent(L, event, t); |
| 137 | checktag(L, t); | 140 | checktag(L, t); |
| 138 | if (!luaT_validevent(t, e)) | 141 | if (!luaT_validevent(t, e)) |
| @@ -140,8 +143,8 @@ void luaT_settagmethod (lua_State *L, int t, const char *event, TObject *func) { | |||
| 140 | luaT_eventname[e], luaO_typenames[t], | 143 | luaT_eventname[e], luaO_typenames[t], |
| 141 | (t == TAG_TABLE || t == TAG_USERDATA) ? " with default tag" | 144 | (t == TAG_TABLE || t == TAG_USERDATA) ? " with default tag" |
| 142 | : ""); | 145 | : ""); |
| 143 | temp = *func; | 146 | temp = *(L->top - 1); |
| 144 | *func = *luaT_getim(L, t,e); | 147 | *(L->top - 1) = *luaT_getim(L, t,e); |
| 145 | *luaT_getim(L, t, e) = temp; | 148 | *luaT_getim(L, t, e) = temp; |
| 146 | } | 149 | } |
| 147 | 150 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ltm.h,v 1.13 2000/05/30 18:54:49 roberto Exp roberto $ | 2 | ** $Id: ltm.h,v 1.14 2000/08/07 20:21:34 roberto Exp roberto $ |
| 3 | ** Tag methods | 3 | ** Tag methods |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -50,8 +50,6 @@ extern const char *const luaT_eventname[]; | |||
| 50 | void luaT_init (lua_State *L); | 50 | void luaT_init (lua_State *L); |
| 51 | void luaT_realtag (lua_State *L, int tag); | 51 | void luaT_realtag (lua_State *L, int tag); |
| 52 | int luaT_effectivetag (lua_State *L, const TObject *o); | 52 | int luaT_effectivetag (lua_State *L, const TObject *o); |
| 53 | void luaT_settagmethod (lua_State *L, int t, const char *event, TObject *func); | ||
| 54 | const TObject *luaT_gettagmethod (lua_State *L, int t, const char *event); | ||
| 55 | int luaT_validevent (int t, int e); /* used by compatibility module */ | 53 | int luaT_validevent (int t, int e); /* used by compatibility module */ |
| 56 | 54 | ||
| 57 | 55 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.c,v 1.48 2000/08/31 14:28:17 roberto Exp roberto $ | 2 | ** $Id: lua.c,v 1.49 2000/08/31 20:23:40 roberto Exp roberto $ |
| 3 | ** Lua stand-alone interpreter | 3 | ** Lua stand-alone interpreter |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -54,6 +54,7 @@ extern void USERINIT (void); | |||
| 54 | #else | 54 | #else |
| 55 | #define USERINIT userinit | 55 | #define USERINIT userinit |
| 56 | static void userinit (void) { | 56 | static void userinit (void) { |
| 57 | lua_baselibopen(L); | ||
| 57 | lua_iolibopen(L); | 58 | lua_iolibopen(L); |
| 58 | lua_strlibopen(L); | 59 | lua_strlibopen(L); |
| 59 | lua_mathlibopen(L); | 60 | lua_mathlibopen(L); |
| @@ -103,7 +104,7 @@ static void print_message (void) { | |||
| 103 | fprintf(stderr, | 104 | fprintf(stderr, |
| 104 | "usage: lua [options]. Available options are:\n" | 105 | "usage: lua [options]. Available options are:\n" |
| 105 | " - execute stdin as a file\n" | 106 | " - execute stdin as a file\n" |
| 106 | " -c close lua when exiting\n" | 107 | " -c close Lua when exiting\n" |
| 107 | " -e stat execute string `stat'\n" | 108 | " -e stat execute string `stat'\n" |
| 108 | " -f name execute file `name' with remaining arguments in table `arg'\n" | 109 | " -f name execute file `name' with remaining arguments in table `arg'\n" |
| 109 | " -i enter interactive mode with prompt\n" | 110 | " -i enter interactive mode with prompt\n" |
| @@ -134,12 +135,14 @@ static void getargs (char *argv[]) { | |||
| 134 | lua_newtable(L); | 135 | lua_newtable(L); |
| 135 | for (i=0; argv[i]; i++) { | 136 | for (i=0; argv[i]; i++) { |
| 136 | /* arg[i] = argv[i] */ | 137 | /* arg[i] = argv[i] */ |
| 137 | lua_pushobject(L, -1); lua_pushnumber(L, i); | 138 | lua_pushnumber(L, i); |
| 138 | lua_pushstring(L, argv[i]); lua_settable(L); | 139 | lua_pushstring(L, argv[i]); |
| 140 | lua_settable(L, -3); | ||
| 139 | } | 141 | } |
| 140 | /* arg.n = maximum index in table `arg' */ | 142 | /* arg.n = maximum index in table `arg' */ |
| 141 | lua_pushobject(L, -1); lua_pushstring(L, "n"); | 143 | lua_pushstring(L, "n"); |
| 142 | lua_pushnumber(L, i-1); lua_settable(L); | 144 | lua_pushnumber(L, i-1); |
| 145 | lua_settable(L, -3); | ||
| 143 | } | 146 | } |
| 144 | 147 | ||
| 145 | 148 | ||
| @@ -311,7 +314,7 @@ int main (int argc, char *argv[]) { | |||
| 311 | int status; | 314 | int status; |
| 312 | opt.toclose = 0; | 315 | opt.toclose = 0; |
| 313 | getstacksize(argc, argv, &opt); /* handle option `-s' */ | 316 | getstacksize(argc, argv, &opt); /* handle option `-s' */ |
| 314 | L = lua_newstate(opt.stacksize, 1); /* create state */ | 317 | L = lua_newstate(opt.stacksize); /* create state */ |
| 315 | USERINIT(); /* open libraries */ | 318 | USERINIT(); /* open libraries */ |
| 316 | register_getargs(argv); /* create `getargs' function */ | 319 | register_getargs(argv); /* create `getargs' function */ |
| 317 | status = handle_argv(argv+1, &opt); | 320 | status = handle_argv(argv+1, &opt); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lua.h,v 1.64 2000/08/31 20:23:40 roberto Exp roberto $ | 2 | ** $Id: lua.h,v 1.65 2000/08/31 21:01:43 roberto Exp roberto $ |
| 3 | ** Lua - An Extensible Extension Language | 3 | ** Lua - An Extensible Extension Language |
| 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil | 4 | ** TeCGraf: Grupo de Tecnologia em Computacao Grafica, PUC-Rio, Brazil |
| 5 | ** e-mail: lua@tecgraf.puc-rio.br | 5 | ** e-mail: lua@tecgraf.puc-rio.br |
| @@ -52,7 +52,7 @@ typedef int (*lua_CFunction) (lua_State *L); | |||
| 52 | /* | 52 | /* |
| 53 | ** state manipulation | 53 | ** state manipulation |
| 54 | */ | 54 | */ |
| 55 | lua_State *lua_newstate (int stacksize, int builtin); | 55 | lua_State *lua_newstate (int stacksize); |
| 56 | void lua_close (lua_State *L); | 56 | void lua_close (lua_State *L); |
| 57 | 57 | ||
| 58 | 58 | ||
| @@ -61,8 +61,8 @@ void lua_close (lua_State *L); | |||
| 61 | */ | 61 | */ |
| 62 | int lua_gettop (lua_State *L); | 62 | int lua_gettop (lua_State *L); |
| 63 | void lua_settop (lua_State *L, int index); | 63 | void lua_settop (lua_State *L, int index); |
| 64 | void lua_pushobject (lua_State *L, int index); | 64 | void lua_pushvalue (lua_State *L, int index); |
| 65 | void lua_move (lua_State *L, int index); | 65 | void lua_remove (lua_State *L, int index); |
| 66 | void lua_insert (lua_State *L, int index); | 66 | void lua_insert (lua_State *L, int index); |
| 67 | int lua_stackspace (lua_State *L); | 67 | int lua_stackspace (lua_State *L); |
| 68 | 68 | ||
| @@ -77,6 +77,7 @@ int lua_iscfunction (lua_State *L, int index); | |||
| 77 | int lua_tag (lua_State *L, int index); | 77 | int lua_tag (lua_State *L, int index); |
| 78 | 78 | ||
| 79 | int lua_equal (lua_State *L, int index1, int index2); | 79 | int lua_equal (lua_State *L, int index1, int index2); |
| 80 | int lua_lessthan (lua_State *L, int index1, int index2); | ||
| 80 | 81 | ||
| 81 | double lua_tonumber (lua_State *L, int index); | 82 | double lua_tonumber (lua_State *L, int index); |
| 82 | const char *lua_tostring (lua_State *L, int index); | 83 | const char *lua_tostring (lua_State *L, int index); |
| @@ -101,8 +102,9 @@ void lua_pushusertag (lua_State *L, void *u, int tag); | |||
| 101 | ** get functions (Lua -> stack) | 102 | ** get functions (Lua -> stack) |
| 102 | */ | 103 | */ |
| 103 | void lua_getglobal (lua_State *L, const char *name); | 104 | void lua_getglobal (lua_State *L, const char *name); |
| 104 | void lua_gettable (lua_State *L); | 105 | void lua_gettable (lua_State *L, int tableindex); |
| 105 | void lua_rawget (lua_State *L); | 106 | void lua_rawget (lua_State *L, int tableindex); |
| 107 | void lua_rawgeti (lua_State *L, int tableindex, int n); | ||
| 106 | void lua_getglobals (lua_State *L); | 108 | void lua_getglobals (lua_State *L); |
| 107 | void lua_gettagmethod (lua_State *L, int tag, const char *event); | 109 | void lua_gettagmethod (lua_State *L, int tag, const char *event); |
| 108 | 110 | ||
| @@ -115,8 +117,9 @@ void lua_newtable (lua_State *L); | |||
| 115 | ** set functions (stack -> Lua) | 117 | ** set functions (stack -> Lua) |
| 116 | */ | 118 | */ |
| 117 | void lua_setglobal (lua_State *L, const char *name); | 119 | void lua_setglobal (lua_State *L, const char *name); |
| 118 | void lua_settable (lua_State *L); | 120 | void lua_settable (lua_State *L, int tableindex); |
| 119 | void lua_rawset (lua_State *L); | 121 | void lua_rawset (lua_State *L, int tableindex); |
| 122 | void lua_rawseti (lua_State *L, int tableindex, int n); | ||
| 120 | void lua_setglobals (lua_State *L); | 123 | void lua_setglobals (lua_State *L); |
| 121 | void lua_settagmethod (lua_State *L, int tag, const char *event); | 124 | void lua_settagmethod (lua_State *L, int tag, const char *event); |
| 122 | int lua_ref (lua_State *L, int lock); | 125 | int lua_ref (lua_State *L, int lock); |
| @@ -145,9 +148,10 @@ void lua_unref (lua_State *L, int ref); | |||
| 145 | 148 | ||
| 146 | long lua_collectgarbage (lua_State *L, long limit); | 149 | long lua_collectgarbage (lua_State *L, long limit); |
| 147 | 150 | ||
| 148 | int lua_next (lua_State *L); | 151 | int lua_next (lua_State *L, int tableindex); |
| 149 | int lua_getn (lua_State *L, int index); | 152 | int lua_getn (lua_State *L, int tableindex); |
| 150 | 153 | ||
| 154 | void lua_concat (lua_State *L, int n); | ||
| 151 | 155 | ||
| 152 | 156 | ||
| 153 | /* | 157 | /* |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lualib.h,v 1.9 2000/06/16 17:22:43 roberto Exp roberto $ | 2 | ** $Id: lualib.h,v 1.10 2000/08/09 19:16:57 roberto Exp roberto $ |
| 3 | ** Lua standard libraries | 3 | ** Lua standard libraries |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -10,6 +10,7 @@ | |||
| 10 | 10 | ||
| 11 | #include "lua.h" | 11 | #include "lua.h" |
| 12 | 12 | ||
| 13 | void lua_baselibopen (lua_State *L); | ||
| 13 | void lua_iolibopen (lua_State *L); | 14 | void lua_iolibopen (lua_State *L); |
| 14 | void lua_strlibopen (lua_State *L); | 15 | void lua_strlibopen (lua_State *L); |
| 15 | void lua_mathlibopen (lua_State *L); | 16 | void lua_mathlibopen (lua_State *L); |
| @@ -17,26 +18,6 @@ void lua_dblibopen (lua_State *L); | |||
| 17 | 18 | ||
| 18 | 19 | ||
| 19 | 20 | ||
| 20 | /* | ||
| 21 | ** =============================================================== | ||
| 22 | ** Macros (and functions) for single-state use | ||
| 23 | ** =============================================================== | ||
| 24 | */ | ||
| 25 | |||
| 26 | #ifdef LUA_SINGLESTATE | ||
| 27 | |||
| 28 | #define lua_iolibopen() (lua_iolibopen)(lua_state) | ||
| 29 | #define lua_strlibopen() (lua_strlibopen)(lua_state) | ||
| 30 | #define lua_mathlibopen() (lua_mathlibopen)(lua_state) | ||
| 31 | #define lua_dblibopen() (lua_dblibopen)(lua_state) | ||
| 32 | |||
| 33 | /* this function should be used only in single-state mode */ | ||
| 34 | void lua_userinit (void); | ||
| 35 | |||
| 36 | #endif | ||
| 37 | |||
| 38 | |||
| 39 | |||
| 40 | /* Auxiliary functions (private) */ | 21 | /* Auxiliary functions (private) */ |
| 41 | 22 | ||
| 42 | const char *luaI_classend (lua_State *L, const char *p); | 23 | const char *luaI_classend (lua_State *L, const char *p); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.132 2000/08/31 14:08:27 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.133 2000/08/31 21:02:55 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -112,10 +112,10 @@ void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { | |||
| 112 | 112 | ||
| 113 | /* | 113 | /* |
| 114 | ** Function to index a table. | 114 | ** Function to index a table. |
| 115 | ** Receives the table at top-2 and the index at top-1. | 115 | ** Receives the table at `t' and the key at top. |
| 116 | */ | 116 | */ |
| 117 | void luaV_gettable (lua_State *L, StkId top) { | 117 | const TObject *luaV_gettable (lua_State *L, StkId t) { |
| 118 | StkId t = top-2; | 118 | const TObject *im; |
| 119 | int tg; | 119 | int tg; |
| 120 | if (ttype(t) == TAG_TABLE && /* `t' is a table? */ | 120 | if (ttype(t) == TAG_TABLE && /* `t' is a table? */ |
| 121 | ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */ | 121 | ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */ |
| @@ -123,46 +123,49 @@ void luaV_gettable (lua_State *L, StkId top) { | |||
| 123 | /* do a primitive get */ | 123 | /* do a primitive get */ |
| 124 | const TObject *h = luaH_get(L, hvalue(t), t+1); | 124 | const TObject *h = luaH_get(L, hvalue(t), t+1); |
| 125 | /* result is no nil or there is no `index' tag method? */ | 125 | /* result is no nil or there is no `index' tag method? */ |
| 126 | const TObject *im; | ||
| 127 | if (ttype(h) != TAG_NIL || | 126 | if (ttype(h) != TAG_NIL || |
| 128 | (ttype(im=luaT_getim(L, tg, IM_INDEX)) == TAG_NIL)) | 127 | (ttype(im=luaT_getim(L, tg, IM_INDEX)) == TAG_NIL)) |
| 129 | *t = *h; /* put result into table position */ | 128 | return h; /* return result */ |
| 130 | else { /* call `index' tag method */ | 129 | /* else call `index' tag method */ |
| 131 | L->top = top; | ||
| 132 | luaD_callTM(L, im, 2, 1); | ||
| 133 | } | ||
| 134 | } | 130 | } |
| 135 | else { /* try a 'gettable' TM */ | 131 | else { /* try a 'gettable' TM */ |
| 136 | const TObject *im = luaT_getimbyObj(L, t, IM_GETTABLE); | 132 | im = luaT_getimbyObj(L, t, IM_GETTABLE); |
| 137 | L->top = top; | 133 | } |
| 138 | if (ttype(im) != TAG_NIL) /* call `gettable' tag method */ | 134 | if (ttype(im) != TAG_NIL) { /* is there a tag method? */ |
| 139 | luaD_callTM(L, im, 2, 1); | 135 | luaD_checkstack(L, 2); |
| 140 | else /* no tag method */ | 136 | *(L->top+1) = *(L->top-1); /* key */ |
| 141 | luaG_typeerror(L, t, "index"); | 137 | *L->top = *t; /* table */ |
| 138 | *(L->top-1) = *im; /* tag method */ | ||
| 139 | L->top += 2; | ||
| 140 | luaD_call(L, L->top - 3, 1); | ||
| 141 | return L->top - 1; /* call result */ | ||
| 142 | } | ||
| 143 | else { /* no tag method */ | ||
| 144 | luaG_typeerror(L, t, "index"); | ||
| 145 | return NULL; /* to avoid warnings */ | ||
| 142 | } | 146 | } |
| 143 | } | 147 | } |
| 144 | 148 | ||
| 145 | 149 | ||
| 146 | /* | 150 | /* |
| 147 | ** Receives table at *t, index at *(t+1) and value at `top'. | 151 | ** Receives table at `t', key at `key' and value at top. |
| 148 | */ | 152 | */ |
| 149 | void luaV_settable (lua_State *L, StkId t, StkId top) { | 153 | void luaV_settable (lua_State *L, StkId t, StkId key) { |
| 150 | int tg; | 154 | int tg; |
| 151 | if (ttype(t) == TAG_TABLE && /* `t' is a table? */ | 155 | if (ttype(t) == TAG_TABLE && /* `t' is a table? */ |
| 152 | ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */ | 156 | ((tg = hvalue(t)->htag) == TAG_TABLE || /* with default tag? */ |
| 153 | ttype(luaT_getim(L, tg, IM_SETTABLE)) == TAG_NIL)) /* or no TM? */ | 157 | ttype(luaT_getim(L, tg, IM_SETTABLE)) == TAG_NIL)) /* or no TM? */ |
| 154 | *luaH_set(L, hvalue(t), t+1) = *(top-1); /* do a primitive set */ | 158 | *luaH_set(L, hvalue(t), key) = *(L->top-1); /* do a primitive set */ |
| 155 | else { /* try a `settable' tag method */ | 159 | else { /* try a `settable' tag method */ |
| 156 | const TObject *im = luaT_getimbyObj(L, t, IM_SETTABLE); | 160 | const TObject *im = luaT_getimbyObj(L, t, IM_SETTABLE); |
| 157 | L->top = top; | ||
| 158 | if (ttype(im) != TAG_NIL) { | 161 | if (ttype(im) != TAG_NIL) { |
| 159 | luaD_checkstack(L, 3); | 162 | luaD_checkstack(L, 3); |
| 160 | *(top+2) = *(top-1); | 163 | *(L->top+2) = *(L->top-1); |
| 161 | *(top+1) = *(t+1); | 164 | *(L->top+1) = *key; |
| 162 | *(top) = *t; | 165 | *(L->top) = *t; |
| 163 | *(top-1) = *im; | 166 | *(L->top-1) = *im; |
| 164 | L->top = top+3; | 167 | L->top += 3; |
| 165 | luaD_call(L, top-1, 0); /* call `settable' tag method */ | 168 | luaD_call(L, L->top - 4, 0); /* call `settable' tag method */ |
| 166 | } | 169 | } |
| 167 | else /* no tag method... */ | 170 | else /* no tag method... */ |
| 168 | luaG_typeerror(L, t, "index"); | 171 | luaG_typeerror(L, t, "index"); |
| @@ -170,49 +173,48 @@ void luaV_settable (lua_State *L, StkId t, StkId top) { | |||
| 170 | } | 173 | } |
| 171 | 174 | ||
| 172 | 175 | ||
| 173 | void luaV_getglobal (lua_State *L, TString *s, StkId top) { | 176 | const TObject *luaV_getglobal (lua_State *L, TString *s) { |
| 174 | const TObject *value = luaH_getstr(L->gt, s); | 177 | const TObject *value = luaH_getstr(L->gt, s); |
| 175 | TObject *im = luaT_getimbyObj(L, value, IM_GETGLOBAL); | 178 | TObject *im = luaT_getimbyObj(L, value, IM_GETGLOBAL); |
| 176 | if (ttype(im) == TAG_NIL) /* is there a tag method? */ | 179 | if (ttype(im) == TAG_NIL) /* is there a tag method? */ |
| 177 | *top = *value; /* default behavior */ | 180 | return value; /* default behavior */ |
| 178 | else { /* tag method */ | 181 | else { /* tag method */ |
| 179 | L->top = top; | ||
| 180 | luaD_checkstack(L, 3); | 182 | luaD_checkstack(L, 3); |
| 181 | *top = *im; | 183 | *L->top = *im; |
| 182 | ttype(top+1) = TAG_STRING; | 184 | ttype(L->top+1) = TAG_STRING; |
| 183 | tsvalue(top+1) = s; /* global name */ | 185 | tsvalue(L->top+1) = s; /* global name */ |
| 184 | *(top+2) = *value; | 186 | *(L->top+2) = *value; |
| 185 | L->top = top+3; | 187 | L->top += 3; |
| 186 | luaD_call(L, top, 1); | 188 | luaD_call(L, L->top - 3, 1); |
| 189 | return L->top - 1; | ||
| 187 | } | 190 | } |
| 188 | } | 191 | } |
| 189 | 192 | ||
| 190 | 193 | ||
| 191 | void luaV_setglobal (lua_State *L, TString *s, StkId top) { | 194 | void luaV_setglobal (lua_State *L, TString *s) { |
| 192 | const TObject *oldvalue = luaH_getstr(L->gt, s); | 195 | const TObject *oldvalue = luaH_getstr(L->gt, s); |
| 193 | const TObject *im = luaT_getimbyObj(L, oldvalue, IM_SETGLOBAL); | 196 | const TObject *im = luaT_getimbyObj(L, oldvalue, IM_SETGLOBAL); |
| 194 | if (ttype(im) == TAG_NIL) { /* is there a tag method? */ | 197 | if (ttype(im) == TAG_NIL) { /* is there a tag method? */ |
| 195 | if (oldvalue != &luaO_nilobject) { | 198 | if (oldvalue != &luaO_nilobject) { |
| 196 | /* cast to remove `const' is OK, because `oldvalue' != luaO_nilobject */ | 199 | /* cast to remove `const' is OK, because `oldvalue' != luaO_nilobject */ |
| 197 | *(TObject *)oldvalue = *(top-1); | 200 | *(TObject *)oldvalue = *(L->top - 1); |
| 198 | } | 201 | } |
| 199 | else { | 202 | else { |
| 200 | TObject key; | 203 | TObject key; |
| 201 | ttype(&key) = TAG_STRING; | 204 | ttype(&key) = TAG_STRING; |
| 202 | tsvalue(&key) = s; | 205 | tsvalue(&key) = s; |
| 203 | *luaH_set(L, L->gt, &key) = *(top-1); | 206 | *luaH_set(L, L->gt, &key) = *(L->top - 1); |
| 204 | } | 207 | } |
| 205 | } | 208 | } |
| 206 | else { | 209 | else { |
| 207 | L->top = top; | ||
| 208 | luaD_checkstack(L, 3); | 210 | luaD_checkstack(L, 3); |
| 209 | *(top+2) = *(top-1); /* new value */ | 211 | *(L->top+2) = *(L->top-1); /* new value */ |
| 210 | *(top+1) = *oldvalue; | 212 | *(L->top+1) = *oldvalue; |
| 211 | ttype(top) = TAG_STRING; | 213 | ttype(L->top) = TAG_STRING; |
| 212 | tsvalue(top) = s; | 214 | tsvalue(L->top) = s; |
| 213 | *(top-1) = *im; | 215 | *(L->top-1) = *im; |
| 214 | L->top = top+3; | 216 | L->top += 3; |
| 215 | luaD_call(L, top-1, 0); | 217 | luaD_call(L, L->top - 4, 0); |
| 216 | } | 218 | } |
| 217 | } | 219 | } |
| 218 | 220 | ||
| @@ -280,7 +282,7 @@ int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top) | |||
| 280 | } | 282 | } |
| 281 | 283 | ||
| 282 | 284 | ||
| 283 | static void strconc (lua_State *L, int total, StkId top) { | 285 | void luaV_strconc (lua_State *L, int total, StkId top) { |
| 284 | do { | 286 | do { |
| 285 | int n = 2; /* number of elements handled in this pass (at least 2) */ | 287 | int n = 2; /* number of elements handled in this pass (at least 2) */ |
| 286 | if (tostring(L, top-2) || tostring(L, top-1)) { | 288 | if (tostring(L, top-2) || tostring(L, top-1)) { |
| @@ -425,26 +427,28 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 425 | break; | 427 | break; |
| 426 | } | 428 | } |
| 427 | case OP_GETGLOBAL: { | 429 | case OP_GETGLOBAL: { |
| 428 | luaV_getglobal(L, kstr[GETARG_U(i)], top); | 430 | L->top = top; |
| 431 | *top = *luaV_getglobal(L, kstr[GETARG_U(i)]); | ||
| 429 | top++; | 432 | top++; |
| 430 | break; | 433 | break; |
| 431 | } | 434 | } |
| 432 | case OP_GETTABLE: { | 435 | case OP_GETTABLE: { |
| 433 | luaV_gettable(L, top); | 436 | L->top = top; |
| 434 | top--; | 437 | top--; |
| 438 | *(top-1) = *luaV_gettable(L, top-1); | ||
| 435 | break; | 439 | break; |
| 436 | } | 440 | } |
| 437 | case OP_GETDOTTED: { | 441 | case OP_GETDOTTED: { |
| 438 | ttype(top) = TAG_STRING; | 442 | ttype(top) = TAG_STRING; |
| 439 | tsvalue(top++) = kstr[GETARG_U(i)]; | 443 | tsvalue(top) = kstr[GETARG_U(i)]; |
| 440 | luaV_gettable(L, top); | 444 | L->top = top+1; |
| 441 | top--; | 445 | *(top-1) = *luaV_gettable(L, top-1); |
| 442 | break; | 446 | break; |
| 443 | } | 447 | } |
| 444 | case OP_GETINDEXED: { | 448 | case OP_GETINDEXED: { |
| 445 | *top++ = *(base+GETARG_U(i)); | 449 | *top = *(base+GETARG_U(i)); |
| 446 | luaV_gettable(L, top); | 450 | L->top = top+1; |
| 447 | top--; | 451 | *(top-1) = *luaV_gettable(L, top-1); |
| 448 | break; | 452 | break; |
| 449 | } | 453 | } |
| 450 | case OP_PUSHSELF: { | 454 | case OP_PUSHSELF: { |
| @@ -452,7 +456,8 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 452 | receiver = *(top-1); | 456 | receiver = *(top-1); |
| 453 | ttype(top) = TAG_STRING; | 457 | ttype(top) = TAG_STRING; |
| 454 | tsvalue(top++) = kstr[GETARG_U(i)]; | 458 | tsvalue(top++) = kstr[GETARG_U(i)]; |
| 455 | luaV_gettable(L, top); | 459 | L->top = top; |
| 460 | *(top-2) = *luaV_gettable(L, top-2); | ||
| 456 | *(top-1) = receiver; | 461 | *(top-1) = receiver; |
| 457 | break; | 462 | break; |
| 458 | } | 463 | } |
| @@ -469,12 +474,15 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 469 | break; | 474 | break; |
| 470 | } | 475 | } |
| 471 | case OP_SETGLOBAL: { | 476 | case OP_SETGLOBAL: { |
| 472 | luaV_setglobal(L, kstr[GETARG_U(i)], top); | 477 | L->top = top; |
| 478 | luaV_setglobal(L, kstr[GETARG_U(i)]); | ||
| 473 | top--; | 479 | top--; |
| 474 | break; | 480 | break; |
| 475 | } | 481 | } |
| 476 | case OP_SETTABLE: { | 482 | case OP_SETTABLE: { |
| 477 | luaV_settable(L, top-GETARG_A(i), top); | 483 | StkId t = top-GETARG_A(i); |
| 484 | L->top = top; | ||
| 485 | luaV_settable(L, t, t+1); | ||
| 478 | top -= GETARG_B(i); /* pop values */ | 486 | top -= GETARG_B(i); /* pop values */ |
| 479 | break; | 487 | break; |
| 480 | } | 488 | } |
| @@ -548,7 +556,7 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 548 | } | 556 | } |
| 549 | case OP_CONCAT: { | 557 | case OP_CONCAT: { |
| 550 | int n = GETARG_U(i); | 558 | int n = GETARG_U(i); |
| 551 | strconc(L, n, top); | 559 | luaV_strconc(L, n, top); |
| 552 | top -= n-1; | 560 | top -= n-1; |
| 553 | L->top = top; | 561 | L->top = top; |
| 554 | luaC_checkGC(L); | 562 | luaC_checkGC(L); |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.h,v 1.24 2000/08/29 14:41:56 roberto Exp roberto $ | 2 | ** $Id: lvm.h,v 1.25 2000/08/31 21:02:55 roberto Exp roberto $ |
| 3 | ** Lua virtual machine | 3 | ** Lua virtual machine |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -19,13 +19,14 @@ | |||
| 19 | 19 | ||
| 20 | int luaV_tonumber (TObject *obj); | 20 | int luaV_tonumber (TObject *obj); |
| 21 | int luaV_tostring (lua_State *L, TObject *obj); | 21 | int luaV_tostring (lua_State *L, TObject *obj); |
| 22 | void luaV_gettable (lua_State *L, StkId top); | 22 | const TObject *luaV_gettable (lua_State *L, StkId t); |
| 23 | void luaV_settable (lua_State *L, StkId t, StkId top); | 23 | void luaV_settable (lua_State *L, StkId t, StkId key); |
| 24 | void luaV_getglobal (lua_State *L, TString *s, StkId top); | 24 | const TObject *luaV_getglobal (lua_State *L, TString *s); |
| 25 | void luaV_setglobal (lua_State *L, TString *s, StkId top); | 25 | void luaV_setglobal (lua_State *L, TString *s); |
| 26 | StkId luaV_execute (lua_State *L, const Closure *cl, StkId base); | 26 | StkId luaV_execute (lua_State *L, const Closure *cl, StkId base); |
| 27 | void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); | 27 | void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems); |
| 28 | void luaV_Lclosure (lua_State *L, Proto *l, int nelems); | 28 | void luaV_Lclosure (lua_State *L, Proto *l, int nelems); |
| 29 | int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); | 29 | int luaV_lessthan (lua_State *L, const TObject *l, const TObject *r, StkId top); |
| 30 | void luaV_strconc (lua_State *L, int total, StkId top); | ||
| 30 | 31 | ||
| 31 | #endif | 32 | #endif |
