diff options
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 79 |
1 files changed, 42 insertions, 37 deletions
| @@ -64,8 +64,8 @@ int luaV_tostring (lua_State *L, TObject *obj) { | |||
| 64 | 64 | ||
| 65 | static void traceexec (lua_State *L, lua_Hook linehook) { | 65 | static void traceexec (lua_State *L, lua_Hook linehook) { |
| 66 | CallInfo *ci = L->ci; | 66 | CallInfo *ci = L->ci; |
| 67 | int *lineinfo = ci_func(ci)->f.l->lineinfo; | 67 | int *lineinfo = ci_func(ci)->u.l.p->lineinfo; |
| 68 | int pc = (*ci->pc - ci_func(ci)->f.l->code) - 1; | 68 | int pc = (*ci->pc - ci_func(ci)->u.l.p->code) - 1; |
| 69 | int newline; | 69 | int newline; |
| 70 | if (pc == 0) { /* may be first time? */ | 70 | if (pc == 0) { /* may be first time? */ |
| 71 | ci->line = 1; | 71 | ci->line = 1; |
| @@ -82,30 +82,6 @@ static void traceexec (lua_State *L, lua_Hook linehook) { | |||
| 82 | } | 82 | } |
| 83 | 83 | ||
| 84 | 84 | ||
| 85 | static Closure *luaV_closure (lua_State *L, int nelems) { | ||
| 86 | Closure *c = luaF_newclosure(L, nelems); | ||
| 87 | L->top -= nelems; | ||
| 88 | while (nelems--) | ||
| 89 | setobj(&c->upvalue[nelems], L->top+nelems); | ||
| 90 | setclvalue(L->top, c); | ||
| 91 | incr_top; | ||
| 92 | return c; | ||
| 93 | } | ||
| 94 | |||
| 95 | |||
| 96 | void luaV_Cclosure (lua_State *L, lua_CFunction c, int nelems) { | ||
| 97 | Closure *cl = luaV_closure(L, nelems); | ||
| 98 | cl->f.c = c; | ||
| 99 | cl->isC = 1; | ||
| 100 | } | ||
| 101 | |||
| 102 | |||
| 103 | void luaV_Lclosure (lua_State *L, Proto *l, int nelems) { | ||
| 104 | Closure *cl = luaV_closure(L, nelems); | ||
| 105 | cl->f.l = l; | ||
| 106 | cl->isC = 0; | ||
| 107 | } | ||
| 108 | |||
| 109 | 85 | ||
| 110 | /* maximum stack used by a call to a tag method (func + args) */ | 86 | /* maximum stack used by a call to a tag method (func + args) */ |
| 111 | #define MAXSTACK_TM 4 | 87 | #define MAXSTACK_TM 4 |
| @@ -376,7 +352,7 @@ static void adjust_varargs (lua_State *L, StkId base, int nfixargs) { | |||
| 376 | ** Returns n such that the the results are between [n,top). | 352 | ** Returns n such that the the results are between [n,top). |
| 377 | */ | 353 | */ |
| 378 | StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | 354 | StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { |
| 379 | const Proto *const tf = cl->f.l; | 355 | const Proto *const tf = cl->u.l.p; |
| 380 | const Instruction *pc; | 356 | const Instruction *pc; |
| 381 | lua_Hook linehook; | 357 | lua_Hook linehook; |
| 382 | if (tf->is_vararg) /* varargs? */ | 358 | if (tf->is_vararg) /* varargs? */ |
| @@ -406,10 +382,6 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 406 | setnvalue(ra, (lua_Number)GETARG_sBc(i)); | 382 | setnvalue(ra, (lua_Number)GETARG_sBc(i)); |
| 407 | break; | 383 | break; |
| 408 | } | 384 | } |
| 409 | case OP_LOADUPVAL: { | ||
| 410 | setobj(ra, cl->upvalue+GETARG_Bc(i)); | ||
| 411 | break; | ||
| 412 | } | ||
| 413 | case OP_LOADNIL: { | 385 | case OP_LOADNIL: { |
| 414 | TObject *rb = RB(i); | 386 | TObject *rb = RB(i); |
| 415 | do { | 387 | do { |
| @@ -417,6 +389,12 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 417 | } while (rb >= ra); | 389 | } while (rb >= ra); |
| 418 | break; | 390 | break; |
| 419 | } | 391 | } |
| 392 | case OP_GETUPVAL: { | ||
| 393 | int b = GETARG_B(i); | ||
| 394 | lua_assert(luaF_isclosed(cl, b) || cl->u.l.upvals[b] < base); | ||
| 395 | setobj(ra, cl->u.l.upvals[b]); | ||
| 396 | break; | ||
| 397 | } | ||
| 420 | case OP_GETGLOBAL: { | 398 | case OP_GETGLOBAL: { |
| 421 | lua_assert(ttype(KBc(i)) == LUA_TSTRING); | 399 | lua_assert(ttype(KBc(i)) == LUA_TSTRING); |
| 422 | luaV_getglobal(L, tsvalue(KBc(i)), ra); | 400 | luaV_getglobal(L, tsvalue(KBc(i)), ra); |
| @@ -431,6 +409,12 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 431 | luaV_setglobal(L, tsvalue(KBc(i)), ra); | 409 | luaV_setglobal(L, tsvalue(KBc(i)), ra); |
| 432 | break; | 410 | break; |
| 433 | } | 411 | } |
| 412 | case OP_SETUPVAL: { | ||
| 413 | int b = GETARG_B(i); | ||
| 414 | lua_assert(luaF_isclosed(cl, b) || cl->u.l.upvals[b] < base); | ||
| 415 | setobj(cl->u.l.upvals[b], ra); | ||
| 416 | break; | ||
| 417 | } | ||
| 434 | case OP_SETTABLE: { | 418 | case OP_SETTABLE: { |
| 435 | luaV_settable(L, RB(i), RKC(i), ra); | 419 | luaV_settable(L, RB(i), RKC(i), ra); |
| 436 | break; | 420 | break; |
| @@ -646,13 +630,34 @@ StkId luaV_execute (lua_State *L, const Closure *cl, StkId base) { | |||
| 646 | luaH_setnum(L, h, bc+n, ra+n); | 630 | luaH_setnum(L, h, bc+n, ra+n); |
| 647 | break; | 631 | break; |
| 648 | } | 632 | } |
| 633 | case OP_CLOSE: { | ||
| 634 | luaF_close(L, ra); | ||
| 635 | break; | ||
| 636 | } | ||
| 649 | case OP_CLOSURE: { | 637 | case OP_CLOSURE: { |
| 650 | Proto *p = tf->p[GETARG_Bc(i)]; | 638 | Proto *p; |
| 651 | int nup = p->nupvalues; | 639 | Closure *ncl; |
| 652 | luaV_checkGC(L, ra+nup); | 640 | int nup, j; |
| 653 | L->top = ra+nup; | 641 | luaV_checkGC(L, L->top); |
| 654 | luaV_Lclosure(L, p, nup); | 642 | p = tf->p[GETARG_Bc(i)]; |
| 655 | L->top = base + tf->maxstacksize; | 643 | nup = p->nupvalues; |
| 644 | ncl = luaF_newLclosure(L, nup); | ||
| 645 | ncl->u.l.p = p; | ||
| 646 | for (j=0; j<nup; j++, pc++) { | ||
| 647 | if (GET_OPCODE(*pc) == OP_GETUPVAL) { | ||
| 648 | int n = GETARG_B(*pc); | ||
| 649 | if (!luaF_isclosed(cl, n)) | ||
| 650 | luaF_openentry(ncl, j); | ||
| 651 | ncl->u.l.upvals[j] = cl->u.l.upvals[n]; | ||
| 652 | } | ||
| 653 | else { | ||
| 654 | lua_assert(GET_OPCODE(*pc) == OP_MOVE); | ||
| 655 | luaF_openentry(ncl, j); | ||
| 656 | ncl->u.l.upvals[j] = base + GETARG_B(*pc); | ||
| 657 | } | ||
| 658 | } | ||
| 659 | luaF_LConlist(L, ncl); | ||
| 660 | setclvalue(ra, ncl); | ||
| 656 | break; | 661 | break; |
| 657 | } | 662 | } |
| 658 | } | 663 | } |
