public Item Compile(ByteCodeGenerator generator) { Chain thenExit = null; var item = new ConditionCompiler(node.Condition).Compile(generator); var elseChain = item.JumpFalse(); Item x = null; if (!item.IsFalse()) { generator.ResolveChain(item.TrueJumps); x = new ExpressionCompiler(node.ThenExpression).Compile(generator).Load(); thenExit = generator.Branch(OpCodeValue.@goto); } if (elseChain != null) { generator.ResolveChain(elseChain); x = new ExpressionCompiler(node.ElseExpression).Compile(generator).Load(); } generator.ResolveChain(thenExit); //var type = tb.Type.FindCommonType(fb.Type); var type = x.Type; return new StackItem(generator, type); }
public void Compile(ByteCodeGenerator generator) { var item = new ConditionCompiler(node.Condition).Compile(generator); var elseChain = item.JumpFalse(); Chain thenExit = null; if (!item.IsFalse()) { generator.ResolveChain(item.TrueJumps); generator.PushScope(); new StatementCompiler(node.TrueBranch).Compile(generator); thenExit = generator.Branch(OpCodeValue.@goto); generator.PopScope(); } if (elseChain != null) { generator.ResolveChain(elseChain); if (node.FalseBranch != null) { generator.PushScope(); new StatementCompiler(node.FalseBranch).Compile(generator); generator.PopScope(); } } generator.ResolveChain(thenExit); }