예제 #1
0
        protected IfStatNode AssertIfStatement(string src, object condValue, int thenStatementCount = 1, int?elseStatementCount = null)
        {
            IfStatNode node = this.GenerateAST(src).As <IfStatNode>();

            Assert.That(node, Is.Not.Null);
            this.AssertChildrenParentProperties(node);
            Assert.That(ConstantExpressionEvaluator.Evaluate(node.Condition), Is.EqualTo(condValue));
            Assert.That(node.ThenStat.Children, Has.Exactly(thenStatementCount).Items);
            if (elseStatementCount is { })
예제 #2
0
        public void BranchingStatementEqualityTest1()
        {
            ASTNode ast1 = new IfStatNode(
                1,
                new LitExprNode(1, true),
                new EmptyStatNode(1)
                );
            ASTNode ast2 = new IfStatNode(
                1,
                new LitExprNode(1, true),
                new EmptyStatNode(1)
                );

            AssertNodes(ast1, ast2, eq: true);
        }
예제 #3
0
        public void BranchingStatementDifferenceTest2()
        {
            ASTNode ast1 = new IfStatNode(
                1,
                new LitExprNode(1, true),
                new EmptyStatNode(1),
                new BlockStatNode(1, new EmptyStatNode(1))
                );
            ASTNode ast2 = new IfStatNode(
                1,
                new LitExprNode(1, true),
                new EmptyStatNode(1)
                );

            AssertNodes(ast1, ast2, eq: false);
        }
예제 #4
0
        private void CGIfStat(FuncInfo funcInfo, IfStatNode node)
        {
            var jmpToEndsPC    = new int[node.Exp.Count];
            int jmpToNextExpPc = -1;
            int i = 0;

            foreach (var exp in node.Exp)
            {
                if (jmpToNextExpPc > 0)
                {
                    funcInfo.FixSBX(jmpToNextExpPc, funcInfo.PC() - jmpToNextExpPc);
                }
                int r = funcInfo.AllocReg();
                CGExp(funcInfo, exp, r, 1);
                funcInfo.FreeReg();
                funcInfo.EmitTest(r, 0);
                jmpToNextExpPc = funcInfo.EmitJMP(0, 0);
                funcInfo.EnterScope(false);
                CGBlock(funcInfo, node.Block);
                funcInfo.ExitScope();
                if (i < node.Exp.Count - 1)
                {
                    jmpToEndsPC[i] = funcInfo.EmitJMP(0, 0);
                }
                else
                {
                    jmpToEndsPC[i] = jmpToNextExpPc;
                }
                i++;
            }

            foreach (int j in jmpToEndsPC)
            {
                funcInfo.FixSBX(j, funcInfo.PC() - j);
            }
        }
예제 #5
0
 public virtual TResult Visit(IfStatNode node) => this.VisitChildren(node);