@@ -1969,35 +1969,46 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
19691969 retRegs [i ] = self :allocRegister (false );
19701970 end
19711971 end
1972- local argRegs = {};
1973-
1972+
1973+ local regs = {};
1974+ local args = {};
19741975 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
19761987 end
19771988
19781989 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 );
19801991 else
19811992 if (numReturns > 1 ) then
19821993 local tmpReg = self :allocRegister (false );
19831994
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 );
19851996
19861997 for i , reg in ipairs (retRegs ) do
19871998 self :addStatement (self :setRegister (scope , reg , Ast .IndexExpression (self :register (scope , tmpReg ), Ast .NumberExpression (i ))), {reg }, {tmpReg }, false );
19881999 end
19892000
19902001 self :freeRegister (tmpReg , false );
19912002 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 );
19932004 end
19942005 end
19952006
19962007
19972008
19982009
19992010 self :freeRegister (baseReg , false );
2000- for i , reg in ipairs (argRegs ) do
2011+ for i , reg in ipairs (regs ) do
20012012 self :freeRegister (reg , false );
20022013 end
20032014
0 commit comments