public override void Visit(AmlParser.DefCondRefOf defCondRefOf) { // We create a sequence like this: // jump if node path exists to existsBranch // (push 0) // jump to end // existsBranch: // (execute RefOf instruction and store to target) // (push 1) // end: // The only SuperName that can fail to exist is a node path if (defCondRefOf.superName.Tag == SuperName.TagValue.SimpleName && defCondRefOf.superName.GetAsSimpleName().Tag == SimpleName.TagValue.NameString) { JumpIfNodePathExists existsJump = new JumpIfNodePathExists( defCondRefOf.superName.GetAsSimpleName().GetAsNameString().nodePath); result.Add(existsJump); result.Add(new PushConst(new Integer(0))); Jump jumpOverExistsBranch = new Jump(); result.Add(jumpOverExistsBranch); existsJump.ThenTarget = result.Count; defCondRefOf.target.Accept(this); defCondRefOf.superName.Accept(this); result.Add(new RefOf()); result.Add(new Store()); result.Add(new Discard()); result.Add(new PushConst(new Integer(1))); jumpOverExistsBranch.Target = result.Count; } else { defCondRefOf.target.Accept(this); defCondRefOf.superName.Accept(this); result.Add(new RefOf()); result.Add(new Store()); result.Add(new Discard()); result.Add(new PushConst(new Integer(1))); } }
public virtual void Visit(AmlParser.DefCondRefOf defCondRefOf) { UnhandledNodeType("DefCondRefOf"); }