public override void Visit(JumpIfNonZero node) { AcpiObject.AcpiObject predicate = thread.Pop().Read(); if (predicate.GetAsInt().Value != 0) { Frame.JumpTo(node.ThenTarget - 1); // Minus one because IP will still advance } }
public override void Visit(AmlParser.DefWhile defWhile) { // We create a sequence like this: // jump to pushPredicate // loopback: // (body instructions) // pushPredicate: // (push predicate) // jump if not zero to loopback Jump jumpToPushPredicate = new Jump(); JumpIfNonZero jumpLoopBack = new JumpIfNonZero(); result.Add(jumpToPushPredicate); jumpLoopBack.ThenTarget = result.Count; VisitSequence(defWhile.termList); jumpToPushPredicate.Target = result.Count; defWhile.predicate.Accept(this); result.Add(jumpLoopBack); }
public override void Visit(AmlParser.DefIfElse defIfElse) { // We create a sequence like this: // (push predicate) // jump if nonzero to thenBranch // (else branch instructions) // jump to end // elseBranch: // (then branch instructions) // end: defIfElse.predicate.Accept(this); JumpIfNonZero thenJump = new JumpIfNonZero(); result.Add(thenJump); defIfElse.defElse.Accept(this); Jump jumpOverThenBrach = new Jump(); result.Add(jumpOverThenBrach); thenJump.ThenTarget = result.Count; VisitSequence(defIfElse.termList); jumpOverThenBrach.Target = result.Count; }