Esempio n. 1
0
        private ForStatementUpNode Visit(ForStatementUpNode node)
        {
            Visit(node.expr1);
            builder.BuildStore(GetProperty(node.expr1).addr, LookupSymbolOrAlloc(node.Identifier));
            var condBB = func.AppendBasicBlock($"cond_{++count}");
            var bodyBB = func.AppendBasicBlock($"body_{++count}");
            var contBB = func.AppendBasicBlock($"cont_{++count}");

            builder.BuildBr(condBB);
            builder.PositionAtEnd(condBB);
            Visit(node.expr2);
            var t = builder.BuildLoad(LookupSymbolOrAlloc(node.Identifier));
            var b = builder.BuildICmp(LLVMIntPredicate.LLVMIntSLT, t, GetProperty(node.expr2).addr);

            builder.BuildCondBr(b, bodyBB, contBB);
            builder.PositionAtEnd(bodyBB);
            Visit(node.StatementNode);
            t = builder.BuildLoad(LookupSymbolOrAlloc(node.Identifier));
            var r = builder.BuildAdd(t, LLVMValueRef.CreateConstInt(LLVMTypeRef.Int32, 1));

            builder.BuildStore(r, LookupSymbolOrAlloc(node.Identifier));
            builder.BuildBr(condBB);
            builder.PositionAtEnd(contBB);
            return(node);
        }