diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-12-10 10:13:36 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2003-12-10 10:13:36 -0200 |
| commit | 47fc57a2529c83376883f36954082cfe80ae588f (patch) | |
| tree | c2e57e2f9f7d78279144bfd9cbd04a3b1b131f12 /lapi.c | |
| parent | 4d5fe1f54bc00850f77a7c42f9e95d0ff3f1ab5b (diff) | |
| download | lua-47fc57a2529c83376883f36954082cfe80ae588f.tar.gz lua-47fc57a2529c83376883f36954082cfe80ae588f.tar.bz2 lua-47fc57a2529c83376883f36954082cfe80ae588f.zip | |
`TObject' renamed to `TValue' + other name changes and better assertions
for incremental garbage collection
Diffstat (limited to 'lapi.c')
| -rw-r--r-- | lapi.c | 111 |
1 files changed, 56 insertions, 55 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 1.250 2003/12/01 18:22:56 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 1.251 2003/12/09 16:56:11 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 | */ |
| @@ -41,7 +41,7 @@ const char lua_ident[] = | |||
| 41 | 41 | ||
| 42 | 42 | ||
| 43 | #ifndef api_check | 43 | #ifndef api_check |
| 44 | #define api_check(L, o) /*{ assert(o); }*/ | 44 | #define api_check(L, o) lua_assert(o) |
| 45 | #endif | 45 | #endif |
| 46 | 46 | ||
| 47 | #define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) | 47 | #define api_checknelems(L, n) api_check(L, (n) <= (L->top - L->base)) |
| @@ -52,11 +52,11 @@ const char lua_ident[] = | |||
| 52 | 52 | ||
| 53 | 53 | ||
| 54 | 54 | ||
| 55 | static TObject *luaA_index (lua_State *L, int idx) { | 55 | static TValue *luaA_index (lua_State *L, int idx) { |
| 56 | if (idx > 0) { | 56 | if (idx > 0) { |
| 57 | TObject *o = L->base + (idx - 1); | 57 | TValue *o = L->base + (idx - 1); |
| 58 | api_check(L, idx <= L->stack_last - L->base); | 58 | api_check(L, idx <= L->stack_last - L->base); |
| 59 | if (o >= L->top) return cast(TObject *, &luaO_nilobject); | 59 | if (o >= L->top) return cast(TValue *, &luaO_nilobject); |
| 60 | else return o; | 60 | else return o; |
| 61 | } | 61 | } |
| 62 | else if (idx > LUA_REGISTRYINDEX) { | 62 | else if (idx > LUA_REGISTRYINDEX) { |
| @@ -67,19 +67,19 @@ static TObject *luaA_index (lua_State *L, int idx) { | |||
| 67 | case LUA_REGISTRYINDEX: return registry(L); | 67 | case LUA_REGISTRYINDEX: return registry(L); |
| 68 | case LUA_GLOBALSINDEX: return gt(L); | 68 | case LUA_GLOBALSINDEX: return gt(L); |
| 69 | default: { | 69 | default: { |
| 70 | TObject *func = (L->base - 1); | 70 | TValue *func = (L->base - 1); |
| 71 | idx = LUA_GLOBALSINDEX - idx; | 71 | idx = LUA_GLOBALSINDEX - idx; |
| 72 | lua_assert(iscfunction(func)); | 72 | lua_assert(iscfunction(func)); |
| 73 | return (idx <= clvalue(func)->c.nupvalues) | 73 | return (idx <= clvalue(func)->c.nupvalues) |
| 74 | ? &clvalue(func)->c.upvalue[idx-1] | 74 | ? &clvalue(func)->c.upvalue[idx-1] |
| 75 | : cast(TObject *, &luaO_nilobject); | 75 | : cast(TValue *, &luaO_nilobject); |
| 76 | } | 76 | } |
| 77 | } | 77 | } |
| 78 | } | 78 | } |
| 79 | 79 | ||
| 80 | 80 | ||
| 81 | void luaA_pushobject (lua_State *L, const TObject *o) { | 81 | void luaA_pushobject (lua_State *L, const TValue *o) { |
| 82 | setobj2s(L->top, o); | 82 | setobj2s(L, L->top, o); |
| 83 | incr_top(L); | 83 | incr_top(L); |
| 84 | } | 84 | } |
| 85 | 85 | ||
| @@ -107,7 +107,7 @@ LUA_API void lua_xmove (lua_State *from, lua_State *to, int n) { | |||
| 107 | api_checknelems(from, n); | 107 | api_checknelems(from, n); |
| 108 | from->top -= n; | 108 | from->top -= n; |
| 109 | for (i = 0; i < n; i++) { | 109 | for (i = 0; i < n; i++) { |
| 110 | setobj2s(to->top, from->top + i); | 110 | setobj2s(to, to->top, from->top + i); |
| 111 | api_incr_top(to); | 111 | api_incr_top(to); |
| 112 | } | 112 | } |
| 113 | lua_unlock(to); | 113 | lua_unlock(to); |
| @@ -129,7 +129,7 @@ LUA_API lua_State *lua_newthread (lua_State *L) { | |||
| 129 | lua_lock(L); | 129 | lua_lock(L); |
| 130 | luaC_checkGC(L); | 130 | luaC_checkGC(L); |
| 131 | L1 = luaE_newthread(L); | 131 | L1 = luaE_newthread(L); |
| 132 | setthvalue(L->top, L1); | 132 | setthvalue(L, L->top, L1); |
| 133 | api_incr_top(L); | 133 | api_incr_top(L); |
| 134 | lua_unlock(L); | 134 | lua_unlock(L); |
| 135 | lua_userstateopen(L1); | 135 | lua_userstateopen(L1); |
| @@ -169,7 +169,7 @@ LUA_API void lua_remove (lua_State *L, int idx) { | |||
| 169 | lua_lock(L); | 169 | lua_lock(L); |
| 170 | p = luaA_index(L, idx); | 170 | p = luaA_index(L, idx); |
| 171 | api_checkvalidindex(L, p); | 171 | api_checkvalidindex(L, p); |
| 172 | while (++p < L->top) setobjs2s(p-1, p); | 172 | while (++p < L->top) setobjs2s(L, p-1, p); |
| 173 | L->top--; | 173 | L->top--; |
| 174 | lua_unlock(L); | 174 | lua_unlock(L); |
| 175 | } | 175 | } |
| @@ -181,8 +181,8 @@ LUA_API void lua_insert (lua_State *L, int idx) { | |||
| 181 | lua_lock(L); | 181 | lua_lock(L); |
| 182 | p = luaA_index(L, idx); | 182 | p = luaA_index(L, idx); |
| 183 | api_checkvalidindex(L, p); | 183 | api_checkvalidindex(L, p); |
| 184 | for (q = L->top; q>p; q--) setobjs2s(q, q-1); | 184 | for (q = L->top; q>p; q--) setobjs2s(L, q, q-1); |
| 185 | setobjs2s(p, L->top); | 185 | setobjs2s(L, p, L->top); |
| 186 | lua_unlock(L); | 186 | lua_unlock(L); |
| 187 | } | 187 | } |
| 188 | 188 | ||
| @@ -193,7 +193,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { | |||
| 193 | api_checknelems(L, 1); | 193 | api_checknelems(L, 1); |
| 194 | o = luaA_index(L, idx); | 194 | o = luaA_index(L, idx); |
| 195 | api_checkvalidindex(L, o); | 195 | api_checkvalidindex(L, o); |
| 196 | setobj(o, L->top - 1); /* write barrier???? */ | 196 | setobj(L, o, L->top - 1); /* write barrier???? */ |
| 197 | L->top--; | 197 | L->top--; |
| 198 | lua_unlock(L); | 198 | lua_unlock(L); |
| 199 | } | 199 | } |
| @@ -201,7 +201,7 @@ LUA_API void lua_replace (lua_State *L, int idx) { | |||
| 201 | 201 | ||
| 202 | LUA_API void lua_pushvalue (lua_State *L, int idx) { | 202 | LUA_API void lua_pushvalue (lua_State *L, int idx) { |
| 203 | lua_lock(L); | 203 | lua_lock(L); |
| 204 | setobj2s(L->top, luaA_index(L, idx)); | 204 | setobj2s(L, L->top, luaA_index(L, idx)); |
| 205 | api_incr_top(L); | 205 | api_incr_top(L); |
| 206 | lua_unlock(L); | 206 | lua_unlock(L); |
| 207 | } | 207 | } |
| @@ -232,8 +232,8 @@ LUA_API int lua_iscfunction (lua_State *L, int idx) { | |||
| 232 | 232 | ||
| 233 | 233 | ||
| 234 | LUA_API int lua_isnumber (lua_State *L, int idx) { | 234 | LUA_API int lua_isnumber (lua_State *L, int idx) { |
| 235 | TObject n; | 235 | TValue n; |
| 236 | const TObject *o = luaA_index(L, idx); | 236 | const TValue *o = luaA_index(L, idx); |
| 237 | return tonumber(o, &n); | 237 | return tonumber(o, &n); |
| 238 | } | 238 | } |
| 239 | 239 | ||
| @@ -245,7 +245,7 @@ LUA_API int lua_isstring (lua_State *L, int idx) { | |||
| 245 | 245 | ||
| 246 | 246 | ||
| 247 | LUA_API int lua_isuserdata (lua_State *L, int idx) { | 247 | LUA_API int lua_isuserdata (lua_State *L, int idx) { |
| 248 | const TObject *o = luaA_index(L, idx); | 248 | const TValue *o = luaA_index(L, idx); |
| 249 | return (ttisuserdata(o) || ttislightuserdata(o)); | 249 | return (ttisuserdata(o) || ttislightuserdata(o)); |
| 250 | } | 250 | } |
| 251 | 251 | ||
| @@ -286,8 +286,8 @@ LUA_API int lua_lessthan (lua_State *L, int index1, int index2) { | |||
| 286 | 286 | ||
| 287 | 287 | ||
| 288 | LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { | 288 | LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { |
| 289 | TObject n; | 289 | TValue n; |
| 290 | const TObject *o = luaA_index(L, idx); | 290 | const TValue *o = luaA_index(L, idx); |
| 291 | if (tonumber(o, &n)) | 291 | if (tonumber(o, &n)) |
| 292 | return nvalue(o); | 292 | return nvalue(o); |
| 293 | else | 293 | else |
| @@ -296,8 +296,8 @@ LUA_API lua_Number lua_tonumber (lua_State *L, int idx) { | |||
| 296 | 296 | ||
| 297 | 297 | ||
| 298 | LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { | 298 | LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { |
| 299 | TObject n; | 299 | TValue n; |
| 300 | const TObject *o = luaA_index(L, idx); | 300 | const TValue *o = luaA_index(L, idx); |
| 301 | if (tonumber(o, &n)) { | 301 | if (tonumber(o, &n)) { |
| 302 | lua_Integer res; | 302 | lua_Integer res; |
| 303 | lua_number2integer(res, nvalue(o)); | 303 | lua_number2integer(res, nvalue(o)); |
| @@ -309,7 +309,7 @@ LUA_API lua_Integer lua_tointeger (lua_State *L, int idx) { | |||
| 309 | 309 | ||
| 310 | 310 | ||
| 311 | LUA_API int lua_toboolean (lua_State *L, int idx) { | 311 | LUA_API int lua_toboolean (lua_State *L, int idx) { |
| 312 | const TObject *o = luaA_index(L, idx); | 312 | const TValue *o = luaA_index(L, idx); |
| 313 | return !l_isfalse(o); | 313 | return !l_isfalse(o); |
| 314 | } | 314 | } |
| 315 | 315 | ||
| @@ -332,11 +332,11 @@ LUA_API const char *lua_tostring (lua_State *L, int idx) { | |||
| 332 | LUA_API size_t lua_strlen (lua_State *L, int idx) { | 332 | LUA_API size_t lua_strlen (lua_State *L, int idx) { |
| 333 | StkId o = luaA_index(L, idx); | 333 | StkId o = luaA_index(L, idx); |
| 334 | if (ttisstring(o)) | 334 | if (ttisstring(o)) |
| 335 | return tsvalue(o)->tsv.len; | 335 | return tsvalue(o)->len; |
| 336 | else { | 336 | else { |
| 337 | size_t l; | 337 | size_t l; |
| 338 | lua_lock(L); /* `luaV_tostring' may create a new string */ | 338 | lua_lock(L); /* `luaV_tostring' may create a new string */ |
| 339 | l = (luaV_tostring(L, o) ? tsvalue(o)->tsv.len : 0); | 339 | l = (luaV_tostring(L, o) ? tsvalue(o)->len : 0); |
| 340 | lua_unlock(L); | 340 | lua_unlock(L); |
| 341 | return l; | 341 | return l; |
| 342 | } | 342 | } |
| @@ -352,7 +352,7 @@ LUA_API lua_CFunction lua_tocfunction (lua_State *L, int idx) { | |||
| 352 | LUA_API void *lua_touserdata (lua_State *L, int idx) { | 352 | LUA_API void *lua_touserdata (lua_State *L, int idx) { |
| 353 | StkId o = luaA_index(L, idx); | 353 | StkId o = luaA_index(L, idx); |
| 354 | switch (ttype(o)) { | 354 | switch (ttype(o)) { |
| 355 | case LUA_TUSERDATA: return (uvalue(o) + 1); | 355 | case LUA_TUSERDATA: return (rawuvalue(o) + 1); |
| 356 | case LUA_TLIGHTUSERDATA: return pvalue(o); | 356 | case LUA_TLIGHTUSERDATA: return pvalue(o); |
| 357 | default: return NULL; | 357 | default: return NULL; |
| 358 | } | 358 | } |
| @@ -412,7 +412,7 @@ LUA_API void lua_pushinteger (lua_State *L, lua_Integer n) { | |||
| 412 | LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { | 412 | LUA_API void lua_pushlstring (lua_State *L, const char *s, size_t len) { |
| 413 | lua_lock(L); | 413 | lua_lock(L); |
| 414 | luaC_checkGC(L); | 414 | luaC_checkGC(L); |
| 415 | setsvalue2s(L->top, luaS_newlstr(L, s, len)); | 415 | setsvalue2s(L, L->top, luaS_newlstr(L, s, len)); |
| 416 | api_incr_top(L); | 416 | api_incr_top(L); |
| 417 | lua_unlock(L); | 417 | lua_unlock(L); |
| 418 | } | 418 | } |
| @@ -459,8 +459,9 @@ LUA_API void lua_pushcclosure (lua_State *L, lua_CFunction fn, int n) { | |||
| 459 | cl->c.f = fn; | 459 | cl->c.f = fn; |
| 460 | L->top -= n; | 460 | L->top -= n; |
| 461 | while (n--) | 461 | while (n--) |
| 462 | setobj2n(&cl->c.upvalue[n], L->top+n); | 462 | setobj2n(L, &cl->c.upvalue[n], L->top+n); |
| 463 | setclvalue(L->top, cl); | 463 | setclvalue(L, L->top, cl); |
| 464 | lua_assert(iswhite(obj2gco(cl))); | ||
| 464 | api_incr_top(L); | 465 | api_incr_top(L); |
| 465 | lua_unlock(L); | 466 | lua_unlock(L); |
| 466 | } | 467 | } |
| @@ -500,11 +501,11 @@ LUA_API void lua_gettable (lua_State *L, int idx) { | |||
| 500 | 501 | ||
| 501 | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { | 502 | LUA_API void lua_getfield (lua_State *L, int idx, const char *k) { |
| 502 | StkId t; | 503 | StkId t; |
| 503 | TObject key; | 504 | TValue key; |
| 504 | lua_lock(L); | 505 | lua_lock(L); |
| 505 | t = luaA_index(L, idx); | 506 | t = luaA_index(L, idx); |
| 506 | api_checkvalidindex(L, t); | 507 | api_checkvalidindex(L, t); |
| 507 | setsvalue(&key, luaS_new(L, k)); | 508 | setsvalue(L, &key, luaS_new(L, k)); |
| 508 | luaV_gettable(L, t, &key, L->top); | 509 | luaV_gettable(L, t, &key, L->top); |
| 509 | api_incr_top(L); | 510 | api_incr_top(L); |
| 510 | lua_unlock(L); | 511 | lua_unlock(L); |
| @@ -516,7 +517,7 @@ LUA_API void lua_rawget (lua_State *L, int idx) { | |||
| 516 | lua_lock(L); | 517 | lua_lock(L); |
| 517 | t = luaA_index(L, idx); | 518 | t = luaA_index(L, idx); |
| 518 | api_check(L, ttistable(t)); | 519 | api_check(L, ttistable(t)); |
| 519 | setobj2s(L->top - 1, luaH_get(hvalue(t), L->top - 1)); | 520 | setobj2s(L, L->top - 1, luaH_get(hvalue(t), L->top - 1)); |
| 520 | lua_unlock(L); | 521 | lua_unlock(L); |
| 521 | } | 522 | } |
| 522 | 523 | ||
| @@ -526,7 +527,7 @@ LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { | |||
| 526 | lua_lock(L); | 527 | lua_lock(L); |
| 527 | o = luaA_index(L, idx); | 528 | o = luaA_index(L, idx); |
| 528 | api_check(L, ttistable(o)); | 529 | api_check(L, ttistable(o)); |
| 529 | setobj2s(L->top, luaH_getnum(hvalue(o), n)); | 530 | setobj2s(L, L->top, luaH_getnum(hvalue(o), n)); |
| 530 | api_incr_top(L); | 531 | api_incr_top(L); |
| 531 | lua_unlock(L); | 532 | lua_unlock(L); |
| 532 | } | 533 | } |
| @@ -535,14 +536,14 @@ LUA_API void lua_rawgeti (lua_State *L, int idx, int n) { | |||
| 535 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { | 536 | LUA_API void lua_createtable (lua_State *L, int narray, int nrec) { |
| 536 | lua_lock(L); | 537 | lua_lock(L); |
| 537 | luaC_checkGC(L); | 538 | luaC_checkGC(L); |
| 538 | sethvalue(L->top, luaH_new(L, narray, luaO_log2(nrec) + 1)); | 539 | sethvalue(L, L->top, luaH_new(L, narray, luaO_log2(nrec) + 1)); |
| 539 | api_incr_top(L); | 540 | api_incr_top(L); |
| 540 | lua_unlock(L); | 541 | lua_unlock(L); |
| 541 | } | 542 | } |
| 542 | 543 | ||
| 543 | 544 | ||
| 544 | LUA_API int lua_getmetatable (lua_State *L, int objindex) { | 545 | LUA_API int lua_getmetatable (lua_State *L, int objindex) { |
| 545 | const TObject *obj; | 546 | const TValue *obj; |
| 546 | Table *mt = NULL; | 547 | Table *mt = NULL; |
| 547 | int res; | 548 | int res; |
| 548 | lua_lock(L); | 549 | lua_lock(L); |
| @@ -552,13 +553,13 @@ LUA_API int lua_getmetatable (lua_State *L, int objindex) { | |||
| 552 | mt = hvalue(obj)->metatable; | 553 | mt = hvalue(obj)->metatable; |
| 553 | break; | 554 | break; |
| 554 | case LUA_TUSERDATA: | 555 | case LUA_TUSERDATA: |
| 555 | mt = uvalue(obj)->uv.metatable; | 556 | mt = uvalue(obj)->metatable; |
| 556 | break; | 557 | break; |
| 557 | } | 558 | } |
| 558 | if (mt == NULL) | 559 | if (mt == NULL) |
| 559 | res = 0; | 560 | res = 0; |
| 560 | else { | 561 | else { |
| 561 | sethvalue(L->top, mt); | 562 | sethvalue(L, L->top, mt); |
| 562 | api_incr_top(L); | 563 | api_incr_top(L); |
| 563 | res = 1; | 564 | res = 1; |
| 564 | } | 565 | } |
| @@ -572,7 +573,7 @@ LUA_API void lua_getfenv (lua_State *L, int idx) { | |||
| 572 | lua_lock(L); | 573 | lua_lock(L); |
| 573 | o = luaA_index(L, idx); | 574 | o = luaA_index(L, idx); |
| 574 | api_checkvalidindex(L, o); | 575 | api_checkvalidindex(L, o); |
| 575 | setobj2s(L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L)); | 576 | setobj2s(L, L->top, isLfunction(o) ? &clvalue(o)->l.g : gt(L)); |
| 576 | api_incr_top(L); | 577 | api_incr_top(L); |
| 577 | lua_unlock(L); | 578 | lua_unlock(L); |
| 578 | } | 579 | } |
| @@ -597,12 +598,12 @@ LUA_API void lua_settable (lua_State *L, int idx) { | |||
| 597 | 598 | ||
| 598 | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { | 599 | LUA_API void lua_setfield (lua_State *L, int idx, const char *k) { |
| 599 | StkId t; | 600 | StkId t; |
| 600 | TObject key; | 601 | TValue key; |
| 601 | lua_lock(L); | 602 | lua_lock(L); |
| 602 | api_checknelems(L, 1); | 603 | api_checknelems(L, 1); |
| 603 | t = luaA_index(L, idx); | 604 | t = luaA_index(L, idx); |
| 604 | api_checkvalidindex(L, t); | 605 | api_checkvalidindex(L, t); |
| 605 | setsvalue(&key, luaS_new(L, k)); | 606 | setsvalue(L, &key, luaS_new(L, k)); |
| 606 | luaV_settable(L, t, &key, L->top - 1); | 607 | luaV_settable(L, t, &key, L->top - 1); |
| 607 | L->top--; /* pop value */ | 608 | L->top--; /* pop value */ |
| 608 | lua_unlock(L); | 609 | lua_unlock(L); |
| @@ -615,7 +616,7 @@ LUA_API void lua_rawset (lua_State *L, int idx) { | |||
| 615 | api_checknelems(L, 2); | 616 | api_checknelems(L, 2); |
| 616 | t = luaA_index(L, idx); | 617 | t = luaA_index(L, idx); |
| 617 | api_check(L, ttistable(t)); | 618 | api_check(L, ttistable(t)); |
| 618 | setobj2t(luaH_set(L, hvalue(t), L->top-2), L->top-1); | 619 | setobj2t(L, luaH_set(L, hvalue(t), L->top-2), L->top-1); |
| 619 | luaC_barrier(L, hvalue(t), L->top-1); | 620 | luaC_barrier(L, hvalue(t), L->top-1); |
| 620 | L->top -= 2; | 621 | L->top -= 2; |
| 621 | lua_unlock(L); | 622 | lua_unlock(L); |
| @@ -628,7 +629,7 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) { | |||
| 628 | api_checknelems(L, 1); | 629 | api_checknelems(L, 1); |
| 629 | o = luaA_index(L, idx); | 630 | o = luaA_index(L, idx); |
| 630 | api_check(L, ttistable(o)); | 631 | api_check(L, ttistable(o)); |
| 631 | setobj2t(luaH_setnum(L, hvalue(o), n), L->top-1); | 632 | setobj2t(L, luaH_setnum(L, hvalue(o), n), L->top-1); |
| 632 | luaC_barrier(L, hvalue(o), L->top-1); | 633 | luaC_barrier(L, hvalue(o), L->top-1); |
| 633 | L->top--; | 634 | L->top--; |
| 634 | lua_unlock(L); | 635 | lua_unlock(L); |
| @@ -636,7 +637,7 @@ LUA_API void lua_rawseti (lua_State *L, int idx, int n) { | |||
| 636 | 637 | ||
| 637 | 638 | ||
| 638 | LUA_API int lua_setmetatable (lua_State *L, int objindex) { | 639 | LUA_API int lua_setmetatable (lua_State *L, int objindex) { |
| 639 | TObject *obj; | 640 | TValue *obj; |
| 640 | Table *mt; | 641 | Table *mt; |
| 641 | int res = 1; | 642 | int res = 1; |
| 642 | lua_lock(L); | 643 | lua_lock(L); |
| @@ -657,9 +658,9 @@ LUA_API int lua_setmetatable (lua_State *L, int objindex) { | |||
| 657 | break; | 658 | break; |
| 658 | } | 659 | } |
| 659 | case LUA_TUSERDATA: { | 660 | case LUA_TUSERDATA: { |
| 660 | uvalue(obj)->uv.metatable = mt; | 661 | uvalue(obj)->metatable = mt; |
| 661 | if (mt) | 662 | if (mt) |
| 662 | luaC_objbarrier(L, uvalue(obj), mt); | 663 | luaC_objbarrier(L, rawuvalue(obj), mt); |
| 663 | break; | 664 | break; |
| 664 | } | 665 | } |
| 665 | default: { | 666 | default: { |
| @@ -756,7 +757,7 @@ static void f_Ccall (lua_State *L, void *ud) { | |||
| 756 | Closure *cl; | 757 | Closure *cl; |
| 757 | cl = luaF_newCclosure(L, 0); | 758 | cl = luaF_newCclosure(L, 0); |
| 758 | cl->c.f = c->func; | 759 | cl->c.f = c->func; |
| 759 | setclvalue(L->top, cl); /* push function */ | 760 | setclvalue(L, L->top, cl); /* push function */ |
| 760 | incr_top(L); | 761 | incr_top(L); |
| 761 | setpvalue(L->top, c->ud); /* push only argument */ | 762 | setpvalue(L->top, c->ud); /* push only argument */ |
| 762 | incr_top(L); | 763 | incr_top(L); |
| @@ -791,7 +792,7 @@ LUA_API int lua_load (lua_State *L, lua_Chunkreader reader, void *data, | |||
| 791 | 792 | ||
| 792 | LUA_API int lua_dump (lua_State *L, lua_Chunkwriter writer, void *data) { | 793 | LUA_API int lua_dump (lua_State *L, lua_Chunkwriter writer, void *data) { |
| 793 | int status; | 794 | int status; |
| 794 | TObject *o; | 795 | TValue *o; |
| 795 | lua_lock(L); | 796 | lua_lock(L); |
| 796 | api_checknelems(L, 1); | 797 | api_checknelems(L, 1); |
| 797 | o = L->top - 1; | 798 | o = L->top - 1; |
| @@ -885,7 +886,7 @@ LUA_API void lua_concat (lua_State *L, int n) { | |||
| 885 | L->top -= (n-1); | 886 | L->top -= (n-1); |
| 886 | } | 887 | } |
| 887 | else if (n == 0) { /* push empty string */ | 888 | else if (n == 0) { /* push empty string */ |
| 888 | setsvalue2s(L->top, luaS_newlstr(L, NULL, 0)); | 889 | setsvalue2s(L, L->top, luaS_newlstr(L, NULL, 0)); |
| 889 | api_incr_top(L); | 890 | api_incr_top(L); |
| 890 | } | 891 | } |
| 891 | /* else n == 1; nothing to do */ | 892 | /* else n == 1; nothing to do */ |
| @@ -904,7 +905,7 @@ LUA_API void *lua_newuserdata (lua_State *L, size_t size) { | |||
| 904 | lua_lock(L); | 905 | lua_lock(L); |
| 905 | luaC_checkGC(L); | 906 | luaC_checkGC(L); |
| 906 | u = luaS_newudata(L, size); | 907 | u = luaS_newudata(L, size); |
| 907 | setuvalue(L->top, u); | 908 | setuvalue(L, L->top, u); |
| 908 | api_incr_top(L); | 909 | api_incr_top(L); |
| 909 | lua_unlock(L); | 910 | lua_unlock(L); |
| 910 | return u + 1; | 911 | return u + 1; |
| @@ -913,7 +914,7 @@ LUA_API void *lua_newuserdata (lua_State *L, size_t size) { | |||
| 913 | 914 | ||
| 914 | 915 | ||
| 915 | 916 | ||
| 916 | static const char *aux_upvalue (lua_State *L, StkId fi, int n, TObject **val) { | 917 | static const char *aux_upvalue (lua_State *L, StkId fi, int n, TValue **val) { |
| 917 | Closure *f; | 918 | Closure *f; |
| 918 | if (!ttisfunction(fi)) return NULL; | 919 | if (!ttisfunction(fi)) return NULL; |
| 919 | f = clvalue(fi); | 920 | f = clvalue(fi); |
| @@ -933,11 +934,11 @@ static const char *aux_upvalue (lua_State *L, StkId fi, int n, TObject **val) { | |||
| 933 | 934 | ||
| 934 | LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { | 935 | LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { |
| 935 | const char *name; | 936 | const char *name; |
| 936 | TObject *val; | 937 | TValue *val; |
| 937 | lua_lock(L); | 938 | lua_lock(L); |
| 938 | name = aux_upvalue(L, luaA_index(L, funcindex), n, &val); | 939 | name = aux_upvalue(L, luaA_index(L, funcindex), n, &val); |
| 939 | if (name) { | 940 | if (name) { |
| 940 | setobj2s(L->top, val); | 941 | setobj2s(L, L->top, val); |
| 941 | api_incr_top(L); | 942 | api_incr_top(L); |
| 942 | } | 943 | } |
| 943 | lua_unlock(L); | 944 | lua_unlock(L); |
| @@ -947,7 +948,7 @@ LUA_API const char *lua_getupvalue (lua_State *L, int funcindex, int n) { | |||
| 947 | 948 | ||
| 948 | LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { | 949 | LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { |
| 949 | const char *name; | 950 | const char *name; |
| 950 | TObject *val; | 951 | TValue *val; |
| 951 | StkId fi; | 952 | StkId fi; |
| 952 | lua_lock(L); | 953 | lua_lock(L); |
| 953 | fi = luaA_index(L, funcindex); | 954 | fi = luaA_index(L, funcindex); |
| @@ -955,7 +956,7 @@ LUA_API const char *lua_setupvalue (lua_State *L, int funcindex, int n) { | |||
| 955 | name = aux_upvalue(L, fi, n, &val); | 956 | name = aux_upvalue(L, fi, n, &val); |
| 956 | if (name) { | 957 | if (name) { |
| 957 | L->top--; | 958 | L->top--; |
| 958 | setobj(val, L->top); | 959 | setobj(L, val, L->top); |
| 959 | luaC_barrier(L, clvalue(fi), L->top); | 960 | luaC_barrier(L, clvalue(fi), L->top); |
| 960 | } | 961 | } |
| 961 | lua_unlock(L); | 962 | lua_unlock(L); |
