diff options
author | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-12-15 14:17:20 -0200 |
---|---|---|
committer | Roberto Ierusalimschy <roberto@inf.puc-rio.br> | 1997-12-15 14:17:20 -0200 |
commit | 45e533599f08d849951b49bcab0be4fd735a966d (patch) | |
tree | b8e3b175989f694391dd3da4191894f5df1e7d75 /lua.stx | |
parent | 94144a7821c0fa412d5d228ab5197a8ebaaa3c25 (diff) | |
download | lua-45e533599f08d849951b49bcab0be4fd735a966d.tar.gz lua-45e533599f08d849951b49bcab0be4fd735a966d.tar.bz2 lua-45e533599f08d849951b49bcab0be4fd735a966d.zip |
optimization: closures without upvalues don't need to be closures
Diffstat (limited to 'lua.stx')
-rw-r--r-- | lua.stx | 14 |
1 files changed, 9 insertions, 5 deletions
@@ -1,6 +1,6 @@ | |||
1 | %{ | 1 | %{ |
2 | /* | 2 | /* |
3 | ** $Id: lua.stx,v 1.21 1997/12/09 13:35:19 roberto Exp roberto $ | 3 | ** $Id: lua.stx,v 1.22 1997/12/09 16:01:08 roberto Exp roberto $ |
4 | ** Syntax analizer and code generator | 4 | ** Syntax analizer and code generator |
5 | ** See Copyright Notice in lua.h | 5 | ** See Copyright Notice in lua.h |
6 | */ | 6 | */ |
@@ -555,10 +555,14 @@ static void func_onstack (TProtoFunc *f) | |||
555 | int c = next_constant(L->currState); | 555 | int c = next_constant(L->currState); |
556 | ttype(&L->currState->f->consts[c]) = LUA_T_PROTO; | 556 | ttype(&L->currState->f->consts[c]) = LUA_T_PROTO; |
557 | L->currState->f->consts[c].value.tf = (L->currState+1)->f; | 557 | L->currState->f->consts[c].value.tf = (L->currState+1)->f; |
558 | for (i=0; i<nupvalues; i++) | 558 | if (nupvalues == 0) |
559 | lua_pushvar((L->currState+1)->upvalues[i]); | 559 | code_constant(c); |
560 | code_constant(c); | 560 | else { |
561 | code_oparg(CLOSURE, 2, nupvalues, -nupvalues); | 561 | for (i=0; i<nupvalues; i++) |
562 | lua_pushvar((L->currState+1)->upvalues[i]); | ||
563 | code_constant(c); | ||
564 | code_oparg(CLOSURE, 2, nupvalues, -nupvalues); | ||
565 | } | ||
562 | } | 566 | } |
563 | 567 | ||
564 | 568 | ||