private object IfElseStatementNode(IfElseStatementNode ie) { if ((bool)Evaluate(ie.i)) { return(Evaluate(ie.truebody)); } return(Evaluate(ie.falsebody)); }
private IfElseStatementNode Visit(IfElseStatementNode node) { var trueLabel = MakeLabel(); var falseLabel = MakeLabel(); var nextLabel = MakeLabel(); dynamic BoolProp = new ExpandoObject(); properties.Add(node.Condition, BoolProp); BoolProp.trueLabel = trueLabel; BoolProp.falseLabel = falseLabel; node.Condition.Visit(this); generatedCode.Add(trueLabel); node.StatementNode1.Visit(this); generatedCode.Add(MakeLabeledGoto(nextLabel)); generatedCode.Add(falseLabel); node.StatementNode2.Visit(this); generatedCode.Add(nextLabel); return(node); }
private IfElseStatementNode Visit(IfElseStatementNode node) { var condBB = func.AppendBasicBlock($"cond_{++count}"); var bodyBB = func.AppendBasicBlock($"body_{++count}"); var elseBB = func.AppendBasicBlock($"else_{++count}"); var contBB = func.AppendBasicBlock($"cont_{++count}"); builder.BuildBr(condBB); builder.PositionAtEnd(condBB); Visit(node.Condition); builder.BuildCondBr(GetProperty(node.Condition).addr, bodyBB, elseBB); builder.PositionAtEnd(bodyBB); Visit(node.StatementNode1); builder.BuildBr(contBB); builder.PositionAtEnd(elseBB); Visit(node.StatementNode2); builder.BuildBr(contBB); builder.PositionAtEnd(contBB); return(node); }
private IfElseStatementNode Visit(IfElseStatementNode node) { dynamic props = new ExpandoObject(); properties.Add(node, props); var code = new List <CodeEntry>(); props.code = code; var trueLabel = properties[node.Condition].trueLabel; var falseLabel = properties[node.Condition].falseLabel; var nextLabel = MakeLabel(); code.AddRange(properties[node.Condition].code); code.Add(trueLabel); code.AddRange(properties[node.StatementNode1].code); code.Add(MakeLabeledGoto(nextLabel)); code.Add(falseLabel); code.AddRange(properties[node.StatementNode2].code); code.Add(nextLabel); return(node); }