private object IfElseStatementNode(IfElseStatementNode ie)
 {
     if ((bool)Evaluate(ie.i))
     {
         return(Evaluate(ie.truebody));
     }
     return(Evaluate(ie.falsebody));
 }
Beispiel #2
0
        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);
        }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }