From 7840d0b2b029fbcda65e5f65a201de321ae673bb Mon Sep 17 00:00:00 2001 From: Mike Pall Date: Thu, 25 Nov 2010 12:09:21 +0100 Subject: [PATCH] Shrink slots for 'break' statement to help data-flow analysis. --- src/lj_parse.c | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/lj_parse.c b/src/lj_parse.c index b063da25..8a6eeec6 100644 --- a/src/lj_parse.c +++ b/src/lj_parse.c @@ -1752,14 +1752,18 @@ static void parse_break(LexState *ls) { FuncState *fs = ls->fs; FuncScope *bl; + BCReg savefr; int upval = 0; for (bl = fs->bl; bl && !bl->isbreakable; bl = bl->prev) upval |= bl->upval; /* Collect upvalues in intervening scopes. */ if (!bl) /* Error if no breakable scope found. */ err_syntax(ls, LJ_ERR_XBREAK); + savefr = fs->freereg; + fs->freereg = bl->nactvar; /* Shrink slots to help data-flow analysis. */ if (upval) bcemit_AJ(fs, BC_UCLO, bl->nactvar, 0); /* Close upvalues. */ jmp_append(fs, &bl->breaklist, bcemit_jmp(fs)); + fs->freereg = savefr; } /* Check for end of block. */