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 { })
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); }
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); }
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); } }
public virtual TResult Visit(IfStatNode node) => this.VisitChildren(node);