@@ -416,6 +416,17 @@ static void markupval (FuncState *fs, int level) {
416
416
}
417
417
418
418
419
+ /*
420
+ ** Mark that current block has a to-be-closed variable.
421
+ */
422
+ static void marktobeclosed (FuncState * fs ) {
423
+ BlockCnt * bl = fs -> bl ;
424
+ bl -> upval = 1 ;
425
+ bl -> insidetbc = 1 ;
426
+ fs -> needclose = 1 ;
427
+ }
428
+
429
+
419
430
/*
420
431
** Find a variable with the given name 'n'. If it is an upvalue, add
421
432
** this upvalue into all intermediate functions. If it is a global, set
@@ -1599,7 +1610,7 @@ static void forlist (LexState *ls, TString *indexname) {
1599
1610
line = ls -> linenumber ;
1600
1611
adjust_assign (ls , 4 , explist (ls , & e ), & e );
1601
1612
adjustlocalvars (ls , 4 ); /* control variables */
1602
- markupval (fs , fs -> nactvar ); /* last control var. must be closed */
1613
+ marktobeclosed (fs ); /* last control var. must be closed */
1603
1614
luaK_checkstack (fs , 3 ); /* extra space to call generator */
1604
1615
forbody (ls , base , line , nvars - 4 , 1 );
1605
1616
}
@@ -1703,11 +1714,9 @@ static int getlocalattribute (LexState *ls) {
1703
1714
}
1704
1715
1705
1716
1706
- static void checktoclose (LexState * ls , int level ) {
1717
+ static void checktoclose (FuncState * fs , int level ) {
1707
1718
if (level != -1 ) { /* is there a to-be-closed variable? */
1708
- FuncState * fs = ls -> fs ;
1709
- markupval (fs , level + 1 );
1710
- fs -> bl -> insidetbc = 1 ; /* in the scope of a to-be-closed variable */
1719
+ marktobeclosed (fs );
1711
1720
luaK_codeABC (fs , OP_TBC , reglevel (fs , level ), 0 , 0 );
1712
1721
}
1713
1722
}
@@ -1751,7 +1760,7 @@ static void localstat (LexState *ls) {
1751
1760
adjust_assign (ls , nvars , nexps , & e );
1752
1761
adjustlocalvars (ls , nvars );
1753
1762
}
1754
- checktoclose (ls , toclose );
1763
+ checktoclose (fs , toclose );
1755
1764
}
1756
1765
1757
1766
0 commit comments