diff options
Diffstat (limited to '')
| -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: { |
