@@ -2359,6 +2359,64 @@ function Compiler:compileExpression(expression, funcDepth, numReturns)
23592359 return regs ;
23602360 end
23612361
2362+ if (expression .kind == AstKind .IfElseExpression ) then
2363+ local posState = self .registers [self .POS_REGISTER ];
2364+ self .registers [self .POS_REGISTER ] = self .VAR_REGISTER ;
2365+
2366+ local regs = {};
2367+ for i = 1 , numReturns do
2368+ regs [i ] = self :allocRegister ();
2369+ if (i ~= 1 ) then
2370+ self :addStatement (self :setRegister (scope , regs [i ], Ast .NilExpression ()), {regs [i ]}, {}, false );
2371+ end
2372+ end
2373+
2374+ local resReg = regs [1 ];
2375+ local tmpReg ;
2376+
2377+ if posState then
2378+ tmpReg = self :allocRegister (false );
2379+ self :addStatement (self :copyRegisters (scope , {tmpReg }, {self .POS_REGISTER }), {tmpReg }, {self .POS_REGISTER }, false );
2380+ end
2381+
2382+ local conditionReg = self :compileExpression (expression .condition , funcDepth , 1 )[1 ];
2383+
2384+ local trueBlock , falseBlock , finalBlock = self :createBlock (), self :createBlock (), self :createBlock ();
2385+
2386+ self :addStatement (self :setRegister (scope , self .POS_REGISTER , Ast .OrExpression (Ast .AndExpression (self :register (scope , conditionReg ), Ast .NumberExpression (trueBlock .id )), Ast .NumberExpression (falseBlock .id ))), {self .POS_REGISTER }, {conditionReg }, false );
2387+ self :freeRegister (conditionReg , false );
2388+
2389+ do
2390+ self :setActiveBlock (trueBlock );
2391+ local scope = trueBlock .scope ;
2392+ local trueReg = self :compileExpression (expression .true_value , funcDepth , 1 )[1 ];
2393+ self :addStatement (self :copyRegisters (scope , {resReg }, {trueReg }), {resReg }, {trueReg }, false );
2394+ self :freeRegister (trueReg , false );
2395+ self :addStatement (self :setRegister (scope , self .POS_REGISTER , Ast .NumberExpression (finalBlock .id )), {self .POS_REGISTER }, {}, false );
2396+ end
2397+
2398+ do
2399+ self :setActiveBlock (falseBlock );
2400+ local scope = falseBlock .scope ;
2401+ local falseReg = self :compileExpression (expression .false_value , funcDepth , 1 )[1 ];
2402+ self :addStatement (self :copyRegisters (scope , {resReg }, {falseReg }), {resReg }, {falseReg }, false );
2403+ self :freeRegister (falseReg , false );
2404+ self :addStatement (self :setRegister (scope , self .POS_REGISTER , Ast .NumberExpression (finalBlock .id )), {self .POS_REGISTER }, {}, false );
2405+ end
2406+
2407+ self .registers [self .POS_REGISTER ] = posState ;
2408+
2409+ self :setActiveBlock (finalBlock );
2410+ scope = finalBlock .scope ;
2411+
2412+ if tmpReg then
2413+ self :addStatement (self :copyRegisters (scope , {self .POS_REGISTER }, {tmpReg }), {self .POS_REGISTER }, {tmpReg }, false );
2414+ self :freeRegister (tmpReg , false );
2415+ end
2416+
2417+ return regs ;
2418+ end
2419+
23622420 logger :error (string.format (" %s is not an compliable expression!" , expression .kind ));
23632421end
23642422
0 commit comments