diff options
Diffstat (limited to 'lvm.c')
-rw-r--r-- | lvm.c | 17 |
1 files changed, 11 insertions, 6 deletions
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | ** $Id: lvm.c,v 1.289 2003/07/16 20:49:02 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 1.290 2003/10/27 19:14:31 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 | */ |
@@ -151,7 +151,8 @@ void luaV_settable (lua_State *L, const TObject *t, TObject *key, StkId val) { | |||
151 | TObject *oldval = luaH_set(L, h, key); /* do a primitive set */ | 151 | TObject *oldval = luaH_set(L, h, key); /* do a primitive set */ |
152 | if (!ttisnil(oldval) || /* result is no nil? */ | 152 | if (!ttisnil(oldval) || /* result is no nil? */ |
153 | (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ | 153 | (tm = fasttm(L, h->metatable, TM_NEWINDEX)) == NULL) { /* or no TM? */ |
154 | setobj2t(oldval, val); /* write barrier */ | 154 | setobj2t(oldval, val); |
155 | luaC_barrier(L, h, val); | ||
155 | return; | 156 | return; |
156 | } | 157 | } |
157 | /* else will try the tag method */ | 158 | /* else will try the tag method */ |
@@ -454,8 +455,9 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
454 | break; | 455 | break; |
455 | } | 456 | } |
456 | case OP_SETUPVAL: { | 457 | case OP_SETUPVAL: { |
457 | int b = GETARG_B(i); | 458 | UpVal *uv = cl->upvals[GETARG_B(i)]; |
458 | setobj(cl->upvals[b]->v, ra); /* write barrier */ | 459 | setobj(uv->v, ra); |
460 | luaC_barrier(L, uv, ra); | ||
459 | break; | 461 | break; |
460 | } | 462 | } |
461 | case OP_SETTABLE: { | 463 | case OP_SETTABLE: { |
@@ -713,8 +715,11 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
713 | L->top = L->ci->top; | 715 | L->top = L->ci->top; |
714 | } | 716 | } |
715 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ | 717 | bc &= ~(LFIELDS_PER_FLUSH-1); /* bc = bc - bc%FPF */ |
716 | for (; n > 0; n--) | 718 | for (; n > 0; n--) { |
717 | setobj2t(luaH_setnum(L, h, bc+n), ra+n); /* write barrier */ | 719 | TObject *val = ra+n; |
720 | setobj2t(luaH_setnum(L, h, bc+n), val); | ||
721 | luaC_barrier(L, h, val); | ||
722 | } | ||
718 | break; | 723 | break; |
719 | } | 724 | } |
720 | case OP_CLOSE: { | 725 | case OP_CLOSE: { |