diff options
| author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-04-05 10:41:29 -0300 |
|---|---|---|
| committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 2005-04-05 10:41:29 -0300 |
| commit | 7b6c3b463e835f4accd344e1de44a92e1c5dde62 (patch) | |
| tree | c7f380b508672b0b388b173d882a8ed1a04d8419 | |
| parent | 0316308c0d8ee9834641dacf81b43bcfd396095d (diff) | |
| download | lua-7b6c3b463e835f4accd344e1de44a92e1c5dde62.tar.gz lua-7b6c3b463e835f4accd344e1de44a92e1c5dde62.tar.bz2 lua-7b6c3b463e835f4accd344e1de44a92e1c5dde62.zip | |
small optimizations
| -rw-r--r-- | ldebug.c | 5 | ||||
| -rw-r--r-- | ldo.c | 7 | ||||
| -rw-r--r-- | lstate.c | 3 | ||||
| -rw-r--r-- | lstate.h | 3 | ||||
| -rw-r--r-- | lvm.c | 49 |
5 files changed, 33 insertions, 34 deletions
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldebug.c,v 2.12 2004/12/20 15:50:00 roberto Exp roberto $ | 2 | ** $Id: ldebug.c,v 2.13 2005/04/04 18:12:51 roberto Exp roberto $ |
| 3 | ** Debug Interface | 3 | ** Debug Interface |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -34,8 +34,9 @@ static const char *getfuncname (lua_State *L, CallInfo *ci, const char **name); | |||
| 34 | 34 | ||
| 35 | 35 | ||
| 36 | static int currentpc (lua_State *L, CallInfo *ci) { | 36 | static int currentpc (lua_State *L, CallInfo *ci) { |
| 37 | UNUSED(L); | ||
| 38 | if (!isLua(ci)) return -1; /* function is not a Lua function? */ | 37 | if (!isLua(ci)) return -1; /* function is not a Lua function? */ |
| 38 | if (ci == L->ci) | ||
| 39 | ci->savedpc = L->savedpc; | ||
| 39 | return pcRel(ci->savedpc, ci_func(ci)->l.p); | 40 | return pcRel(ci->savedpc, ci_func(ci)->l.p); |
| 40 | } | 41 | } |
| 41 | 42 | ||
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: ldo.c,v 2.20 2005/03/28 17:17:53 roberto Exp roberto $ | 2 | ** $Id: ldo.c,v 2.21 2005/03/29 16:20:48 roberto Exp roberto $ |
| 3 | ** Stack and Call structure of Lua | 3 | ** Stack and Call structure of Lua |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -253,6 +253,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 253 | func = tryfuncTM(L, func); /* check the `function' tag method */ | 253 | func = tryfuncTM(L, func); /* check the `function' tag method */ |
| 254 | funcr = savestack(L, func); | 254 | funcr = savestack(L, func); |
| 255 | cl = &clvalue(func)->l; | 255 | cl = &clvalue(func)->l; |
| 256 | L->ci->savedpc = L->savedpc; | ||
| 256 | if (!cl->isC) { /* Lua function? prepare its call */ | 257 | if (!cl->isC) { /* Lua function? prepare its call */ |
| 257 | CallInfo *ci; | 258 | CallInfo *ci; |
| 258 | StkId st, base; | 259 | StkId st, base; |
| @@ -273,7 +274,7 @@ int luaD_precall (lua_State *L, StkId func, int nresults) { | |||
| 273 | L->base = ci->base = base; | 274 | L->base = ci->base = base; |
| 274 | ci->top = L->base + p->maxstacksize; | 275 | ci->top = L->base + p->maxstacksize; |
| 275 | lua_assert(ci->top <= L->stack_last); | 276 | lua_assert(ci->top <= L->stack_last); |
| 276 | ci->savedpc = p->code; /* starting point */ | 277 | L->savedpc = p->code; /* starting point */ |
| 277 | ci->tailcalls = 0; | 278 | ci->tailcalls = 0; |
| 278 | ci->nresults = nresults; | 279 | ci->nresults = nresults; |
| 279 | for (st = L->top; st < ci->top; st++) | 280 | for (st = L->top; st < ci->top; st++) |
| @@ -325,6 +326,7 @@ void luaD_poscall (lua_State *L, int wanted, StkId firstResult) { | |||
| 325 | res = L->ci->func; /* res == final position of 1st result */ | 326 | res = L->ci->func; /* res == final position of 1st result */ |
| 326 | L->ci--; | 327 | L->ci--; |
| 327 | L->base = L->ci->base; /* restore base */ | 328 | L->base = L->ci->base; /* restore base */ |
| 329 | L->savedpc = L->ci->savedpc; /* restore savedpc */ | ||
| 328 | /* move results to correct place */ | 330 | /* move results to correct place */ |
| 329 | while (wanted != 0 && firstResult < L->top) { | 331 | while (wanted != 0 && firstResult < L->top) { |
| 330 | setobjs2s(L, res++, firstResult++); | 332 | setobjs2s(L, res++, firstResult++); |
| @@ -451,6 +453,7 @@ int luaD_pcall (lua_State *L, Pfunc func, void *u, | |||
| 451 | L->nCcalls = oldnCcalls; | 453 | L->nCcalls = oldnCcalls; |
| 452 | L->ci = restoreci(L, old_ci); | 454 | L->ci = restoreci(L, old_ci); |
| 453 | L->base = L->ci->base; | 455 | L->base = L->ci->base; |
| 456 | L->savedpc = L->ci->savedpc; | ||
| 454 | L->allowhook = old_allowhooks; | 457 | L->allowhook = old_allowhooks; |
| 455 | restore_stack_limit(L); | 458 | restore_stack_limit(L); |
| 456 | } | 459 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.c,v 2.27 2005/03/18 18:55:45 roberto Exp roberto $ | 2 | ** $Id: lstate.c,v 2.28 2005/03/22 16:04:29 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -94,6 +94,7 @@ static void preinit_state (lua_State *L, global_State *g) { | |||
| 94 | L->nCcalls = 0; | 94 | L->nCcalls = 0; |
| 95 | L->status = 0; | 95 | L->status = 0; |
| 96 | L->base_ci = L->ci = NULL; | 96 | L->base_ci = L->ci = NULL; |
| 97 | L->savedpc = NULL; | ||
| 97 | L->errfunc = 0; | 98 | L->errfunc = 0; |
| 98 | setnilvalue(gt(L)); | 99 | setnilvalue(gt(L)); |
| 99 | } | 100 | } |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lstate.h,v 2.17 2005/03/18 18:55:09 roberto Exp roberto $ | 2 | ** $Id: lstate.h,v 2.18 2005/03/22 16:04:29 roberto Exp roberto $ |
| 3 | ** Global State | 3 | ** Global State |
| 4 | ** See Copyright Notice in lua.h | 4 | ** See Copyright Notice in lua.h |
| 5 | */ | 5 | */ |
| @@ -102,6 +102,7 @@ struct lua_State { | |||
| 102 | StkId base; /* base of current function */ | 102 | StkId base; /* base of current function */ |
| 103 | global_State *l_G; | 103 | global_State *l_G; |
| 104 | CallInfo *ci; /* call info for current function */ | 104 | CallInfo *ci; /* call info for current function */ |
| 105 | const Instruction *savedpc; /* `savedpc' of current function */ | ||
| 105 | StkId stack_last; /* last free slot in the stack */ | 106 | StkId stack_last; /* last free slot in the stack */ |
| 106 | StkId stack; /* stack base */ | 107 | StkId stack; /* stack base */ |
| 107 | int stacksize; | 108 | int stacksize; |
| @@ -1,5 +1,5 @@ | |||
| 1 | /* | 1 | /* |
| 2 | ** $Id: lvm.c,v 2.35 2005/03/28 17:17:53 roberto Exp roberto $ | 2 | ** $Id: lvm.c,v 2.36 2005/04/04 18:12:51 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 | */ |
| @@ -59,9 +59,8 @@ int luaV_tostring (lua_State *L, StkId obj) { | |||
| 59 | 59 | ||
| 60 | static void traceexec (lua_State *L, const Instruction *pc) { | 60 | static void traceexec (lua_State *L, const Instruction *pc) { |
| 61 | lu_byte mask = L->hookmask; | 61 | lu_byte mask = L->hookmask; |
| 62 | CallInfo *ci = L->ci; | 62 | const Instruction *oldpc = L->savedpc; |
| 63 | const Instruction *oldpc = ci->savedpc; | 63 | L->savedpc = pc; |
| 64 | ci->savedpc = pc; | ||
| 65 | if (mask > LUA_MASKLINE) { /* instruction-hook set? */ | 64 | if (mask > LUA_MASKLINE) { /* instruction-hook set? */ |
| 66 | if (L->hookcount == 0) { | 65 | if (L->hookcount == 0) { |
| 67 | resethookcount(L); | 66 | resethookcount(L); |
| @@ -70,7 +69,7 @@ static void traceexec (lua_State *L, const Instruction *pc) { | |||
| 70 | } | 69 | } |
| 71 | } | 70 | } |
| 72 | if (mask & LUA_MASKLINE) { | 71 | if (mask & LUA_MASKLINE) { |
| 73 | Proto *p = ci_func(ci)->l.p; | 72 | Proto *p = ci_func(L->ci)->l.p; |
| 74 | int npc = pcRel(pc, p); | 73 | int npc = pcRel(pc, p); |
| 75 | int newline = getline(p, npc); | 74 | int newline = getline(p, npc); |
| 76 | /* call linehook when enter a new function, when jump back (loop), | 75 | /* call linehook when enter a new function, when jump back (loop), |
| @@ -81,17 +80,13 @@ static void traceexec (lua_State *L, const Instruction *pc) { | |||
| 81 | } | 80 | } |
| 82 | 81 | ||
| 83 | 82 | ||
| 84 | static void prepTMcall (lua_State *L, const TValue *f, | 83 | static void callTMres (lua_State *L, StkId res, const TValue *f, |
| 85 | const TValue *p1, const TValue *p2) { | 84 | const TValue *p1, const TValue *p2) { |
| 85 | ptrdiff_t result = savestack(L, res); | ||
| 86 | luaD_checkstack(L, 3); | ||
| 86 | setobj2s(L, L->top, f); /* push function */ | 87 | setobj2s(L, L->top, f); /* push function */ |
| 87 | setobj2s(L, L->top+1, p1); /* 1st argument */ | 88 | setobj2s(L, L->top+1, p1); /* 1st argument */ |
| 88 | setobj2s(L, L->top+2, p2); /* 2nd argument */ | 89 | setobj2s(L, L->top+2, p2); /* 2nd argument */ |
| 89 | } | ||
| 90 | |||
| 91 | |||
| 92 | static void callTMres (lua_State *L, StkId res) { | ||
| 93 | ptrdiff_t result = savestack(L, res); | ||
| 94 | luaD_checkstack(L, 3); | ||
| 95 | L->top += 3; | 90 | L->top += 3; |
| 96 | luaD_call(L, L->top - 3, 1); | 91 | luaD_call(L, L->top - 3, 1); |
| 97 | res = restorestack(L, result); | 92 | res = restorestack(L, result); |
| @@ -101,8 +96,12 @@ static void callTMres (lua_State *L, StkId res) { | |||
| 101 | 96 | ||
| 102 | 97 | ||
| 103 | 98 | ||
| 104 | static void callTM (lua_State *L) { | 99 | static void callTM (lua_State *L, const TValue *f, const TValue *p1, const TValue *p2, const TValue *p3) { |
| 105 | luaD_checkstack(L, 4); | 100 | luaD_checkstack(L, 4); |
| 101 | setobj2s(L, L->top, f); /* push function */ | ||
| 102 | setobj2s(L, L->top+1, p1); /* 1st argument */ | ||
| 103 | setobj2s(L, L->top+2, p2); /* 2nd argument */ | ||
| 104 | setobj2s(L, L->top+3, p3); /* 3th argument */ | ||
| 106 | L->top += 4; | 105 | L->top += 4; |
| 107 | luaD_call(L, L->top - 4, 0); | 106 | luaD_call(L, L->top - 4, 0); |
| 108 | } | 107 | } |
| @@ -125,8 +124,7 @@ void luaV_gettable (lua_State *L, const TValue *t, TValue *key, StkId val) { | |||
| 125 | else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) | 124 | else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_INDEX))) |
| 126 | luaG_typeerror(L, t, "index"); | 125 | luaG_typeerror(L, t, "index"); |
| 127 | if (ttisfunction(tm)) { | 126 | if (ttisfunction(tm)) { |
| 128 | prepTMcall(L, tm, t, key); | 127 | callTMres(L, val, tm, t, key); |
| 129 | callTMres(L, val); | ||
| 130 | return; | 128 | return; |
| 131 | } | 129 | } |
| 132 | t = tm; /* else repeat with `tm' */ | 130 | t = tm; /* else repeat with `tm' */ |
| @@ -153,9 +151,7 @@ void luaV_settable (lua_State *L, const TValue *t, TValue *key, StkId val) { | |||
| 153 | else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) | 151 | else if (ttisnil(tm = luaT_gettmbyobj(L, t, TM_NEWINDEX))) |
| 154 | luaG_typeerror(L, t, "index"); | 152 | luaG_typeerror(L, t, "index"); |
| 155 | if (ttisfunction(tm)) { | 153 | if (ttisfunction(tm)) { |
| 156 | prepTMcall(L, tm, t, key); | 154 | callTM(L, tm, t, key, val); |
| 157 | setobj2s(L, L->top+3, val); /* 3th argument */ | ||
| 158 | callTM(L); | ||
| 159 | return; | 155 | return; |
| 160 | } | 156 | } |
| 161 | t = tm; /* else repeat with `tm' */ | 157 | t = tm; /* else repeat with `tm' */ |
| @@ -170,8 +166,7 @@ static int call_binTM (lua_State *L, const TValue *p1, const TValue *p2, | |||
| 170 | if (ttisnil(tm)) | 166 | if (ttisnil(tm)) |
| 171 | tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ | 167 | tm = luaT_gettmbyobj(L, p2, event); /* try second operand */ |
| 172 | if (!ttisfunction(tm)) return 0; | 168 | if (!ttisfunction(tm)) return 0; |
| 173 | prepTMcall(L, tm, p1, p2); | 169 | callTMres(L, res, tm, p1, p2); |
| 174 | callTMres(L, res); | ||
| 175 | return 1; | 170 | return 1; |
| 176 | } | 171 | } |
| 177 | 172 | ||
| @@ -198,8 +193,7 @@ static int call_orderTM (lua_State *L, const TValue *p1, const TValue *p2, | |||
| 198 | tm2 = luaT_gettmbyobj(L, p2, event); | 193 | tm2 = luaT_gettmbyobj(L, p2, event); |
| 199 | if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ | 194 | if (!luaO_rawequalObj(tm1, tm2)) /* different metamethods? */ |
| 200 | return -1; | 195 | return -1; |
| 201 | prepTMcall(L, tm1, p1, p2); | 196 | callTMres(L, L->top, tm1, p1, p2); |
| 202 | callTMres(L, L->top); | ||
| 203 | return !l_isfalse(L->top); | 197 | return !l_isfalse(L->top); |
| 204 | } | 198 | } |
| 205 | 199 | ||
| @@ -278,8 +272,7 @@ int luaV_equalval (lua_State *L, const TValue *t1, const TValue *t2) { | |||
| 278 | default: return gcvalue(t1) == gcvalue(t2); | 272 | default: return gcvalue(t1) == gcvalue(t2); |
| 279 | } | 273 | } |
| 280 | if (tm == NULL) return 0; /* no TM? */ | 274 | if (tm == NULL) return 0; /* no TM? */ |
| 281 | prepTMcall(L, tm, t1, t2); | 275 | callTMres(L, L->top, tm, t1, t2); /* call TM */ |
| 282 | callTMres(L, L->top); /* call TM */ | ||
| 283 | return !l_isfalse(L->top); | 276 | return !l_isfalse(L->top); |
| 284 | } | 277 | } |
| 285 | 278 | ||
| @@ -369,7 +362,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
| 369 | if (L->hookmask & LUA_MASKCALL) | 362 | if (L->hookmask & LUA_MASKCALL) |
| 370 | luaD_callhook(L, LUA_HOOKCALL, -1); | 363 | luaD_callhook(L, LUA_HOOKCALL, -1); |
| 371 | retentry: /* entry point when returning to old functions */ | 364 | retentry: /* entry point when returning to old functions */ |
| 372 | pc = L->ci->savedpc; | 365 | pc = L->savedpc; |
| 373 | cl = &clvalue(L->ci->func)->l; | 366 | cl = &clvalue(L->ci->func)->l; |
| 374 | k = cl->p->k; | 367 | k = cl->p->k; |
| 375 | /* main loop of interpreter */ | 368 | /* main loop of interpreter */ |
| @@ -381,14 +374,14 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
| 381 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { | 374 | (--L->hookcount == 0 || L->hookmask & LUA_MASKLINE)) { |
| 382 | traceexec(L, pc); /***/ | 375 | traceexec(L, pc); /***/ |
| 383 | if (L->status == LUA_YIELD) { /* did hook yield? */ | 376 | if (L->status == LUA_YIELD) { /* did hook yield? */ |
| 384 | L->ci->savedpc = pc - 1; | 377 | L->savedpc = pc - 1; |
| 385 | return NULL; | 378 | return NULL; |
| 386 | } | 379 | } |
| 387 | } | 380 | } |
| 388 | /* warning!! several calls may realloc the stack and invalidate `ra' */ | 381 | /* warning!! several calls may realloc the stack and invalidate `ra' */ |
| 389 | base = L->base; | 382 | base = L->base; |
| 390 | ra = RA(i); | 383 | ra = RA(i); |
| 391 | L->ci->savedpc = pc; | 384 | L->savedpc = pc; |
| 392 | lua_assert(base == L->ci->base); | 385 | lua_assert(base == L->ci->base); |
| 393 | lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); | 386 | lua_assert(base <= L->top && L->top <= L->stack + L->stacksize); |
| 394 | lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); | 387 | lua_assert(L->top == L->ci->top || luaG_checkopenop(i)); |
| @@ -634,7 +627,7 @@ StkId luaV_execute (lua_State *L, int nexeccalls) { | |||
| 634 | setobjs2s(L, func+aux, pfunc+aux); | 627 | setobjs2s(L, func+aux, pfunc+aux); |
| 635 | ci->top = L->top = func+aux; /* correct top */ | 628 | ci->top = L->top = func+aux; /* correct top */ |
| 636 | lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); | 629 | lua_assert(L->top == L->base + clvalue(func)->l.p->maxstacksize); |
| 637 | ci->savedpc = (ci+1)->savedpc; | 630 | ci->savedpc = L->savedpc; |
| 638 | ci->tailcalls++; /* one more call lost */ | 631 | ci->tailcalls++; /* one more call lost */ |
| 639 | L->ci--; /* remove new frame */ | 632 | L->ci--; /* remove new frame */ |
| 640 | goto callentry; | 633 | goto callentry; |
