diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-29 18:22:22 -0200 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2001-11-29 18:22:22 -0200 |
| commit | 413fc7334bf8ceaea71417d73edef15c99d3a793 (patch) | |
| tree | 50e762d979ad8e80681902cdeb8aa42b041ae323 /lvm.c | |
| parent | fca0a12e23f964006ce43d35ab86b27c6bbb0a48 (diff) | |
| download | lua-413fc7334bf8ceaea71417d73edef15c99d3a793.tar.gz lua-413fc7334bf8ceaea71417d73edef15c99d3a793.tar.bz2 lua-413fc7334bf8ceaea71417d73edef15c99d3a793.zip | |
new implementation for lua upvalues (sugested by E.T.): simpler and solves
a bug for multi-stacks
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 9 |
1 files changed, 3 insertions, 6 deletions
| @@ -390,8 +390,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
| 390 | } | 390 | } |
| 391 | case OP_GETUPVAL: { | 391 | case OP_GETUPVAL: { |
| 392 | int b = GETARG_B(i); | 392 | int b = GETARG_B(i); |
| 393 | lua_assert(isclosed(cl->upvals[b]) || cl->upvals[b] < base); | 393 | setobj(ra, cl->upvals[b]->v); |
| 394 | setobj(ra, cl->upvals[b]); | ||
| 395 | break; | 394 | break; |
| 396 | } | 395 | } |
| 397 | case OP_GETGLOBAL: { | 396 | case OP_GETGLOBAL: { |
| @@ -410,8 +409,7 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
| 410 | } | 409 | } |
| 411 | case OP_SETUPVAL: { | 410 | case OP_SETUPVAL: { |
| 412 | int b = GETARG_B(i); | 411 | int b = GETARG_B(i); |
| 413 | lua_assert(isclosed(cl->upvals[b]) || cl->upvals[b] < base); | 412 | setobj(cl->upvals[b]->v, ra); |
| 414 | setobj(cl->upvals[b], ra); | ||
| 415 | break; | 413 | break; |
| 416 | } | 414 | } |
| 417 | case OP_SETTABLE: { | 415 | case OP_SETTABLE: { |
| @@ -648,10 +646,9 @@ StkId luaV_execute (lua_State *L, const LClosure *cl, StkId base) { | |||
| 648 | ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)]; | 646 | ncl->l.upvals[j] = cl->upvals[GETARG_B(*pc)]; |
| 649 | else { | 647 | else { |
| 650 | lua_assert(GET_OPCODE(*pc) == OP_MOVE); | 648 | lua_assert(GET_OPCODE(*pc) == OP_MOVE); |
| 651 | ncl->l.upvals[j] = base + GETARG_B(*pc); | 649 | ncl->l.upvals[j] = luaF_findupval(L, base + GETARG_B(*pc)); |
| 652 | } | 650 | } |
| 653 | } | 651 | } |
| 654 | luaF_LConlist(L, ncl); | ||
| 655 | setclvalue(ra, ncl); | 652 | setclvalue(ra, ncl); |
| 656 | break; | 653 | break; |
| 657 | } | 654 | } |
