diff options
Diffstat (limited to 'lvm.c')
| -rw-r--r-- | lvm.c | 39 |
1 files changed, 2 insertions, 37 deletions
| @@ -684,30 +684,8 @@ lua_Integer luaV_shiftl (lua_Integer x, lua_Integer y) { | |||
| 684 | 684 | ||
| 685 | 685 | ||
| 686 | /* | 686 | /* |
| 687 | ** check whether cached closure in prototype 'p' may be reused, that is, | ||
| 688 | ** whether there is a cached closure with the same upvalues needed by | ||
| 689 | ** new closure to be created. | ||
| 690 | */ | ||
| 691 | static LClosure *getcached (Proto *p, UpVal **encup, StkId base) { | ||
| 692 | LClosure *c = p->cache; | ||
| 693 | if (c != NULL) { /* is there a cached closure? */ | ||
| 694 | int nup = p->sizeupvalues; | ||
| 695 | Upvaldesc *uv = p->upvalues; | ||
| 696 | int i; | ||
| 697 | for (i = 0; i < nup; i++) { /* check whether it has right upvalues */ | ||
| 698 | TValue *v = uv[i].instack ? s2v(base + uv[i].idx) : encup[uv[i].idx]->v; | ||
| 699 | if (c->upvals[i]->v != v) | ||
| 700 | return NULL; /* wrong upvalue; cannot reuse closure */ | ||
| 701 | } | ||
| 702 | p->cachemiss = 0; /* got a hit */ | ||
| 703 | } | ||
| 704 | return c; /* return cached closure (or NULL if no cached closure) */ | ||
| 705 | } | ||
| 706 | |||
| 707 | |||
| 708 | /* | ||
| 709 | ** create a new Lua closure, push it in the stack, and initialize | 687 | ** create a new Lua closure, push it in the stack, and initialize |
| 710 | ** its upvalues. ??? | 688 | ** its upvalues. |
| 711 | */ | 689 | */ |
| 712 | static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, | 690 | static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, |
| 713 | StkId ra) { | 691 | StkId ra) { |
| @@ -724,13 +702,6 @@ static void pushclosure (lua_State *L, Proto *p, UpVal **encup, StkId base, | |||
| 724 | ncl->upvals[i] = encup[uv[i].idx]; | 702 | ncl->upvals[i] = encup[uv[i].idx]; |
| 725 | luaC_objbarrier(L, ncl, ncl->upvals[i]); | 703 | luaC_objbarrier(L, ncl, ncl->upvals[i]); |
| 726 | } | 704 | } |
| 727 | if (p->cachemiss >= MAXMISS) /* too many missings? */ | ||
| 728 | p->cache = NULL; /* give up cache */ | ||
| 729 | else { | ||
| 730 | p->cache = ncl; /* save it on cache for reuse */ | ||
| 731 | luaC_protobarrier(L, p, ncl); | ||
| 732 | p->cachemiss++; | ||
| 733 | } | ||
| 734 | } | 705 | } |
| 735 | 706 | ||
| 736 | 707 | ||
| @@ -1811,13 +1782,7 @@ void luaV_execute (lua_State *L, CallInfo *ci) { | |||
| 1811 | } | 1782 | } |
| 1812 | vmcase(OP_CLOSURE) { | 1783 | vmcase(OP_CLOSURE) { |
| 1813 | Proto *p = cl->p->p[GETARG_Bx(i)]; | 1784 | Proto *p = cl->p->p[GETARG_Bx(i)]; |
| 1814 | LClosure *ncl = getcached(p, cl->upvals, base); /* cached closure */ | 1785 | halfProtect(pushclosure(L, p, cl->upvals, base, ra)); |
| 1815 | if (ncl == NULL) { /* no match? */ | ||
| 1816 | savestate(L, ci); /* in case of allocation errors */ | ||
| 1817 | pushclosure(L, p, cl->upvals, base, ra); /* create a new one */ | ||
| 1818 | } | ||
| 1819 | else | ||
| 1820 | setclLvalue2s(L, ra, ncl); /* push cashed closure */ | ||
| 1821 | checkGC(L, ra + 1); | 1786 | checkGC(L, ra + 1); |
| 1822 | vmbreak; | 1787 | vmbreak; |
| 1823 | } | 1788 | } |
