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 /lapi.c | |
| parent | e6d56cd2d844174bd40af4c44c0f68e2115e5876 (diff) | |
| download | lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.tar.gz lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.tar.bz2 lua-1b15206cf9aa7005fc3d48f78f60f66838f10eb5.zip | |
many details + code redistribution
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 245 |
1 files changed, 29 insertions, 216 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 | |||
