DCPUB.Ast.Target.GetOperand C# (CSharp) Метод

GetOperand() публичный Метод

public GetOperand ( TargetUsage usage, Intermediate semantics = Intermediate.OperandSemantics.None, ushort offset ) : Intermediate.Operand
usage TargetUsage
semantics Intermediate
offset ushort
Результат Intermediate.Operand
        public Intermediate.Operand GetOperand(TargetUsage usage,
            Intermediate.OperandSemantics semantics = Intermediate.OperandSemantics.None, 
            ushort offset = 0)
        {
            if (target == Targets.Stack)
            {
                switch (usage)
                {
                    case TargetUsage.Peek: return CompilableNode.Operand("PEEK", semantics, offset);
                    case TargetUsage.Push: return CompilableNode.Operand("PUSH", semantics, offset);
                    case TargetUsage.Pop: return CompilableNode.Operand("POP", semantics, offset);
                }
            }
            else if (target == Targets.Discard)
                throw new InternalError("Unable to get operand from target with semantic 'discard'.");
            else if (target == Targets.Raw)
                return new Intermediate.Operand
                {
                    register = (Intermediate.OperandRegister)virtualId,
                    semantics = semantics,
                    constant = offset
                };
            else
                return CompilableNode.Virtual(virtualId, semantics, offset);
            throw new InternalError("Unknown error while getting operand from target.");
        }

Usage Example

Пример #1
0
 public override Intermediate.IRNode Emit(CompileContext context, Model.Scope scope, Target target)
 {
     var r = new TransientNode();
     if (_struct.size == 0) throw new InternalError("Struct size not yet determined");
     r.AddInstruction(Instructions.SET, target.GetOperand(TargetUsage.Push),
         Constant((ushort)_struct.size));
     return r;
 }
All Usage Examples Of DCPUB.Ast.Target::GetOperand