55
66-- The max Number of variables used as registers
77local MAX_REGS = 100 ;
8+ local MAX_REGS_MUL = 0 ;
89
910local Compiler = {};
1011
@@ -655,7 +656,7 @@ function Compiler:allocRegister(isVar)
655656
656657
657658 local id = 0 ;
658- if self .usedRegisters < MAX_REGS * 0.75 then
659+ if self .usedRegisters < MAX_REGS * MAX_REGS_MUL then
659660 repeat
660661 id = math.random (1 , MAX_REGS - 1 );
661662 until not self .registers [id ];
@@ -1008,7 +1009,7 @@ function Compiler:compileBlock(block, funcDepth)
10081009 local scope = self .activeBlock .scope ;
10091010 for id , name in ipairs (block .scope .variables ) do
10101011 local varReg = self :getVarRegister (block .scope , id , funcDepth , nil );
1011- if self :isUpvalue (block .scope , id ) then -- TODO
1012+ if self :isUpvalue (block .scope , id ) then
10121013 scope :addReferenceToHigherScope (self .scope , self .freeUpvalueFunc );
10131014 self :addStatement (self :setRegister (scope , varReg , Ast .FunctionCallExpression (Ast .VariableExpression (self .scope , self .freeUpvalueFunc ), {
10141015 self :register (scope , varReg )
@@ -1076,14 +1077,15 @@ function Compiler:compileStatement(statement, funcDepth)
10761077
10771078 for i , id in ipairs (statement .ids ) do
10781079 if (exprregs [i ]) then
1079- local varreg = self :getVarRegister (statement .scope , id , funcDepth , exprregs [i ]);
10801080 if (self :isUpvalue (statement .scope , id )) then
1081+ local varreg = self :getVarRegister (statement .scope , id , funcDepth );
10811082 local varReg = self :getVarRegister (statement .scope , id , funcDepth , nil );
10821083 scope :addReferenceToHigherScope (self .scope , self .allocUpvalFunction );
10831084 self :addStatement (self :setRegister (scope , varReg , Ast .FunctionCallExpression (Ast .VariableExpression (self .scope , self .allocUpvalFunction ), {})), {varReg }, {}, false );
10841085 self :addStatement (self :setUpvalueMember (scope , self :register (scope , varReg ), self :register (scope , exprregs [i ])), {}, {varReg , exprregs [i ]}, true );
10851086 self :freeRegister (exprregs [i ], false );
10861087 else
1088+ local varreg = self :getVarRegister (statement .scope , id , funcDepth , exprregs [i ]);
10871089 self :addStatement (self :copyRegisters (scope , {varreg }, {exprregs [i ]}), {varreg }, {exprregs [i ]}, false );
10881090 self :freeRegister (exprregs [i ], false );
10891091 end
@@ -1132,8 +1134,8 @@ function Compiler:compileStatement(statement, funcDepth)
11321134 if (statement .kind == AstKind .PassSelfFunctionCallStatement ) then
11331135 local baseReg = self :compileExpression (statement .base , funcDepth , 1 )[1 ];
11341136 local tmpReg = self :allocRegister (false );
1135- local args = {};
1136- local regs = {};
1137+ local args = { self : register ( scope , baseReg ) };
1138+ local regs = { baseReg };
11371139
11381140 for i , expr in ipairs (statement .args ) do
11391141 if i == # statement .args and (expr .kind == AstKind .FunctionCallExpression or expr .kind == AstKind .PassSelfFunctionCallExpression ) then
@@ -1163,14 +1165,17 @@ function Compiler:compileStatement(statement, funcDepth)
11631165
11641166 -- Local Function Declaration
11651167 if (statement .kind == AstKind .LocalFunctionDeclaration ) then
1166- local retReg = self :compileFunction (statement , funcDepth );
1167- local varReg = self :getVarRegister (statement .scope , statement .id , funcDepth , retReg );
1168+
11681169 if (self :isUpvalue (statement .scope , statement .id )) then
1170+ local varReg = self :getVarRegister (statement .scope , statement .id , funcDepth , nil );
11691171 scope :addReferenceToHigherScope (self .scope , self .allocUpvalFunction );
11701172 self :addStatement (self :setRegister (scope , varReg , Ast .FunctionCallExpression (Ast .VariableExpression (self .scope , self .allocUpvalFunction ), {})), {varReg }, {}, false );
1173+ local retReg = self :compileFunction (statement , funcDepth );
11711174 self :addStatement (self :setUpvalueMember (scope , self :register (scope , varReg ), self :register (scope , retReg )), {}, {varReg , retReg }, true );
11721175 self :freeRegister (retReg , false );
11731176 else
1177+ local retReg = self :compileFunction (statement , funcDepth );
1178+ local varReg = self :getVarRegister (statement .scope , statement .id , funcDepth , retReg );
11741179 self :addStatement (self :copyRegisters (scope , {varReg }, {retReg }), {varReg }, {retReg }, false );
11751180 self :freeRegister (retReg , false );
11761181 end
@@ -1188,11 +1193,14 @@ function Compiler:compileStatement(statement, funcDepth)
11881193 self :freeRegister (tmpReg , false );
11891194 else
11901195 if self .scopeFunctionDepths [statement .scope ] == funcDepth then
1191- local reg = self :getVarRegister (statement .scope , statement .id , funcDepth , retReg );
11921196 if self :isUpvalue (statement .scope , statement .id ) then
1197+ local reg = self :getVarRegister (statement .scope , statement .id , funcDepth );
11931198 self :addStatement (self :setUpvalueMember (scope , self :register (scope , reg ), self :register (scope , retReg )), {}, {reg , retReg }, true );
1194- elseif reg ~= retReg then
1195- self :addStatement (self :setRegister (scope , reg , self :register (scope , retReg )), {reg }, {retReg }, false );
1199+ else
1200+ local reg = self :getVarRegister (statement .scope , statement .id , funcDepth , retReg );
1201+ if reg ~= retReg then
1202+ self :addStatement (self :setRegister (scope , reg , self :register (scope , retReg )), {reg }, {retReg }, false );
1203+ end
11961204 end
11971205 else
11981206 local upvalId = self :getUpvalueId (statement .scope , statement .id );
@@ -1252,11 +1260,14 @@ function Compiler:compileStatement(statement, funcDepth)
12521260 self :freeRegister (tmpReg , false );
12531261 else
12541262 if self .scopeFunctionDepths [primaryExpr .scope ] == funcDepth then
1255- local reg = self :getVarRegister (primaryExpr .scope , primaryExpr .id , funcDepth , exprregs [i ]);
12561263 if self :isUpvalue (primaryExpr .scope , primaryExpr .id ) then
1264+ local reg = self :getVarRegister (primaryExpr .scope , primaryExpr .id , funcDepth );
12571265 self :addStatement (self :setUpvalueMember (scope , self :register (scope , reg ), self :register (scope , exprregs [i ])), {}, {reg , exprregs [i ]}, true );
1258- elseif reg ~= exprregs [i ] then
1259- self :addStatement (self :setRegister (scope , reg , self :register (scope , exprregs [i ])), {reg }, {exprregs [i ]}, false );
1266+ else
1267+ local reg = self :getVarRegister (primaryExpr .scope , primaryExpr .id , funcDepth , exprregs [i ]);
1268+ if reg ~= exprregs [i ] then
1269+ self :addStatement (self :setRegister (scope , reg , self :register (scope , exprregs [i ])), {reg }, {exprregs [i ]}, false );
1270+ end
12601271 end
12611272 else
12621273 local upvalId = self :getUpvalueId (primaryExpr .scope , primaryExpr .id );
@@ -1568,13 +1579,63 @@ function Compiler:compileStatement(statement, funcDepth)
15681579
15691580 -- Break Statement
15701581 if (statement .kind == AstKind .BreakStatement ) then
1582+ local toFreeVars = {};
1583+ local statScope ;
1584+ repeat
1585+ statScope = statScope and statScope .parentScope or statement .scope ;
1586+ for id , name in ipairs (statScope .variables ) do
1587+ table.insert (toFreeVars , {
1588+ scope = statScope ,
1589+ id = id ;
1590+ });
1591+ end
1592+ until statScope == statement .loop .body .scope ;
1593+
1594+ for i , var in pairs (toFreeVars ) do
1595+ local varScope , id = var .scope , var .id ;
1596+ local varReg = self :getVarRegister (varScope , id , nil , nil );
1597+ if self :isUpvalue (varScope , id ) then
1598+ scope :addReferenceToHigherScope (self .scope , self .freeUpvalueFunc );
1599+ self :addStatement (self :setRegister (scope , varReg , Ast .FunctionCallExpression (Ast .VariableExpression (self .scope , self .freeUpvalueFunc ), {
1600+ self :register (scope , varReg )
1601+ })), {varReg }, {varReg }, false );
1602+ else
1603+ self :addStatement (self :setRegister (scope , varReg , Ast .NilExpression ()), {varReg }, {}, false );
1604+ end
1605+ end
1606+
15711607 self :addStatement (self :setPos (scope , statement .loop .__final_block .id ), {self .POS_REGISTER }, {}, false );
15721608 self .activeBlock .advanceToNextBlock = false ;
15731609 return ;
15741610 end
15751611
15761612 -- Contiue Statement
1577- if (statement .kind == AstKind .BreakStatement ) then
1613+ if (statement .kind == AstKind .ContinueStatement ) then
1614+ local toFreeVars = {};
1615+ local statScope ;
1616+ repeat
1617+ statScope = statScope and statScope .parentScope or statement .scope ;
1618+ for id , name in pairs (statScope .variables ) do
1619+ table.insert (toFreeVars , {
1620+ scope = statScope ,
1621+ id = id ;
1622+ });
1623+ end
1624+ until statScope == statement .loop .body .scope ;
1625+
1626+ for i , var in ipairs (toFreeVars ) do
1627+ local varScope , id = var .scope , var .id ;
1628+ local varReg = self :getVarRegister (varScope , id , nil , nil );
1629+ if self :isUpvalue (varScope , id ) then
1630+ scope :addReferenceToHigherScope (self .scope , self .freeUpvalueFunc );
1631+ self :addStatement (self :setRegister (scope , varReg , Ast .FunctionCallExpression (Ast .VariableExpression (self .scope , self .freeUpvalueFunc ), {
1632+ self :register (scope , varReg )
1633+ })), {varReg }, {varReg }, false );
1634+ else
1635+ self :addStatement (self :setRegister (scope , varReg , Ast .NilExpression ()), {varReg }, {}, false );
1636+ end
1637+ end
1638+
15781639 self :addStatement (self :setPos (scope , statement .loop .__start_block .id ), {self .POS_REGISTER }, {}, false );
15791640 self .activeBlock .advanceToNextBlock = false ;
15801641 return ;
@@ -1692,7 +1753,6 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
16921753 end
16931754 local argRegs = {};
16941755
1695- -- TODO: Function call multi return pass
16961756 for i , expr in ipairs (expression .args ) do
16971757 table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
16981758 end
@@ -1738,12 +1798,22 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17381798 retRegs [i ] = self :allocRegister (false );
17391799 end
17401800 end
1741- local argRegs = {};
17421801
1743- local argRegs = { baseReg };
1802+ local args = { self :register (scope , baseReg ) };
1803+ local regs = { baseReg };
17441804
17451805 for i , expr in ipairs (expression .args ) do
1746- table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
1806+ if i == # expression .args and (expr .kind == AstKind .FunctionCallExpression or expr .kind == AstKind .PassSelfFunctionCallExpression ) then
1807+ local reg = self :compileExpression (expr , funcDepth , self .RETURN_ALL )[1 ];
1808+ table.insert (args , Ast .FunctionCallExpression (
1809+ self :unpack (scope ),
1810+ {self :register (scope , reg )}));
1811+ table.insert (regs , reg );
1812+ else
1813+ local reg = self :compileExpression (expr , funcDepth , 1 )[1 ];
1814+ table.insert (args , self :register (scope , reg ));
1815+ table.insert (regs , reg );
1816+ end
17471817 end
17481818
17491819 if (numReturns > 1 or returnAll ) then
@@ -1753,9 +1823,9 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17531823 self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {baseReg , tmpReg }, false );
17541824
17551825 if returnAll then
1756- self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , tmpReg ), self : registerList ( scope , argRegs ))) }), {retRegs [1 ]}, {baseReg , unpack (argRegs )}, true );
1826+ self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , tmpReg ), args )) }), {retRegs [1 ]}, {baseReg , unpack (regs )}, true );
17571827 else
1758- self :addStatement (self :setRegister (scope , tmpReg , Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , tmpReg ), self : registerList ( scope , argRegs ))) }), {tmpReg }, {baseReg , unpack (argRegs )}, true );
1828+ self :addStatement (self :setRegister (scope , tmpReg , Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , tmpReg ), args )) }), {tmpReg }, {baseReg , unpack (regs )}, true );
17591829
17601830 for i , reg in ipairs (retRegs ) do
17611831 self :addStatement (self :setRegister (scope , reg , Ast .IndexExpression (self :register (scope , tmpReg ), Ast .NumberExpression (i ))), {reg }, {tmpReg }, false );
@@ -1769,11 +1839,11 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
17691839 self :addStatement (self :setRegister (scope , tmpReg , Ast .StringExpression (expression .passSelfFunctionName )), {tmpReg }, {}, false );
17701840 self :addStatement (self :setRegister (scope , tmpReg , Ast .IndexExpression (self :register (scope , baseReg ), self :register (scope , tmpReg ))), {tmpReg }, {baseReg , tmpReg }, false );
17711841
1772- self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .FunctionCallExpression (self :register (scope , tmpReg ), self : registerList ( scope , argRegs ))) , {retRegs [1 ]}, {baseReg , unpack (argRegs )}, true );
1842+ self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .FunctionCallExpression (self :register (scope , tmpReg ), args )) , {retRegs [1 ]}, {baseReg , unpack (regs )}, true );
17731843 end
17741844
17751845 self :freeRegister (baseReg , false );
1776- for i , reg in ipairs (argRegs ) do
1846+ for i , reg in ipairs (regs ) do
17771847 self :freeRegister (reg , false );
17781848 end
17791849
0 commit comments