示例#1
0
        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)));
            }
        }
示例#2
0
 public virtual void Visit(AmlParser.DefCondRefOf defCondRefOf)
 {
     UnhandledNodeType("DefCondRefOf");
 }