diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-12-14 16:33:29 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1999-12-14 16:33:29 -0200 |
| commit | 1b15206cf9aa7005fc3d48f78f60f66838f10eb5 (patch) | |
| tree | 00a96c96d331417ba781b605c6c10d8daae01938 | |
| parent | e6d56cd2d844174bd40af4c44c0f68e2115e5876 (diff) | |
| download | lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.tar.gz lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.tar.bz2 lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.zip | |
many details + code redistribution
| -rw-r--r-- | lapi.c | 245 | ||||
| -rw-r--r-- | lapi.h | 7 | ||||
| -rw-r--r-- | lbuiltin.c | 330 | ||||
| -rw-r--r-- | lbuiltin.h | 38 | ||||
| -rw-r--r-- | lgc.c | 4 | ||||
| -rw-r--r-- | llex.c | 8 | ||||
| -rw-r--r-- | lmathlib.c | 4 | ||||
| -rw-r--r-- | lmem.c | 6 | ||||
| -rw-r--r-- | lobject.c | 4 | ||||
| -rw-r--r-- | lobject.h | 4 | ||||
| -rw-r--r-- | lref.c | 40 | ||||
| -rw-r--r-- | lref.h | 5 | ||||
| -rw-r--r-- | lvm.c | 4 |
13 files changed, 170 insertions, 529 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.62 1999/12/02 16:24:45 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.63 1999/12/06 12:03:45 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 | */ |
| @@ -22,16 +22,15 @@ | |||
| 22 | #include "ltable.h" | 22 | #include "ltable.h" |
| 23 | #include "ltm.h" | 23 | #include "ltm.h" |
| 24 | #include "lua.h" | 24 | #include "lua.h" |
| 25 | #include "luadebug.h" | ||
| 26 | #include "lvm.h" | 25 | #include "lvm.h" |
| 27 | 26 | ||
| 28 | 27 | ||
| 29 | const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" | 28 | const char lua_ident[] = "$Lua: " LUA_VERSION " " LUA_COPYRIGHT " $\n" |
| 30 | "$Authors: " LUA_AUTHORS " $"; | 29 | "$Authors: " LUA_AUTHORS " $"; |
| 31 | 30 | ||
| 32 | 31 | ||
| 33 | 32 | ||
| 34 | static lua_Type normalized_type (const TObject *o) { | 33 | lua_Type luaA_normalizedtype (const TObject *o) { |
| 35 | int t = ttype(o); | 34 | int t = ttype(o); |
| 36 | switch (t) { | 35 | switch (t) { |
| 37 | case LUA_T_PMARK: | 36 | case LUA_T_PMARK: |
| @@ -46,24 +45,24 @@ static lua_Type normalized_type (const TObject *o) { | |||
| 46 | } | 45 | } |
| 47 | 46 | ||
| 48 | 47 | ||
| 49 | static void set_normalized (TObject *d, const TObject *s) { | 48 | void luaA_setnormalized (TObject *d, const TObject *s) { |
| 50 | d->value = s->value; | 49 | d->value = s->value; |
| 51 | d->ttype = normalized_type(s); | 50 | d->ttype = luaA_normalizedtype(s); |
| 52 | } | 51 | } |
| 53 | 52 | ||
| 54 | 53 | ||
| 55 | static const TObject *luaA_protovalue (const TObject *o) { | 54 | const TObject *luaA_protovalue (const TObject *o) { |
| 56 | return (normalized_type(o) == LUA_T_CLOSURE) ? protovalue(o) : o; | 55 | return (luaA_normalizedtype(o) == LUA_T_CLOSURE) ? protovalue(o) : o; |
| 57 | } | 56 | } |
| 58 | 57 | ||
| 59 | 58 | ||
| 60 | static void checkCparams (lua_State *L, int nParams) { | 59 | void luaA_checkCparams (lua_State *L, int nParams) { |
| 61 | if (nParams > L->top-L->Cstack.base) | 60 | if (nParams > L->top-L->Cstack.base) |
| 62 | lua_error(L, "API error - wrong number of arguments in C2lua stack"); | 61 | lua_error(L, "API error - wrong number of arguments in C2lua stack"); |
| 63 | } | 62 | } |
| 64 | 63 | ||
| 65 | 64 | ||
| 66 | static lua_Object put_luaObject (lua_State *L, const TObject *o) { | 65 | lua_Object luaA_putluaObject (lua_State *L, const TObject *o) { |
| 67 | luaD_openstack(L, L->Cstack.base); | 66 | luaD_openstack(L, L->Cstack.base); |
| 68 | *L->Cstack.base++ = *o; | 67 | *L->Cstack.base++ = *o; |
| 69 | return L->Cstack.base-1; | 68 | return L->Cstack.base-1; |
| @@ -86,7 +85,7 @@ static void top2LC (lua_State *L, int n) { | |||
| 86 | 85 | ||
| 87 | 86 | ||
| 88 | lua_Object lua_pop (lua_State *L) { | 87 | lua_Object lua_pop (lua_State *L) { |
| 89 | checkCparams(L, 1); | 88 | luaA_checkCparams(L, 1); |
| 90 | return luaA_putObjectOnTop(L); | 89 | return luaA_putObjectOnTop(L); |
| 91 | } | 90 | } |
| 92 | 91 | ||
| @@ -106,19 +105,19 @@ int lua_callfunction (lua_State *L, lua_Object function) { | |||
| 106 | return 1; | 105 | return 1; |
| 107 | else { | 106 | else { |
| 108 | luaD_openstack(L, L->Cstack.base); | 107 | luaD_openstack(L, L->Cstack.base); |
| 109 | set_normalized(L->Cstack.base, function); | 108 | luaA_setnormalized(L->Cstack.base, function); |
| 110 | return luaD_protectedrun(L); | 109 | return luaD_protectedrun(L); |
| 111 | } | 110 | } |
| 112 | } | 111 | } |
| 113 | 112 | ||
| 114 | 113 | ||
| 115 | lua_Object lua_gettagmethod (lua_State *L, int tag, const char *event) { | 114 | lua_Object lua_gettagmethod (lua_State *L, int tag, const char *event) { |
| 116 | return put_luaObject(L, luaT_gettagmethod(L, tag, event)); | 115 | return luaA_putluaObject(L, luaT_gettagmethod(L, tag, event)); |
| 117 | } | 116 | } |
| 118 | 117 | ||
| 119 | 118 | ||
| 120 | lua_Object lua_settagmethod (lua_State *L, int tag, const char *event) { | 119 | lua_Object lua_settagmethod (lua_State *L, int tag, const char *event) { |
| 121 | checkCparams(L, 1); | 120 | luaA_checkCparams(L, 1); |
| 122 | luaT_settagmethod(L, tag, event, L->top-1); | 121 | luaT_settagmethod(L, tag, event, L->top-1); |
| 123 | return luaA_putObjectOnTop(L); | 122 | return luaA_putObjectOnTop(L); |
| 124 | } | 123 | } |
| @@ -126,7 +125,7 @@ lua_Object lua_settagmethod (lua_State *L, int tag, const char *event) { | |||
| 126 | 125 | ||
| 127 | lua_Object lua_seterrormethod (lua_State *L) { | 126 | lua_Object lua_seterrormethod (lua_State *L) { |
| 128 | lua_Object temp; | 127 | lua_Object temp; |
| 129 | checkCparams(L, 1); | 128 | luaA_checkCparams(L, 1); |
| 130 | temp = lua_getglobal(L, "_ERRORMESSAGE"); | 129 | temp = lua_getglobal(L, "_ERRORMESSAGE"); |
| 131 | lua_setglobal(L, "_ERRORMESSAGE"); | 130 | lua_setglobal(L, "_ERRORMESSAGE"); |
| 132 | return temp; | 131 | return temp; |
| @@ -134,14 +133,14 @@ lua_Object lua_seterrormethod (lua_State *L) { | |||
| 134 | 133 | ||
| 135 | 134 | ||
| 136 | lua_Object lua_gettable (lua_State *L) { | 135 | lua_Object lua_gettable (lua_State *L) { |
| 137 | checkCparams(L, 2); | 136 | luaA_checkCparams(L, 2); |
| 138 | luaV_gettable(L); | 137 | luaV_gettable(L); |
| 139 | return luaA_putObjectOnTop(L); | 138 | return luaA_putObjectOnTop(L); |
| 140 | } | 139 | } |
| 141 | 140 | ||
| 142 | 141 | ||
| 143 | lua_Object lua_rawgettable (lua_State *L) { | 142 | lua_Object lua_rawgettable (lua_State *L) { |
| 144 | checkCparams(L, 2); | 143 | luaA_checkCparams(L, 2); |
| 145 | if (ttype(L->top-2) != LUA_T_ARRAY) | 144 | if (ttype(L->top-2) != LUA_T_ARRAY) |
| 146 | lua_error(L, "indexed expression not a table in rawgettable"); | 145 | lua_error(L, "indexed expression not a table in rawgettable"); |
| 147 | *(L->top-2) = *luaH_get(L, avalue(L->top-2), L->top-1); | 146 | *(L->top-2) = *luaH_get(L, avalue(L->top-2), L->top-1); |
| @@ -151,14 +150,14 @@ lua_Object lua_rawgettable (lua_State *L) { | |||
| 151 | 150 | ||
| 152 | 151 | ||
| 153 | void lua_settable (lua_State *L) { | 152 | void lua_settable (lua_State *L) { |
| 154 | checkCparams(L, 3); | 153 | luaA_checkCparams(L, 3); |
| 155 | luaV_settable(L, L->top-3); | 154 | luaV_settable(L, L->top-3); |
| 156 | L->top -= 2; /* pop table and index */ | 155 | L->top -= 2; /* pop table and index */ |
| 157 | } | 156 | } |
| 158 | 157 | ||
| 159 | 158 | ||
| 160 | void lua_rawsettable (lua_State *L) { | 159 | void lua_rawsettable (lua_State *L) { |
| 161 | checkCparams(L, 3); | 160 | luaA_checkCparams(L, 3); |
| 162 | luaV_rawsettable(L, L->top-3); | 161 | luaV_rawsettable(L, L->top-3); |
| 163 | } | 162 | } |
| 164 | 163 | ||
| @@ -168,12 +167,12 @@ lua_Object lua_createtable (lua_State *L) { | |||
| 168 | luaC_checkGC(L); | 167 | luaC_checkGC(L); |
| 169 | avalue(&o) = luaH_new(L, 0); | 168 | avalue(&o) = luaH_new(L, 0); |
| 170 | ttype(&o) = LUA_T_ARRAY; | 169 | ttype(&o) = LUA_T_ARRAY; |
| 171 | return put_luaObject(L, &o); | 170 | return luaA_putluaObject(L, &o); |
| 172 | } | 171 | } |
| 173 | 172 | ||
| 174 | 173 | ||
| 175 | lua_Object lua_getglobal (lua_State *L, const char *name) { | 174 | lua_Object lua_getglobal (lua_State *L, const char *name) { |
| 176 | luaD_checkstack(L, 2); /* may need that to call T.M. */ | 175 | luaD_checkstack(L, 2); /* may need that to call a tag method */ |
| 177 | luaV_getglobal(L, luaS_assertglobalbyname(L, name)); | 176 | luaV_getglobal(L, luaS_assertglobalbyname(L, name)); |
| 178 | return luaA_putObjectOnTop(L); | 177 | return luaA_putObjectOnTop(L); |
| 179 | } | 178 | } |
| @@ -181,27 +180,27 @@ lua_Object lua_getglobal (lua_State *L, const char *name) { | |||
| 181 | 180 | ||
| 182 | lua_Object lua_rawgetglobal (lua_State *L, const char *name) { | 181 | lua_Object lua_rawgetglobal (lua_State *L, const char *name) { |
| 183 | GlobalVar *gv = luaS_assertglobalbyname(L, name); | 182 | GlobalVar *gv = luaS_assertglobalbyname(L, name); |
| 184 | return put_luaObject(L, &gv->value); | 183 | return luaA_putluaObject(L, &gv->value); |
| 185 | } | 184 | } |
| 186 | 185 | ||
| 187 | 186 | ||
| 188 | void lua_setglobal (lua_State *L, const char *name) { | 187 | void lua_setglobal (lua_State *L, const char *name) { |
| 189 | checkCparams(L, 1); | 188 | luaA_checkCparams(L, 1); |
| 190 | luaD_checkstack(L, 2); /* may need that to call T.M. */ | 189 | luaD_checkstack(L, 2); /* may need that to call a tag method */ |
| 191 | luaV_setglobal(L, luaS_assertglobalbyname(L, name)); | 190 | luaV_setglobal(L, luaS_assertglobalbyname(L, name)); |
| 192 | } | 191 | } |
| 193 | 192 | ||
| 194 | 193 | ||
| 195 | void lua_rawsetglobal (lua_State *L, const char *name) { | 194 | void lua_rawsetglobal (lua_State *L, const char *name) { |
| 196 | GlobalVar *gv = luaS_assertglobalbyname(L, name); | 195 | GlobalVar *gv = luaS_assertglobalbyname(L, name); |
| 197 | checkCparams(L, 1); | 196 | luaA_checkCparams(L, 1); |
| 198 | gv->value = *(--L->top); | 197 | gv->value = *(--L->top); |
| 199 | } | 198 | } |
| 200 | 199 | ||
| 201 | 200 | ||
| 202 | const char *lua_type (lua_State *L, lua_Object o) { | 201 | const char *lua_type (lua_State *L, lua_Object o) { |
| 203 | UNUSED(L); | 202 | UNUSED(L); |
| 204 | return (o == LUA_NOOBJECT) ? "NOOBJECT" : luaO_typename(L, o); | 203 | return (o == LUA_NOOBJECT) ? "NOOBJECT" : luaO_typename(o); |
| 205 | } | 204 | } |
| 206 | 205 | ||
| 207 | int lua_isnil (lua_State *L, lua_Object o) { | 206 | int lua_isnil (lua_State *L, lua_Object o) { |
| @@ -220,7 +219,6 @@ int lua_isuserdata (lua_State *L, lua_Object o) { | |||
| 220 | } | 219 | } |
| 221 | 220 | ||
| 222 | int lua_iscfunction (lua_State *L, lua_Object o) { | 221 | int lua_iscfunction (lua_State *L, lua_Object o) { |
| 223 | UNUSED(L); | ||
| 224 | return (lua_tag(L, o) == LUA_T_CPROTO); | 222 | return (lua_tag(L, o) == LUA_T_CPROTO); |
| 225 | } | 223 | } |
| 226 | 224 | ||
| @@ -261,7 +259,6 @@ const char *lua_getstring (lua_State *L, lua_Object obj) { | |||
| 261 | } | 259 | } |
| 262 | 260 | ||
| 263 | long lua_strlen (lua_State *L, lua_Object obj) { | 261 | long lua_strlen (lua_State *L, lua_Object obj) { |
| 264 | UNUSED(L); | ||
| 265 | if (obj == LUA_NOOBJECT || tostring(L, obj)) | 262 | if (obj == LUA_NOOBJECT || tostring(L, obj)) |
| 266 | return 0L; | 263 | return 0L; |
| 267 | else return (tsvalue(obj)->u.s.len); | 264 | else return (tsvalue(obj)->u.s.len); |
| @@ -309,7 +306,7 @@ void lua_pushstring (lua_State *L, const char *s) { | |||
| 309 | void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | 306 | void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { |
| 310 | if (fn == NULL) | 307 | if (fn == NULL) |
| 311 | lua_error(L, "API error - attempt to push a NULL Cfunction"); | 308 | lua_error(L, "API error - attempt to push a NULL Cfunction"); |
| 312 | checkCparams(L, n); | 309 | luaA_checkCparams(L, n); |
| 313 | ttype(L->top) = LUA_T_CPROTO; | 310 | ttype(L->top) = LUA_T_CPROTO; |
| 314 | fvalue(L->top) = fn; | 311 | fvalue(L->top) = fn; |
| 315 | incr_top; | 312 | incr_top; |
| @@ -334,7 +331,7 @@ void luaA_pushobject (lua_State *L, const TObject *o) { | |||
| 334 | void lua_pushobject (lua_State *L, lua_Object o) { | 331 | void lua_pushobject (lua_State *L, lua_Object o) { |
| 335 | if (o == LUA_NOOBJECT) | 332 | if (o == LUA_NOOBJECT) |
| 336 | lua_error(L, "API error - attempt to push a NOOBJECT"); | 333 | lua_error(L, "API error - attempt to push a NOOBJECT"); |
| 337 | set_normalized(L->top, o); | 334 | luaA_setnormalized(L->top, o); |
| 338 | incr_top; | 335 | incr_top; |
| 339 | } | 336 | } |
| 340 | 337 | ||
| @@ -368,7 +365,7 @@ int lua_tag (lua_State *L, lua_Object o) { | |||
| 368 | 365 | ||
| 369 | 366 | ||
| 370 | void lua_settag (lua_State *L, int tag) { | 367 | void lua_settag (lua_State *L, int tag) { |
| 371 | checkCparams(L, 1); | 368 | luaA_checkCparams(L, 1); |
| 372 | luaT_realtag(L, tag); | 369 | luaT_realtag(L, tag); |
| 373 | switch (ttype(L->top-1)) { | 370 | switch (ttype(L->top-1)) { |
| 374 | case LUA_T_ARRAY: | 371 | case LUA_T_ARRAY: |
| @@ -379,7 +376,7 @@ void lua_settag (lua_State *L, int tag) { | |||
| 379 | break; | 376 | break; |
| 380 | default: | 377 | default: |
| 381 | luaL_verror(L, "cannot change the tag of a %.20s", | 378 | luaL_verror(L, "cannot change the tag of a %.20s", |
| 382 | luaO_typename(L, L->top-1)); | 379 | luaO_typename(L->top-1)); |
| 383 | } | 380 | } |
| 384 | L->top--; | 381 | L->top--; |
| 385 | } | 382 | } |
| @@ -442,187 +439,3 @@ int lua_next (lua_State *L, lua_Object t, int i) { | |||
| 442 | } | 439 | } |
| 443 | 440 | ||
| 444 | 441 | ||
| 445 | |||
| 446 | /* | ||
| 447 | ** {====================================================== | ||
| 448 | ** To manipulate some state information | ||
| 449 | ** ======================================================= | ||
| 450 | */ | ||
| 451 | |||
| 452 | |||
| 453 | |||
| 454 | lua_LHFunction lua_setlinehook (lua_State *L, lua_LHFunction func) { | ||
| 455 | lua_LHFunction old = L->linehook; | ||
| 456 | L->linehook = func; | ||
| 457 | return old; | ||
| 458 | } | ||
| 459 | |||
| 460 | lua_CHFunction lua_setcallhook (lua_State *L, lua_CHFunction func) { | ||
| 461 | lua_CHFunction old = L->callhook; | ||
| 462 | L->callhook = func; | ||
| 463 | return old; | ||
| 464 | } | ||
| 465 | |||
| 466 | int lua_setdebug (lua_State *L, int debug) { | ||
| 467 | int old = L->debug; | ||
| 468 | L->debug = debug; | ||
| 469 | return old; | ||
| 470 | } | ||
| 471 | |||
| 472 | /* }====================================================== */ | ||
| 473 | |||
| 474 | |||
| 475 | /* | ||
| 476 | ** {====================================================== | ||
| 477 | ** Debug interface | ||
| 478 | ** ======================================================= | ||
| 479 | */ | ||
| 480 | |||
| 481 | |||
| 482 | lua_Function lua_stackedfunction (lua_State *L, int level) { | ||
| 483 | int i; | ||
| 484 | for (i = (L->top-1)-L->stack; i>=0; i--) { | ||
| 485 | int t = L->stack[i].ttype; | ||
| 486 | if (t == LUA_T_CLMARK || t == LUA_T_PMARK || t == LUA_T_CMARK) | ||
| 487 | if (level-- == 0) | ||
| 488 | return L->stack+i; | ||
| 489 | } | ||
| 490 | return LUA_NOOBJECT; | ||
| 491 | } | ||
| 492 | |||
| 493 | |||
| 494 | int lua_nups (lua_State *L, lua_Function f) { | ||
| 495 | UNUSED(L); | ||
| 496 | return (!f || normalized_type(f) != LUA_T_CLOSURE) ? 0 : f->value.cl->nelems; | ||
| 497 | } | ||
| 498 | |||
| 499 | |||
| 500 | int lua_currentline (lua_State *L, lua_Function f) { | ||
| 501 | return (f+1 < L->top && (f+1)->ttype == LUA_T_LINE) ? (f+1)->value.i : -1; | ||
| 502 | } | ||
| 503 | |||
| 504 | |||
| 505 | lua_Object lua_getlocal (lua_State *L, lua_Function f, int local_number, | ||
| 506 | const char **name) { | ||
| 507 | /* check whether `f' is a Lua function */ | ||
| 508 | if (lua_tag(L, f) != LUA_T_PROTO) | ||
| 509 | return LUA_NOOBJECT; | ||
| 510 | else { | ||
| 511 | TProtoFunc *fp = luaA_protovalue(f)->value.tf; | ||
| 512 | *name = luaF_getlocalname(fp, local_number, lua_currentline(L, f)); | ||
| 513 | if (*name) { | ||
| 514 | /* if "*name", there must be a LUA_T_LINE */ | ||
| 515 | /* therefore, f+2 points to function base */ | ||
| 516 | return put_luaObject(L, (f+2)+(local_number-1)); | ||
| 517 | } | ||
| 518 | else | ||
| 519 | return LUA_NOOBJECT; | ||
| 520 | } | ||
| 521 | } | ||
| 522 | |||
| 523 | |||
| 524 | int lua_setlocal (lua_State *L, lua_Function f, int local_number) { | ||
| 525 | /* check whether `f' is a Lua function */ | ||
| 526 | if (lua_tag(L, f) != LUA_T_PROTO) | ||
| 527 | return 0; | ||
| 528 | else { | ||
| 529 | TProtoFunc *fp = luaA_protovalue(f)->value.tf; | ||
| 530 | const char *name = luaF_getlocalname(fp, local_number, | ||
| 531 | lua_currentline(L, f)); | ||
| 532 | checkCparams(L, 1); | ||
| 533 | --L->top; | ||
| 534 | if (name) { | ||
| 535 | /* if "name", there must be a LUA_T_LINE */ | ||
| 536 | /* therefore, f+2 points to function base */ | ||
| 537 | *((f+2)+(local_number-1)) = *L->top; | ||
| 538 | return 1; | ||
| 539 | } | ||
| 540 | else | ||
| 541 | return 0; | ||
| 542 | } | ||
| 543 | } | ||
| 544 | |||
| 545 | |||
| 546 | void lua_funcinfo (lua_State *L, lua_Object func, | ||
| 547 | const char **source, int *linedefined) { | ||
| 548 | if (!lua_isfunction(L, func)) | ||
| 549 | lua_error(L, "API error - `funcinfo' called with a non-function value"); | ||
| 550 | else { | ||
| 551 | const TObject *f = luaA_protovalue(func); | ||
| 552 | if (normalized_type(f) == LUA_T_PROTO) { | ||
| 553 | *source = tfvalue(f)->source->str; | ||
| 554 | *linedefined = tfvalue(f)->lineDefined; | ||
| 555 | } | ||
| 556 | else { | ||
| 557 | *source = "(C)"; | ||
| 558 | *linedefined = -1; | ||
| 559 | } | ||
| 560 | } | ||
| 561 | } | ||
| 562 | |||
| 563 | |||
| 564 | static int checkfunc (lua_State *L, TObject *o) { | ||
| 565 | return luaO_equalObj(o, L->top); | ||
| 566 | } | ||
| 567 | |||
| 568 | |||
| 569 | const char *lua_getobjname (lua_State *L, lua_Object o, const char **name) { | ||
| 570 | /* try to find a name for given function */ | ||
| 571 | GlobalVar *g; | ||
| 572 | set_normalized(L->top, o); /* to be used by `checkfunc' */ | ||
| 573 | for (g=L->rootglobal; g; g=g->next) { | ||
| 574 | if (checkfunc(L, &g->value)) { | ||
| 575 | *name = g->name->str; | ||
| 576 | return "global"; | ||
| 577 | } | ||
| 578 | } | ||
| 579 | /* not found: try tag methods */ | ||
| 580 | if ((*name = luaT_travtagmethods(L, checkfunc)) != NULL) | ||
| 581 | return "tag-method"; | ||
| 582 | else return ""; /* not found at all */ | ||
| 583 | } | ||
| 584 | |||
| 585 | /* }====================================================== */ | ||
| 586 | |||
| 587 | |||
| 588 | /* | ||
| 589 | ** {====================================================== | ||
| 590 | ** BLOCK mechanism | ||
| 591 | ** ======================================================= | ||
| 592 | */ | ||
| 593 | |||
| 594 | |||
| 595 | void lua_beginblock (lua_State *L) { | ||
| 596 | luaM_growvector(L, L->Cblocks, L->numCblocks, 1, struct C_Lua_Stack, | ||
| 597 | "too many nested blocks", L->stacksize); | ||
| 598 | L->Cblocks[L->numCblocks] = L->Cstack; | ||
| 599 | L->numCblocks++; | ||
| 600 | } | ||
| 601 | |||
| 602 | void lua_endblock (lua_State *L) { | ||
| 603 | if (L->numCblocks <= 0) | ||
| 604 | lua_error(L, "API error - no block to end"); | ||
| 605 | --L->numCblocks; | ||
| 606 | L->Cstack = L->Cblocks[L->numCblocks]; | ||
| 607 | L->top = L->Cstack.base; | ||
| 608 | } | ||
| 609 | |||
| 610 | |||
| 611 | |||
| 612 | int lua_ref (lua_State *L, int lock) { | ||
| 613 | int ref; | ||
| 614 | checkCparams(L, 1); | ||
| 615 | ref = luaR_ref(L, L->top-1, lock); | ||
| 616 | L->top--; | ||
| 617 | return ref; | ||
| 618 | } | ||
| 619 | |||
| 620 | |||
| 621 | |||
| 622 | lua_Object lua_getref (lua_State *L, int ref) { | ||
| 623 | const TObject *o = luaR_getref(L, ref); | ||
| 624 | return (o ? put_luaObject(L, o) : LUA_NOOBJECT); | ||
| 625 | } | ||
| 626 | |||
| 627 | /* }====================================================== */ | ||
| 628 | |||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.h,v 1.9 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: lapi.h,v 1.10 1999/12/02 16:24:45 roberto Exp roberto $ |
| 3 | ** Auxiliary functions from Lua API | 3 | ** Auxiliary functions from Lua API |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -11,9 +11,14 @@ | |||
| 11 | #include "lobject.h" | 11 | #include "lobject.h" |
| 12 | 12 | ||
| 13 | 13 | ||
| 14 | lua_Type luaA_normalizedtype (const TObject *o); | ||
| 15 | void luaA_setnormalized (TObject *d, const TObject *s); | ||
| 16 | void luaA_checkCparams (lua_State *L, int nParams); | ||
| 17 | const TObject *luaA_protovalue (const TObject *o); | ||
| 14 | void luaA_pushobject (lua_State *L, const TObject *o); | 18 | void luaA_pushobject (lua_State *L, const TObject *o); |
| 15 | GlobalVar *luaA_nextvar (lua_State *L, TaggedString *g); | 19 | GlobalVar *luaA_nextvar (lua_State *L, TaggedString *g); |
| 16 | int luaA_next (lua_State *L, const Hash *t, int i); | 20 | int luaA_next (lua_State *L, const Hash *t, int i); |
| 21 | lua_Object luaA_putluaObject (lua_State *L, const TObject *o); | ||
| 17 | lua_Object luaA_putObjectOnTop (lua_State *L); | 22 | lua_Object luaA_putObjectOnTop (lua_State *L); |
| 18 | 23 | ||
| 19 | #endif | 24 | #endif |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbuiltin.c,v 1.82 1999/12/06 11:42:18 roberto Exp roberto $ | 2 | ** $Id: lbuiltin.c,v 1.83 1999/12/07 12:05:34 roberto Exp roberto $ |
| 3 | ** Built-in functions | 3 | ** Built-in functions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -29,6 +29,17 @@ | |||
| 29 | 29 | ||
| 30 | 30 | ||
| 31 | 31 | ||
| 32 | #ifdef DEBUG | ||
| 33 | /* | ||
| 34 | ** function defined in ltests.c, to open some internal-test functions | ||
| 35 | */ | ||
| 36 | void luaB_opentests (lua_State *L); | ||
| 37 | #else | ||
| 38 | #define luaB_opentests(L) /* do nothing */ | ||
| 39 | #endif | ||
| 40 | |||
| 41 | |||
| 42 | |||
| 32 | /* | 43 | /* |
| 33 | ** {====================================================== | 44 | ** {====================================================== |
| 34 | ** Auxiliary functions | 45 | ** Auxiliary functions |
| @@ -87,7 +98,7 @@ static Hash *gettable (lua_State *L, int arg) { | |||
| 87 | ** If your system does not support "stderr", redefine this function, or | 98 | ** If your system does not support "stderr", redefine this function, or |
| 88 | ** redefine _ERRORMESSAGE so that it won't need _ALERT. | 99 | ** redefine _ERRORMESSAGE so that it won't need _ALERT. |
| 89 | */ | 100 | */ |
| 90 | static void luaB_alert (lua_State *L) { | 101 | void luaB_alert (lua_State *L) { |
| 91 | fputs(luaL_check_string(L, 1), stderr); | 102 | fputs(luaL_check_string(L, 1), stderr); |
| 92 | } | 103 | } |
| 93 | 104 | ||
| @@ -96,7 +107,7 @@ static void luaB_alert (lua_State *L) { | |||
| 96 | ** Standard implementation of _ERRORMESSAGE. | 107 | ** Standard implementation of _ERRORMESSAGE. |
| 97 | ** The library "iolib" redefines _ERRORMESSAGE for better error information. | 108 | ** The library "iolib" redefines _ERRORMESSAGE for better error information. |
| 98 | */ | 109 | */ |
| 99 | static void error_message (lua_State *L) { | 110 | void luaB_ERRORMESSAGE (lua_State *L) { |
| 100 | lua_Object al = lua_rawgetglobal(L, "_ALERT"); | 111 | lua_Object al = lua_rawgetglobal(L, "_ALERT"); |
| 101 | if (lua_isfunction(L, al)) { /* avoid error loop if _ALERT is not defined */ | 112 | if (lua_isfunction(L, al)) { /* avoid error loop if _ALERT is not defined */ |
| 102 | char buff[600]; | 113 | char buff[600]; |
| @@ -117,7 +128,7 @@ static void error_message (lua_State *L) { | |||
| 117 | #define MAXPRINT 40 /* arbitrary limit */ | 128 | #define MAXPRINT 40 /* arbitrary limit */ |
| 118 | #endif | 129 | #endif |
| 119 | 130 | ||
| 120 | static void luaB_print (lua_State *L) { | 131 | void luaB_print (lua_State *L) { |
| 121 | lua_Object args[MAXPRINT]; | 132 | lua_Object args[MAXPRINT]; |
| 122 | lua_Object obj; | 133 | lua_Object obj; |
| 123 | int n = 0; | 134 | int n = 0; |
| @@ -140,7 +151,7 @@ static void luaB_print (lua_State *L) { | |||
| 140 | } | 151 | } |
| 141 | 152 | ||
| 142 | 153 | ||
| 143 | static void luaB_tonumber (lua_State *L) { | 154 | void luaB_tonumber (lua_State *L) { |
| 144 | int base = luaL_opt_int(L, 2, 10); | 155 | int base = luaL_opt_int(L, 2, 10); |
| 145 | if (base == 10) { /* standard conversion */ | 156 | if (base == 10) { /* standard conversion */ |
| 146 | lua_Object o = lua_getparam(L, 1); | 157 | lua_Object o = lua_getparam(L, 1); |
| @@ -161,66 +172,66 @@ static void luaB_tonumber (lua_State *L) { | |||
| 161 | } | 172 | } |
| 162 | 173 | ||
| 163 | 174 | ||
| 164 | static void luaB_error (lua_State *L) { | 175 | void luaB_error (lua_State *L) { |
| 165 | lua_error(L, lua_getstring(L, lua_getparam(L, 1))); | 176 | lua_error(L, lua_getstring(L, lua_getparam(L, 1))); |
| 166 | } | 177 | } |
| 167 | 178 | ||
| 168 | static void luaB_setglobal (lua_State *L) { | 179 | void luaB_setglobal (lua_State *L) { |
| 169 | const char *n = luaL_check_string(L, 1); | 180 | const char *n = luaL_check_string(L, 1); |
| 170 | lua_Object value = luaL_nonnullarg(L, 2); | 181 | lua_Object value = luaL_nonnullarg(L, 2); |
| 171 | lua_pushobject(L, value); | 182 | lua_pushobject(L, value); |
| 172 | lua_setglobal(L, n); | 183 | lua_setglobal(L, n); |
| 173 | } | 184 | } |
| 174 | 185 | ||
| 175 | static void luaB_rawsetglobal (lua_State *L) { | 186 | void luaB_rawsetglobal (lua_State *L) { |
| 176 | const char *n = luaL_check_string(L, 1); | 187 | const char *n = luaL_check_string(L, 1); |
| 177 | lua_Object value = luaL_nonnullarg(L, 2); | 188 | lua_Object value = luaL_nonnullarg(L, 2); |
| 178 | lua_pushobject(L, value); | 189 | lua_pushobject(L, value); |
| 179 | lua_rawsetglobal(L, n); | 190 | lua_rawsetglobal(L, n); |
| 180 | } | 191 | } |
| 181 | 192 | ||
| 182 | static void luaB_getglobal (lua_State *L) { | 193 | void luaB_getglobal (lua_State *L) { |
| 183 | lua_pushobject(L, lua_getglobal(L, luaL_check_string(L, 1))); | 194 | lua_pushobject(L, lua_getglobal(L, luaL_check_string(L, 1))); |
| 184 | } | 195 | } |
| 185 | 196 | ||
| 186 | static void luaB_rawgetglobal (lua_State *L) { | 197 | void luaB_rawgetglobal (lua_State *L) { |
| 187 | lua_pushobject(L, lua_rawgetglobal(L, luaL_check_string(L, 1))); | 198 | lua_pushobject(L, lua_rawgetglobal(L, luaL_check_string(L, 1))); |
| 188 | } | 199 | } |
| 189 | 200 | ||
| 190 | static void luaB_tag (lua_State *L) { | 201 | void luaB_tag (lua_State *L) { |
| 191 | lua_pushnumber(L, lua_tag(L, lua_getparam(L, 1))); | 202 | lua_pushnumber(L, lua_tag(L, lua_getparam(L, 1))); |
| 192 | } | 203 | } |
| 193 | 204 | ||
| 194 | static void luaB_settag (lua_State *L) { | 205 | void luaB_settag (lua_State *L) { |
| 195 | lua_Object o = luaL_tablearg(L, 1); | 206 | lua_Object o = luaL_tablearg(L, 1); |
| 196 | lua_pushobject(L, o); | 207 | lua_pushobject(L, o); |
| 197 | lua_settag(L, luaL_check_int(L, 2)); | 208 | lua_settag(L, luaL_check_int(L, 2)); |
| 198 | lua_pushobject(L, o); /* return first argument */ | 209 | lua_pushobject(L, o); /* return first argument */ |
| 199 | } | 210 | } |
| 200 | 211 | ||
| 201 | static void luaB_newtag (lua_State *L) { | 212 | void luaB_newtag (lua_State *L) { |
| 202 | lua_pushnumber(L, lua_newtag(L)); | 213 | lua_pushnumber(L, lua_newtag(L)); |
| 203 | } | 214 | } |
| 204 | 215 | ||
| 205 | static void luaB_copytagmethods (lua_State *L) { | 216 | void luaB_copytagmethods (lua_State *L) { |
| 206 | lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1), | 217 | lua_pushnumber(L, lua_copytagmethods(L, luaL_check_int(L, 1), |
| 207 | luaL_check_int(L, 2))); | 218 | luaL_check_int(L, 2))); |
| 208 | } | 219 | } |
| 209 | 220 | ||
| 210 | static void luaB_rawgettable (lua_State *L) { | 221 | void luaB_rawgettable (lua_State *L) { |
| 211 | lua_pushobject(L, luaL_nonnullarg(L, 1)); | 222 | lua_pushobject(L, luaL_nonnullarg(L, 1)); |
| 212 | lua_pushobject(L, luaL_nonnullarg(L, 2)); | 223 | lua_pushobject(L, luaL_nonnullarg(L, 2)); |
| 213 | lua_pushobject(L, lua_rawgettable(L)); | 224 | lua_pushobject(L, lua_rawgettable(L)); |
| 214 | } | 225 | } |
| 215 | 226 | ||
| 216 | static void luaB_rawsettable (lua_State *L) { | 227 | void luaB_rawsettable (lua_State *L) { |
| 217 | lua_pushobject(L, luaL_nonnullarg(L, 1)); | 228 | lua_pushobject(L, luaL_nonnullarg(L, 1)); |
| 218 | lua_pushobject(L, luaL_nonnullarg(L, 2)); | 229 | lua_pushobject(L, luaL_nonnullarg(L, 2)); |
| 219 | lua_pushobject(L, luaL_nonnullarg(L, 3)); | 230 | lua_pushobject(L, luaL_nonnullarg(L, 3)); |
| 220 | lua_rawsettable(L); | 231 | lua_rawsettable(L); |
| 221 | } | 232 | } |
| 222 | 233 | ||
| 223 | static void luaB_settagmethod (lua_State *L) { | 234 | void luaB_settagmethod (lua_State *L) { |
| 224 | int tag = luaL_check_int(L, 1); | 235 | int tag = luaL_check_int(L, 1); |
| 225 | const char *event = luaL_check_string(L, 2); | 236 | const char *event = luaL_check_string(L, 2); |
| 226 | lua_Object nf = luaL_nonnullarg(L, 3); | 237 | lua_Object nf = luaL_nonnullarg(L, 3); |
| @@ -232,23 +243,23 @@ static void luaB_settagmethod (lua_State *L) { | |||
| 232 | lua_pushobject(L, lua_settagmethod(L, tag, event)); | 243 | lua_pushobject(L, lua_settagmethod(L, tag, event)); |
| 233 | } | 244 | } |
| 234 | 245 | ||
| 235 | static void luaB_gettagmethod (lua_State *L) { | 246 | void luaB_gettagmethod (lua_State *L) { |
| 236 | lua_pushobject(L, lua_gettagmethod(L, luaL_check_int(L, 1), | 247 | lua_pushobject(L, lua_gettagmethod(L, luaL_check_int(L, 1), |
| 237 | luaL_check_string(L, 2))); | 248 | luaL_check_string(L, 2))); |
| 238 | } | 249 | } |
| 239 | 250 | ||
| 240 | static void luaB_seterrormethod (lua_State *L) { | 251 | void luaB_seterrormethod (lua_State *L) { |
| 241 | lua_Object nf = luaL_functionarg(L, 1); | 252 | lua_Object nf = luaL_functionarg(L, 1); |
| 242 | lua_pushobject(L, nf); | 253 | lua_pushobject(L, nf); |
| 243 | lua_pushobject(L, lua_seterrormethod(L)); | 254 | lua_pushobject(L, lua_seterrormethod(L)); |
| 244 | } | 255 | } |
| 245 | 256 | ||
| 246 | static void luaB_collectgarbage (lua_State *L) { | 257 | void luaB_collectgarbage (lua_State *L) { |
| 247 | lua_pushnumber(L, lua_collectgarbage(L, luaL_opt_int(L, 1, 0))); | 258 | lua_pushnumber(L, lua_collectgarbage(L, luaL_opt_int(L, 1, 0))); |
| 248 | } | 259 | } |
| 249 | 260 | ||
| 250 | 261 | ||
| 251 | static void luaB_type (lua_State *L) { | 262 | void luaB_type (lua_State *L) { |
| 252 | lua_Object o = luaL_nonnullarg(L, 1); | 263 | lua_Object o = luaL_nonnullarg(L, 1); |
| 253 | lua_pushstring(L, lua_type(L, o)); | 264 | lua_pushstring(L, lua_type(L, o)); |
| 254 | } | 265 | } |
| @@ -270,7 +281,7 @@ static void passresults (lua_State *L) { | |||
| 270 | lua_pushuserdata(L, NULL); /* at least one result to signal no errors */ | 281 | lua_pushuserdata(L, NULL); /* at least one result to signal no errors */ |
| 271 | } | 282 | } |
| 272 | 283 | ||
| 273 | static void luaB_dostring (lua_State *L) { | 284 | void luaB_dostring (lua_State *L) { |
| 274 | long l; | 285 | long l; |
| 275 | const char *s = luaL_check_lstr(L, 1, &l); | 286 | const char *s = luaL_check_lstr(L, 1, &l); |
| 276 | if (*s == ID_CHUNK) | 287 | if (*s == ID_CHUNK) |
| @@ -281,7 +292,7 @@ static void luaB_dostring (lua_State *L) { | |||
| 281 | } | 292 | } |
| 282 | 293 | ||
| 283 | 294 | ||
| 284 | static void luaB_dofile (lua_State *L) { | 295 | void luaB_dofile (lua_State *L) { |
| 285 | const char *fname = luaL_opt_string(L, 1, NULL); | 296 | const char *fname = luaL_opt_string(L, 1, NULL); |
| 286 | if (lua_dofile(L, fname) == 0) | 297 | if (lua_dofile(L, fname) == 0) |
| 287 | passresults(L); | 298 | passresults(L); |
| @@ -289,7 +300,7 @@ static void luaB_dofile (lua_State *L) { | |||
| 289 | } | 300 | } |
| 290 | 301 | ||
| 291 | 302 | ||
| 292 | static void luaB_call (lua_State *L) { | 303 | void luaB_call (lua_State *L) { |
| 293 | lua_Object f = luaL_nonnullarg(L, 1); | 304 | lua_Object f = luaL_nonnullarg(L, 1); |
| 294 | const Hash *arg = gettable(L, 2); | 305 | const Hash *arg = gettable(L, 2); |
| 295 | const char *options = luaL_opt_string(L, 3, ""); | 306 | const char *options = luaL_opt_string(L, 3, ""); |
| @@ -328,7 +339,7 @@ static void luaB_call (lua_State *L) { | |||
| 328 | } | 339 | } |
| 329 | 340 | ||
| 330 | 341 | ||
| 331 | static void luaB_nextvar (lua_State *L) { | 342 | void luaB_nextvar (lua_State *L) { |
| 332 | lua_Object o = luaL_nonnullarg(L, 1); | 343 | lua_Object o = luaL_nonnullarg(L, 1); |
| 333 | TaggedString *g; | 344 | TaggedString *g; |
| 334 | if (ttype(o) == LUA_T_NIL) | 345 | if (ttype(o) == LUA_T_NIL) |
| @@ -342,7 +353,7 @@ static void luaB_nextvar (lua_State *L) { | |||
| 342 | } | 353 | } |
| 343 | 354 | ||
| 344 | 355 | ||
| 345 | static void luaB_next (lua_State *L) { | 356 | void luaB_next (lua_State *L) { |
| 346 | const Hash *a = gettable(L, 1); | 357 | const Hash *a = gettable(L, 1); |
| 347 | lua_Object k = luaL_nonnullarg(L, 2); | 358 | lua_Object k = luaL_nonnullarg(L, 2); |
| 348 | int i; /* will get first element after `i' */ | 359 | int i; /* will get first element after `i' */ |
| @@ -357,7 +368,7 @@ static void luaB_next (lua_State *L) { | |||
| 357 | } | 368 | } |
| 358 | 369 | ||
| 359 | 370 | ||
| 360 | static void luaB_tostring (lua_State *L) { | 371 | void luaB_tostring (lua_State *L) { |
| 361 | lua_Object o = lua_getparam(L, 1); | 372 | lua_Object o = lua_getparam(L, 1); |
| 362 | char buff[64]; | 373 | char buff[64]; |
| 363 | switch (ttype(o)) { | 374 | switch (ttype(o)) { |
| @@ -405,14 +416,14 @@ static void luaB_tostring (lua_State *L) { | |||
| 405 | ** ======================================================= | 416 | ** ======================================================= |
| 406 | */ | 417 | */ |
| 407 | 418 | ||
| 408 | static void luaB_assert (lua_State *L) { | 419 | void luaB_assert (lua_State *L) { |
| 409 | lua_Object p = lua_getparam(L, 1); | 420 | lua_Object p = lua_getparam(L, 1); |
| 410 | if (p == LUA_NOOBJECT || lua_isnil(L, p)) | 421 | if (p == LUA_NOOBJECT || lua_isnil(L, p)) |
| 411 | luaL_verror(L, "assertion failed! %.90s", luaL_opt_string(L, 2, "")); | 422 | luaL_verror(L, "assertion failed! %.90s", luaL_opt_string(L, 2, "")); |
| 412 | } | 423 | } |
| 413 | 424 | ||
| 414 | 425 | ||
| 415 | static void luaB_foreachi (lua_State *L) { | 426 | void luaB_foreachi (lua_State *L) { |
| 416 | const Hash *t = gettable(L, 1); | 427 | const Hash *t = gettable(L, 1); |
| 417 | int n = (int)getnarg(L, t); | 428 | int n = (int)getnarg(L, t); |
| 418 | int i; | 429 | int i; |
| @@ -430,7 +441,7 @@ static void luaB_foreachi (lua_State *L) { | |||
| 430 | } | 441 | } |
| 431 | 442 | ||
| 432 | 443 | ||
| 433 | static void luaB_foreach (lua_State *L) { | 444 | void luaB_foreach (lua_State *L) { |
| 434 | const Hash *a = gettable(L, 1); | 445 | const Hash *a = gettable(L, 1); |
| 435 | lua_Object f = luaL_functionarg(L, 2); | 446 | lua_Object f = luaL_functionarg(L, 2); |
| 436 | int i; | 447 | int i; |
| @@ -450,7 +461,7 @@ static void luaB_foreach (lua_State *L) { | |||
| 450 | } | 461 | } |
| 451 | 462 | ||
| 452 | 463 | ||
| 453 | static void luaB_foreachvar (lua_State *L) { | 464 | void luaB_foreachvar (lua_State *L) { |
| 454 | lua_Object f = luaL_functionarg(L, 1); | 465 | lua_Object f = luaL_functionarg(L, 1); |
| 455 | GlobalVar *gv; | 466 | GlobalVar *gv; |
| 456 | luaD_checkstack(L, 4); /* for extra var name, f, var name, and globalval */ | 467 | luaD_checkstack(L, 4); /* for extra var name, f, var name, and globalval */ |
| @@ -472,12 +483,12 @@ static void luaB_foreachvar (lua_State *L) { | |||
| 472 | } | 483 | } |
| 473 | 484 | ||
| 474 | 485 | ||
| 475 | static void luaB_getn (lua_State *L) { | 486 | void luaB_getn (lua_State *L) { |
| 476 | lua_pushnumber(L, getnarg(L, gettable(L, 1))); | 487 | lua_pushnumber(L, getnarg(L, gettable(L, 1))); |
| 477 | } | 488 | } |
| 478 | 489 | ||
| 479 | 490 | ||
| 480 | static void luaB_tinsert (lua_State *L) { | 491 | void luaB_tinsert (lua_State *L) { |
| 481 | Hash *a = gettable(L, 1); | 492 | Hash *a = gettable(L, 1); |
| 482 | lua_Object v = lua_getparam(L, 3); | 493 | lua_Object v = lua_getparam(L, 3); |
| 483 | int n = (int)getnarg(L, a); | 494 | int n = (int)getnarg(L, a); |
| @@ -495,7 +506,7 @@ static void luaB_tinsert (lua_State *L) { | |||
| 495 | } | 506 | } |
| 496 | 507 | ||
| 497 | 508 | ||
| 498 | static void luaB_tremove (lua_State *L) { | 509 | void luaB_tremove (lua_State *L) { |
| 499 | Hash *a = gettable(L, 1); | 510 | Hash *a = gettable(L, 1); |
| 500 | int n = (int)getnarg(L, a); | 511 | int n = (int)getnarg(L, a); |
| 501 | int pos = luaL_opt_int(L, 2, n); | 512 | int pos = luaL_opt_int(L, 2, n); |
| @@ -583,7 +594,7 @@ static void auxsort (lua_State *L, Hash *a, int l, int u, lua_Object f) { | |||
| 583 | L->top--; /* remove pivot from stack */ | 594 | L->top--; /* remove pivot from stack */ |
| 584 | } | 595 | } |
| 585 | 596 | ||
| 586 | static void luaB_sort (lua_State *L) { | 597 | void luaB_sort (lua_State *L) { |
| 587 | lua_Object t = lua_getparam(L, 1); | 598 | lua_Object t = lua_getparam(L, 1); |
| 588 | Hash *a = gettable(L, 1); | 599 | Hash *a = gettable(L, 1); |
| 589 | int n = (int)getnarg(L, a); | 600 | int n = (int)getnarg(L, a); |
| @@ -601,255 +612,9 @@ static void luaB_sort (lua_State *L) { | |||
| 601 | /* }====================================================== */ | 612 | /* }====================================================== */ |
| 602 | 613 | ||
| 603 | 614 | ||
| 604 | |||
| 605 | #ifdef DEBUG | ||
| 606 | /* | ||
| 607 | ** {====================================================== | ||
| 608 | ** some DEBUG functions | ||
| 609 | ** (for internal debugging of the Lua implementation) | ||
| 610 | ** ======================================================= | ||
| 611 | */ | ||
| 612 | |||
| 613 | static void mem_query (lua_State *L) { | ||
| 614 | lua_pushnumber(L, totalmem); | ||
| 615 | lua_pushnumber(L, numblocks); | ||
| 616 | } | ||
| 617 | |||
| 618 | |||
| 619 | static void hash_query (lua_State *L) { | ||
| 620 | lua_Object o = luaL_nonnullarg(L, 1); | ||
| 621 | if (lua_getparam(L, 2) == LUA_NOOBJECT) { | ||
| 622 | luaL_arg_check(L, ttype(o) == LUA_T_STRING, 1, "string expected"); | ||
| 623 | lua_pushnumber(L, tsvalue(o)->hash); | ||
| 624 | } | ||
| 625 | else { | ||
| 626 | const Hash *t = avalue(luaL_tablearg(L, 2)); | ||
| 627 | lua_pushnumber(L, luaH_mainposition(t, o) - t->node); | ||
| 628 | } | ||
| 629 | } | ||
| 630 | |||
| 631 | |||
| 632 | static void table_query (lua_State *L) { | ||
| 633 | const Hash *t = avalue(luaL_tablearg(L, 1)); | ||
| 634 | int i = luaL_opt_int(L, 2, -1); | ||
| 635 | if (i == -1) { | ||
| 636 | lua_pushnumber(L, t->size); | ||
| 637 | lua_pushnumber(L, t->firstfree - t->node); | ||
| 638 | } | ||
| 639 | else if (i < t->size) { | ||
| 640 | luaA_pushobject(L, &t->node[i].key); | ||
| 641 | luaA_pushobject(L, &t->node[i].val); | ||
| 642 | if (t->node[i].next) | ||
| 643 | lua_pushnumber(L, t->node[i].next - t->node); | ||
| 644 | } | ||
| 645 | } | ||
| 646 | |||
| 647 | |||
| 648 | static void query_strings (lua_State *L) { | ||
| 649 | int h = luaL_check_int(L, 1) - 1; | ||
| 650 | int s = luaL_opt_int(L, 2, 0) - 1; | ||
| 651 | if (s==-1) { | ||
| 652 | if (h < NUM_HASHS) { | ||
| 653 | lua_pushnumber(L, L->string_root[h].nuse); | ||
| 654 | lua_pushnumber(L, L->string_root[h].size); | ||
| 655 | } | ||
| 656 | } | ||
| 657 | else { | ||
| 658 | TaggedString *ts = L->string_root[h].hash[s]; | ||
| 659 | for (ts = L->string_root[h].hash[s]; ts; ts = ts->nexthash) { | ||
| 660 | if (ts->constindex == -1) lua_pushstring(L, "<USERDATA>"); | ||
| 661 | else lua_pushstring(L, ts->str); | ||
| 662 | } | ||
| 663 | } | ||
| 664 | } | ||
| 665 | |||
| 666 | |||
| 667 | static const char *delimits = " \t\n,;"; | ||
| 668 | |||
| 669 | static void skip (const char **pc) { | ||
| 670 | while (**pc != '\0' && strchr(delimits, **pc)) (*pc)++; | ||
| 671 | } | ||
| 672 | |||
| 673 | static int getnum (const char **pc) { | ||
| 674 | int res = 0; | ||
| 675 | skip(pc); | ||
| 676 | while (isdigit(**pc)) res = res*10 + (*(*pc)++) - '0'; | ||
| 677 | return res; | ||
| 678 | } | ||
| 679 | |||
| 680 | static int getreg (lua_State *L, const char **pc) { | ||
| 681 | skip(pc); | ||
| 682 | if (*(*pc)++ != 'r') lua_error(L, "`testC' expecting a register"); | ||
| 683 | return getnum(pc); | ||
| 684 | } | ||
| 685 | |||
| 686 | static const char *getname (const char **pc) { | ||
| 687 | static char buff[30]; | ||
| 688 | int i = 0; | ||
| 689 | skip(pc); | ||
| 690 | while (**pc != '\0' && !strchr(delimits, **pc)) | ||
| 691 | buff[i++] = *(*pc)++; | ||
| 692 | buff[i] = '\0'; | ||
| 693 | return buff; | ||
| 694 | } | ||
| 695 | |||
| 696 | |||
| 697 | #define EQ(s1) (strcmp(s1, inst) == 0) | ||
| 698 | |||
| 699 | static void testC (lua_State *L) { | ||
| 700 | lua_Object reg[10]; | ||
| 701 | const char *pc = luaL_check_string(L, 1); | ||
| 702 | for (;;) { | ||
| 703 | const char *inst = getname(&pc); | ||
| 704 | if EQ("") return; | ||
| 705 | else if EQ("pushnum") { | ||
| 706 | lua_pushnumber(L, getnum(&pc)); | ||
| 707 | } | ||
| 708 | else if EQ("createtable") { | ||
| 709 | reg[getreg(L, &pc)] = lua_createtable(L); | ||
| 710 | } | ||
| 711 | else if EQ("closure") { | ||
| 712 | lua_CFunction f = lua_getcfunction(L, lua_getglobal(L, getname(&pc))); | ||
| 713 | lua_pushcclosure(L, f, getnum(&pc)); | ||
| 714 | } | ||
| 715 | else if EQ("pop") { | ||
| 716 | reg[getreg(L, &pc)] = lua_pop(L); | ||
| 717 | } | ||
| 718 | else if EQ("getglobal") { | ||
| 719 | int n = getreg(L, &pc); | ||
| 720 | reg[n] = lua_getglobal(L, getname(&pc)); | ||
| 721 | } | ||
| 722 | else if EQ("rawgetglobal") { | ||
| 723 | int n = getreg(L, &pc); | ||
| 724 | reg[n] = lua_rawgetglobal(L, getname(&pc)); | ||
| 725 | } | ||
| 726 | else if EQ("ref") { | ||
| 727 | lua_pushnumber(L, lua_ref(L, 0)); | ||
| 728 | reg[getreg(L, &pc)] = lua_pop(L); | ||
| 729 | } | ||
| 730 | else if EQ("reflock") { | ||
| 731 | lua_pushnumber(L, lua_ref(L, 1)); | ||
| 732 | reg[getreg(L, &pc)] = lua_pop(L); | ||
| 733 | } | ||
| 734 | else if EQ("getref") { | ||
| 735 | int n = getreg(L, &pc); | ||
| 736 | reg[n] = lua_getref(L, (int)lua_getnumber(L, reg[getreg(L, &pc)])); | ||
| 737 | } | ||
| 738 | else if EQ("unref") { | ||
| 739 | lua_unref(L, (int)lua_getnumber(L, reg[getreg(L, &pc)])); | ||
| 740 | } | ||
| 741 | else if EQ("getparam") { | ||
| 742 | int n = getreg(L, &pc); | ||
| 743 | reg[n] = lua_getparam(L, getnum(&pc)+1); /* skips the commmand itself */ | ||
| 744 | } | ||
| 745 | else if EQ("getresult") { | ||
| 746 | int n = getreg(L, &pc); | ||
| 747 | reg[n] = lua_getparam(L, getnum(&pc)); | ||
| 748 | } | ||
| 749 | else if EQ("setglobal") { | ||
| 750 | lua_setglobal(L, getname(&pc)); | ||
| 751 | } | ||
| 752 | else if EQ("rawsetglobal") { | ||
| 753 | lua_rawsetglobal(L, getname(&pc)); | ||
| 754 | } | ||
| 755 | else if EQ("pushstring") { | ||
| 756 | lua_pushstring(L, getname(&pc)); | ||
| 757 | } | ||
| 758 | else if EQ("pushreg") { | ||
| 759 | lua_pushobject(L, reg[getreg(L, &pc)]); | ||
| 760 | } | ||
| 761 | else if EQ("call") { | ||
| 762 | lua_call(L, getname(&pc)); | ||
| 763 | } | ||
| 764 | else if EQ("gettable") { | ||
| 765 | reg[getreg(L, &pc)] = lua_gettable(L); | ||
| 766 | } | ||
| 767 | else if EQ("rawgettable") { | ||
| 768 | reg[getreg(L, &pc)] = lua_rawgettable(L); | ||
| 769 | } | ||
| 770 | else if EQ("settable") { | ||
| 771 | lua_settable(L); | ||
| 772 | } | ||
| 773 | else if EQ("rawsettable") { | ||
| 774 | lua_rawsettable(L); | ||
| 775 | } | ||
| 776 | else if EQ("nextvar") { | ||
| 777 | lua_pushstring(L, lua_nextvar(L, lua_getstring(L, reg[getreg(L, &pc)]))); | ||
| 778 | } | ||
| 779 | else if EQ("next") { | ||
| 780 | int n = getreg(L, &pc); | ||
| 781 | n = lua_next(L, reg[n], (int)lua_getnumber(L, reg[getreg(L, &pc)])); | ||
| 782 | lua_pushnumber(L, n); | ||
| 783 | } | ||
| 784 | else if EQ("equal") { | ||
| 785 | int n1 = getreg(L, &pc); | ||
| 786 | int n2 = getreg(L, &pc); | ||
| 787 | lua_pushnumber(L, lua_equal(L, reg[n1], reg[n2])); | ||
| 788 | } | ||
| 789 | else if EQ("pushusertag") { | ||
| 790 | int val = getreg(L, &pc); | ||
| 791 | int tag = getreg(L, &pc); | ||
| 792 | lua_pushusertag(L, (void *)(int)lua_getnumber(L, reg[val]), | ||
| 793 | (int)lua_getnumber(L, reg[tag])); | ||
| 794 | } | ||
| 795 | else if EQ("udataval") { | ||
| 796 | int n = getreg(L, &pc); | ||
| 797 | lua_pushnumber(L, (int)lua_getuserdata(L, reg[getreg(L, &pc)])); | ||
| 798 | reg[n] = lua_pop(L); | ||
| 799 | } | ||
| 800 | else if EQ("settagmethod") { | ||
| 801 | int n = getreg(L, &pc); | ||
| 802 | lua_settagmethod(L, (int)lua_getnumber(L, reg[n]), getname(&pc)); | ||
| 803 | } | ||
| 804 | else if EQ("beginblock") { | ||
| 805 | lua_beginblock(L); | ||
| 806 | } | ||
| 807 | else if EQ("endblock") { | ||
| 808 | lua_endblock(L); | ||
| 809 | } | ||
| 810 | else if EQ("newstate") { | ||
| 811 | int stacksize = getnum(&pc); | ||
| 812 | lua_State *L1 = lua_newstate("stack", stacksize, | ||
| 813 | "builtin", getnum(&pc), NULL); | ||
| 814 | lua_pushuserdata(L, L1); | ||
| 815 | } | ||
| 816 | else if EQ("closestate") { | ||
| 817 | lua_close(lua_getuserdata(L, reg[getreg(L, &pc)])); | ||
| 818 | } | ||
| 819 | else if EQ("doremote") { | ||
| 820 | lua_Object ol1 = reg[getreg(L, &pc)]; | ||
| 821 | lua_Object str = reg[getreg(L, &pc)]; | ||
| 822 | lua_State *L1; | ||
| 823 | lua_Object temp; | ||
| 824 | int i; | ||
| 825 | if (!lua_isuserdata(L, ol1) || !lua_isstring(L, str)) | ||
| 826 | lua_error(L, "bad arguments for `doremote'"); | ||
| 827 | L1 = lua_getuserdata(L, ol1); | ||
| 828 | lua_dostring(L1, lua_getstring(L, str)); | ||
| 829 | i = 1; | ||
| 830 | while ((temp = lua_getresult(L1, i++)) != LUA_NOOBJECT) | ||
| 831 | lua_pushstring(L, lua_getstring(L1, temp)); | ||
| 832 | } | ||
| 833 | else luaL_verror(L, "unknown command in `testC': %.20s", inst); | ||
| 834 | } | ||
| 835 | } | ||
| 836 | |||
| 837 | |||
| 838 | /* }====================================================== */ | ||
| 839 | #endif | ||
| 840 | |||
| 841 | |||
| 842 | |||
| 843 | static const struct luaL_reg builtin_funcs[] = { | 615 | static const struct luaL_reg builtin_funcs[] = { |
| 844 | #ifdef DEBUG | ||
| 845 | {"hash", hash_query}, | ||
| 846 | {"querystr", query_strings}, | ||
| 847 | {"querytab", table_query}, | ||
| 848 | {"testC", testC}, | ||
| 849 | {"totalmem", mem_query}, | ||
| 850 | #endif | ||
| 851 | {"_ALERT", luaB_alert}, | 616 | {"_ALERT", luaB_alert}, |
| 852 | {"_ERRORMESSAGE", error_message}, | 617 | {"_ERRORMESSAGE", luaB_ERRORMESSAGE}, |
| 853 | {"call", luaB_call}, | 618 | {"call", luaB_call}, |
| 854 | {"collectgarbage", luaB_collectgarbage}, | 619 | {"collectgarbage", luaB_collectgarbage}, |
| 855 | {"copytagmethods", luaB_copytagmethods}, | 620 | {"copytagmethods", luaB_copytagmethods}, |
| @@ -891,6 +656,7 @@ void luaB_predefine (lua_State *L) { | |||
| 891 | luaS_newfixedstring(L, tableEM); | 656 | luaS_newfixedstring(L, tableEM); |
| 892 | luaS_newfixedstring(L, memEM); | 657 | luaS_newfixedstring(L, memEM); |
| 893 | luaL_openl(L, builtin_funcs); | 658 | luaL_openl(L, builtin_funcs); |
| 659 | luaB_opentests(L); /* internal test functions (when DEBUG is on) */ | ||
| 894 | lua_pushstring(L, LUA_VERSION); | 660 | lua_pushstring(L, LUA_VERSION); |
| 895 | lua_setglobal(L, "_VERSION"); | 661 | lua_setglobal(L, "_VERSION"); |
| 896 | } | 662 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lbuiltin.h,v 1.1 1997/09/16 19:25:59 roberto Exp roberto $ | 2 | ** $Id: lbuiltin.h,v 1.2 1999/11/22 13:12:07 roberto Exp roberto $ |
| 3 | ** Built-in functions | 3 | ** Built-in functions |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -9,6 +9,42 @@ | |||
| 9 | 9 | ||
| 10 | #include "lua.h" | 10 | #include "lua.h" |
| 11 | 11 | ||
| 12 | void luaB_alert (lua_State *L); | ||
| 13 | void luaB_ERRORMESSAGE (lua_State *L); | ||
| 14 | void luaB_print (lua_State *L); | ||
| 15 | void luaB_tonumber (lua_State *L); | ||
| 16 | void luaB_error (lua_State *L); | ||
| 17 | void luaB_setglobal (lua_State *L); | ||
| 18 | void luaB_rawsetglobal (lua_State *L); | ||
| 19 | void luaB_getglobal (lua_State *L); | ||
| 20 | void luaB_rawgetglobal (lua_State *L); | ||
| 21 | void luaB_tag (lua_State *L); | ||
| 22 | void luaB_settag (lua_State *L); | ||
| 23 | void luaB_newtag (lua_State *L); | ||
| 24 | void luaB_copytagmethods (lua_State *L); | ||
| 25 | void luaB_rawgettable (lua_State *L); | ||
| 26 | void luaB_rawsettable (lua_State *L); | ||
| 27 | void luaB_settagmethod (lua_State *L); | ||
| 28 | void luaB_gettagmethod (lua_State *L); | ||
| 29 | void luaB_seterrormethod (lua_State *L); | ||
| 30 | void luaB_collectgarbage (lua_State *L); | ||
| 31 | void luaB_type (lua_State *L); | ||
| 32 | void luaB_dostring (lua_State *L); | ||
| 33 | void luaB_dofile (lua_State *L); | ||
| 34 | void luaB_call (lua_State *L); | ||
| 35 | void luaB_nextvar (lua_State *L); | ||
| 36 | void luaB_next (lua_State *L); | ||
| 37 | void luaB_tostring (lua_State *L); | ||
| 38 | void luaB_assert (lua_State *L); | ||
| 39 | void luaB_foreachi (lua_State *L); | ||
| 40 | void luaB_foreach (lua_State *L); | ||
| 41 | void luaB_foreachvar (lua_State *L); | ||
| 42 | void luaB_getn (lua_State *L); | ||
| 43 | void luaB_tinsert (lua_State *L); | ||
| 44 | void luaB_tremove (lua_State *L); | ||
| 45 | void luaB_sort (lua_State *L); | ||
| 46 | |||
| 47 | |||
| 12 | void luaB_predefine (lua_State *L); | 48 | void luaB_predefine (lua_State *L); |
| 13 | 49 | ||
| 14 | 50 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lgc.c,v 1.34 1999/11/26 18:59:20 roberto Exp roberto $ | 2 | ** $Id: lgc.c,v 1.35 1999/12/01 19:50:08 roberto Exp roberto $ |
| 3 | ** Garbage Collector | 3 | ** Garbage Collector |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -23,7 +23,7 @@ | |||
| 23 | static int markobject (lua_State *L, TObject *o); | 23 | static int markobject (lua_State *L, TObject *o); |
| 24 | 24 | ||
| 25 | 25 | ||
| 26 | /* mark a string; marks bigger than 1 cannot be changed */ | 26 | /* mark a string; marks larger than 1 cannot be changed */ |
| 27 | #define strmark(L, s) {if ((s)->marked == 0) (s)->marked = 1;} | 27 | #define strmark(L, s) {if ((s)->marked == 0) (s)->marked = 1;} |
| 28 | 28 | ||
| 29 | 29 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: llex.c,v 1.44 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: llex.c,v 1.45 1999/12/02 16:41:29 roberto Exp roberto $ |
| 3 | ** Lexical Analyzer | 3 | ** Lexical Analyzer |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -64,7 +64,7 @@ void luaX_error (LexState *ls, const char *s) { | |||
| 64 | 64 | ||
| 65 | 65 | ||
| 66 | void luaX_token2str (int token, char *s) { | 66 | void luaX_token2str (int token, char *s) { |
| 67 | if (token < 255) { | 67 | if (token < 256) { |
| 68 | s[0] = (char)token; | 68 | s[0] = (char)token; |
| 69 | s[1] = '\0'; | 69 | s[1] = '\0'; |
| 70 | } | 70 | } |
| @@ -225,7 +225,7 @@ static void inclinenumber (lua_State *L, LexState *LS) { | |||
| 225 | 225 | ||
| 226 | /* | 226 | /* |
| 227 | ** ======================================================= | 227 | ** ======================================================= |
| 228 | ** LEXICAL ANALIZER | 228 | ** LEXICAL ANALYZER |
| 229 | ** ======================================================= | 229 | ** ======================================================= |
| 230 | */ | 230 | */ |
| 231 | 231 | ||
| @@ -407,7 +407,7 @@ int luaX_lex (LexState *LS) { | |||
| 407 | } | 407 | } |
| 408 | save(L, '\0'); | 408 | save(L, '\0'); |
| 409 | if (!luaO_str2d(L->Mbuffer+L->Mbuffbase, &LS->seminfo.r)) | 409 | if (!luaO_str2d(L->Mbuffer+L->Mbuffbase, &LS->seminfo.r)) |
| 410 | luaX_error(LS, "invalid numeric format"); | 410 | luaX_error(LS, "malformed number"); |
| 411 | return NUMBER; | 411 | return NUMBER; |
| 412 | 412 | ||
| 413 | case EOZ: | 413 | case EOZ: |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lmathlib.c,v 1.20 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: lmathlib.c,v 1.21 1999/11/22 17:39:51 roberto Exp roberto $ |
| 3 | ** Lua standard mathematical library | 3 | ** Lua standard mathematical library |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -144,7 +144,7 @@ static void math_max (lua_State *L) { | |||
| 144 | 144 | ||
| 145 | static void math_random (lua_State *L) { | 145 | static void math_random (lua_State *L) { |
| 146 | /* the '%' avoids the (rare) case of r==1, and is needed also because on | 146 | /* the '%' avoids the (rare) case of r==1, and is needed also because on |
| 147 | some systems (SunOS!) "rand()" may return a value bigger than RAND_MAX */ | 147 | some systems (SunOS!) "rand()" may return a value larger than RAND_MAX */ |
| 148 | double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; | 148 | double r = (double)(rand()%RAND_MAX) / (double)RAND_MAX; |
| 149 | if (lua_getparam(L, 1) == LUA_NOOBJECT) /* no arguments? */ | 149 | if (lua_getparam(L, 1) == LUA_NOOBJECT) /* no arguments? */ |
| 150 | lua_pushnumber(L, r); /* real between 0 & 1 */ | 150 | lua_pushnumber(L, r); /* real between 0 & 1 */ |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lmem.c,v 1.20 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: lmem.c,v 1.21 1999/11/29 16:38:48 roberto Exp roberto $ |
| 3 | ** Interface to Memory Manager | 3 | ** Interface to Memory Manager |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -31,10 +31,10 @@ void *luaM_growaux (lua_State *L, void *block, unsigned long nelems, | |||
| 31 | int inc, int size, const char *errormsg, unsigned long limit) { | 31 | int inc, int size, const char *errormsg, unsigned long limit) { |
| 32 | unsigned long newn = nelems+inc; | 32 | unsigned long newn = nelems+inc; |
| 33 | if (newn >= limit) lua_error(L, errormsg); | 33 | if (newn >= limit) lua_error(L, errormsg); |
| 34 | if ((newn ^ nelems) <= nelems || /* still the same power of 2 limit? */ | 34 | if ((newn ^ nelems) <= nelems || /* still the same power-of-2 limit? */ |
| 35 | (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ | 35 | (nelems > 0 && newn < MINPOWER2)) /* or block already is MINPOWER2? */ |
| 36 | return block; /* do not need to reallocate */ | 36 | return block; /* do not need to reallocate */ |
| 37 | else /* it crossed a power of 2 boundary; grow to next power */ | 37 | else /* it crossed a power-of-2 boundary; grow to next power */ |
| 38 | return luaM_realloc(L, block, luaO_power2(newn)*size); | 38 | return luaM_realloc(L, block, luaO_power2(newn)*size); |
| 39 | } | 39 | } |
| 40 | 40 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.c,v 1.25 1999/11/22 13:12:07 roberto Exp roberto $ | 2 | ** $Id: lobject.c,v 1.26 1999/11/26 18:59:20 roberto Exp roberto $ |
| 3 | ** Some generic functions over Lua objects | 3 | ** Some generic functions over Lua objects |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -23,7 +23,7 @@ const TObject luaO_nilobject = {LUA_T_NIL, {NULL}}; | |||
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | /* | 25 | /* |
| 26 | ** returns smaller power of 2 bigger than `n' (minimum is MINPOWER2) | 26 | ** returns smaller power of 2 larger than `n' (minimum is MINPOWER2) |
| 27 | */ | 27 | */ |
| 28 | unsigned long luaO_power2 (unsigned long n) { | 28 | unsigned long luaO_power2 (unsigned long n) { |
| 29 | unsigned long p = MINPOWER2; | 29 | unsigned long p = MINPOWER2; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lobject.h,v 1.38 1999/11/26 18:59:20 roberto Exp roberto $ | 2 | ** $Id: lobject.h,v 1.39 1999/12/02 16:24:45 roberto Exp roberto $ |
| 3 | ** Type definitions for Lua objects | 3 | ** Type definitions for Lua objects |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -197,7 +197,7 @@ typedef struct Hash { | |||
| 197 | 197 | ||
| 198 | extern const char *const luaO_typenames[]; | 198 | extern const char *const luaO_typenames[]; |
| 199 | 199 | ||
| 200 | #define luaO_typename(L, o) luaO_typenames[-ttype(o)] | 200 | #define luaO_typename(o) luaO_typenames[-ttype(o)] |
| 201 | 201 | ||
| 202 | #define MINPOWER2 4 /* minimum size for "growing" vectors */ | 202 | #define MINPOWER2 4 /* minimum size for "growing" vectors */ |
| 203 | 203 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lref.c,v 1.2 1999/11/10 15:37:50 roberto Exp roberto $ | 2 | ** $Id: lref.c,v 1.3 1999/11/22 13:12:07 roberto Exp roberto $ |
| 3 | ** REF mechanism | 3 | ** REF mechanism |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -7,15 +7,17 @@ | |||
| 7 | 7 | ||
| 8 | #define LUA_REENTRANT | 8 | #define LUA_REENTRANT |
| 9 | 9 | ||
| 10 | #include "lapi.h" | ||
| 10 | #include "lmem.h" | 11 | #include "lmem.h" |
| 11 | #include "lref.h" | 12 | #include "lref.h" |
| 12 | #include "lstate.h" | 13 | #include "lstate.h" |
| 13 | #include "lua.h" | 14 | #include "lua.h" |
| 14 | 15 | ||
| 15 | 16 | ||
| 16 | int luaR_ref (lua_State *L, const TObject *o, int lock) { | 17 | int lua_ref (lua_State *L, int lock) { |
| 17 | int ref; | 18 | int ref; |
| 18 | if (ttype(o) == LUA_T_NIL) | 19 | luaA_checkCparams(L, 1); |
| 20 | if (ttype(L->top-1) == LUA_T_NIL) | ||
| 19 | ref = LUA_REFNIL; | 21 | ref = LUA_REFNIL; |
| 20 | else { | 22 | else { |
| 21 | if (L->refFree != NONEXT) { /* is there a free place? */ | 23 | if (L->refFree != NONEXT) { /* is there a free place? */ |
| @@ -26,9 +28,10 @@ int luaR_ref (lua_State *L, const TObject *o, int lock) { | |||
| 26 | luaM_growvector(L, L->refArray, L->refSize, 1, struct ref, refEM, MAX_INT); | 28 | luaM_growvector(L, L->refArray, L->refSize, 1, struct ref, refEM, MAX_INT); |
| 27 | ref = L->refSize++; | 29 | ref = L->refSize++; |
| 28 | } | 30 | } |
| 29 | L->refArray[ref].o = *o; | 31 | L->refArray[ref].o = *(L->top-1); |
| 30 | L->refArray[ref].st = lock ? LOCK : HOLD; | 32 | L->refArray[ref].st = lock ? LOCK : HOLD; |
| 31 | } | 33 | } |
| 34 | L->top--; | ||
| 32 | return ref; | 35 | return ref; |
| 33 | } | 36 | } |
| 34 | 37 | ||
| @@ -43,17 +46,38 @@ void lua_unref (lua_State *L, int ref) { | |||
| 43 | } | 46 | } |
| 44 | 47 | ||
| 45 | 48 | ||
| 46 | const TObject *luaR_getref (lua_State *L, int ref) { | 49 | lua_Object lua_getref (lua_State *L, int ref) { |
| 47 | if (ref == LUA_REFNIL) | 50 | if (ref == LUA_REFNIL) |
| 48 | return &luaO_nilobject; | 51 | return luaA_putluaObject(L, &luaO_nilobject); |
| 49 | else if (0 <= ref && ref < L->refSize && | 52 | else if (0 <= ref && ref < L->refSize && |
| 50 | (L->refArray[ref].st == LOCK || L->refArray[ref].st == HOLD)) | 53 | (L->refArray[ref].st == LOCK || L->refArray[ref].st == HOLD)) |
| 51 | return &L->refArray[ref].o; | 54 | return luaA_putluaObject(L, &L->refArray[ref].o); |
| 52 | else | 55 | else |
| 53 | return NULL; | 56 | return LUA_NOOBJECT; |
| 54 | } | 57 | } |
| 55 | 58 | ||
| 56 | 59 | ||
| 60 | void lua_beginblock (lua_State *L) { | ||
| 61 | luaM_growvector(L, L->Cblocks, L->numCblocks, 1, struct C_Lua_Stack, | ||
| 62 | "too many nested blocks", L->stacksize); | ||
| 63 | L->Cblocks[L->numCblocks] = L->Cstack; | ||
| 64 | L->numCblocks++; | ||
| 65 | } | ||
| 66 | |||
| 67 | |||
| 68 | void lua_endblock (lua_State *L) { | ||
| 69 | if (L->numCblocks <= 0) | ||
| 70 | lua_error(L, "API error - no block to end"); | ||
| 71 | --L->numCblocks; | ||
| 72 | L->Cstack = L->Cblocks[L->numCblocks]; | ||
| 73 | L->top = L->Cstack.base; | ||
| 74 | } | ||
| 75 | |||
| 76 | |||
| 77 | |||
| 78 | |||
| 79 | |||
| 80 | |||
| 57 | static int ismarked (const TObject *o) { | 81 | static int ismarked (const TObject *o) { |
| 58 | /* valid only for locked objects */ | 82 | /* valid only for locked objects */ |
| 59 | switch (o->ttype) { | 83 | switch (o->ttype) { |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lref.h,v 1.2 1999/11/10 15:37:50 roberto Exp roberto $ | 2 | ** $Id: lref.h,v 1.3 1999/11/22 13:12:07 roberto Exp roberto $ |
| 3 | ** REF mechanism | 3 | ** REF mechanism |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -22,9 +22,6 @@ struct ref { | |||
| 22 | }; | 22 | }; |
| 23 | 23 | ||
| 24 | 24 | ||
| 25 | int luaR_ref (lua_State *L, const TObject *o, int lock); | ||
| 26 | const TObject *luaR_getref (lua_State *L, int ref); | ||
| 27 | void luaR_invalidaterefs (lua_State *L); | 25 | void luaR_invalidaterefs (lua_State *L); |
| 28 | 26 | ||
| 29 | |||
| 30 | #endif | 27 | #endif |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 1.71 1999/12/06 19:30:53 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.72 1999/12/09 20:01:48 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 | */ |
| @@ -64,7 +64,7 @@ int luaV_tostring (lua_State *L, TObject *obj) { /* LUA_NUMBER */ | |||
| 64 | if (ttype(obj) != LUA_T_NUMBER) | 64 | if (ttype(obj) != LUA_T_NUMBER) |
| 65 | return 1; | 65 | return 1; |
| 66 | else { | 66 | else { |
| 67 | char s[32]; /* 16 digits, signal, point and \0 (+ some extra...) */ | 67 | char s[32]; /* 16 digits, sign, point and \0 (+ some extra...) */ |
| 68 | sprintf(s, "%.16g", (double)nvalue(obj)); | 68 | sprintf(s, "%.16g", (double)nvalue(obj)); |
| 69 | tsvalue(obj) = luaS_new(L, s); | 69 | tsvalue(obj) = luaS_new(L, s); |
| 70 | ttype(obj) = LUA_T_STRING; | 70 | ttype(obj) = LUA_T_STRING; |
