diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-03-23 14:07:34 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2004-03-23 14:07:34 -0300 |
| commit | 21bc05c920e6289d6d6e1de5c3c8f0eb64e60fb2 (patch) | |
| tree | 90eb568edbb8a2339f0a2ffa5da8e0c0b43ea49d | |
| parent | 29a13b4128caccca1c7796a1252cb04d4e8a0569 (diff) | |
| download | lua-21bc05c920e6289d6d6e1de5c3c8f0eb64e60fb2.tar.gz lua-21bc05c920e6289d6d6e1de5c3c8f0eb64e60fb2.tar.bz2 lua-21bc05c920e6289d6d6e1de5c3c8f0eb64e60fb2.zip | |
write barrier for C upvalues
| -rw-r--r-- | lapi.c | 13 |
1 files changed, 7 insertions, 6 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lapi.c,v 2.3 2004/02/20 16:01:05 roberto Exp roberto $ | 2 | ** $Id: lapi.c,v 2.4 2004/03/09 17:34:35 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 | */ |
| @@ -68,11 +68,10 @@ static TValue *luaA_index (lua_State *L, int idx) { | |||
| 68 | case LUA_REGISTRYINDEX: return registry(L); | 68 | case LUA_REGISTRYINDEX: return registry(L); |
| 69 | case LUA_GLOBALSINDEX: return gt(L); | 69 | case LUA_GLOBALSINDEX: return gt(L); |
| 70 | default: { | 70 | default: { |
| 71 | TValue *func = (L->base - 1); | 71 | Closure *func = curr_func(L); |
| 72 | idx = LUA_GLOBALSINDEX - idx; | 72 | idx = LUA_GLOBALSINDEX - idx; |
| 73 | lua_assert(iscfunction(func)); | 73 | return (idx <= func->c.nupvalues) |
| 74 | return (idx <= clvalue(func)->c.nupvalues) | 74 | ? &func->c.upvalue[idx-1] |
| 75 | ? &clvalue(func)->c.upvalue[idx-1] | ||
| 76 | : cast(TValue *, &luaO_nilobject); | 75 | : cast(TValue *, &luaO_nilobject); |
| 77 | } | 76 | } |
| 78 | } | 77 | } |
| @@ -194,7 +193,9 @@ LUA_API void lua_replace (lua_State *L, int idx) { | |||
| 194 | api_checknelems(L, 1); | 193 | api_checknelems(L, 1); |
| 195 | o = luaA_index(L, idx); | 194 | o = luaA_index(L, idx); |
| 196 | api_checkvalidindex(L, o); | 195 | api_checkvalidindex(L, o); |
| 197 | setobj(L, o, L->top - 1); /* write barrier???? */ | 196 | setobj(L, o, L->top - 1); |
| 197 | if (idx < LUA_GLOBALSINDEX) /* function upvalue? */ | ||
| 198 | luaC_barrier(L, curr_func(L), L->top - 1); | ||
| 198 | L->top--; | 199 | L->top--; |
| 199 | lua_unlock(L); | 200 | lua_unlock(L); |
| 200 | } | 201 | } |
