@@ -1969,35 +1969,46 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
1969
1969
retRegs [i ] = self :allocRegister (false );
1970
1970
end
1971
1971
end
1972
- local argRegs = {};
1973
-
1972
+
1973
+ local regs = {};
1974
+ local args = {};
1974
1975
for i , expr in ipairs (expression .args ) do
1975
- table.insert (argRegs , self :compileExpression (expr , funcDepth , 1 )[1 ]);
1976
+ if i == # expression .args and (expr .kind == AstKind .FunctionCallExpression or expr .kind == AstKind .PassSelfFunctionCallExpression or expr .kind == AstKind .VarargExpression ) then
1977
+ local reg = self :compileExpression (expr , funcDepth , self .RETURN_ALL )[1 ];
1978
+ table.insert (args , Ast .FunctionCallExpression (
1979
+ self :unpack (scope ),
1980
+ {self :register (scope , reg )}));
1981
+ table.insert (regs , reg );
1982
+ else
1983
+ local reg = self :compileExpression (expr , funcDepth , 1 )[1 ];
1984
+ table.insert (args , self :register (scope , reg ));
1985
+ table.insert (regs , reg );
1986
+ end
1976
1987
end
1977
1988
1978
1989
if (returnAll ) then
1979
- self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , baseReg ), self : registerList ( scope , argRegs ))) }), {retRegs [1 ]}, {baseReg , unpack (argRegs )}, true );
1990
+ self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , baseReg ), args )) }), {retRegs [1 ]}, {baseReg , unpack (regs )}, true );
1980
1991
else
1981
1992
if (numReturns > 1 ) then
1982
1993
local tmpReg = self :allocRegister (false );
1983
1994
1984
- self :addStatement (self :setRegister (scope , tmpReg , Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , baseReg ), self : registerList ( scope , argRegs ))) }), {tmpReg }, {baseReg , unpack (argRegs )}, true );
1995
+ self :addStatement (self :setRegister (scope , tmpReg , Ast .TableConstructorExpression {Ast .TableEntry (Ast .FunctionCallExpression (self :register (scope , baseReg ), args )) }), {tmpReg }, {baseReg , unpack (regs )}, true );
1985
1996
1986
1997
for i , reg in ipairs (retRegs ) do
1987
1998
self :addStatement (self :setRegister (scope , reg , Ast .IndexExpression (self :register (scope , tmpReg ), Ast .NumberExpression (i ))), {reg }, {tmpReg }, false );
1988
1999
end
1989
2000
1990
2001
self :freeRegister (tmpReg , false );
1991
2002
else
1992
- self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .FunctionCallExpression (self :register (scope , baseReg ), self : registerList ( scope , argRegs ))) , {retRegs [1 ]}, {baseReg , unpack (argRegs )}, true );
2003
+ self :addStatement (self :setRegister (scope , retRegs [1 ], Ast .FunctionCallExpression (self :register (scope , baseReg ), args )) , {retRegs [1 ]}, {baseReg , unpack (regs )}, true );
1993
2004
end
1994
2005
end
1995
2006
1996
2007
1997
2008
1998
2009
1999
2010
self :freeRegister (baseReg , false );
2000
- for i , reg in ipairs (argRegs ) do
2011
+ for i , reg in ipairs (regs ) do
2001
2012
self :freeRegister (reg , false );
2002
2013
end
2003
2014
0 commit comments