コード例 #1
0
        // create code segment wrapped for fold and deffunc, called via Invoke
        public ByteCode Compile(Symbol invop, string opname, TypedValue seed)
        {
            var e = new Emitter();

            e.OutName(Opcodes.LDCATR, opname);
            e.Out(Opcodes.LDACCBLK);
            e.OutLoad(NumberValue.Create(-1));
            e.Out(Opcodes.LDAGG, seed);
            Emit(e);
            e.OutCall(invop, 2); // no choice but two args
            return(e.GetCode());
        }
コード例 #2
0
        // create code segment wrapped for fold
        public ByteCode Compile(Symbol op, TypedValue seed, CallInfo callinfo)
        {
            var e = new Emitter();

            e.Out(Opcodes.LDAGG, seed);
            Emit(e);
            e.OutCall(op, 0, callinfo);
            return(e.GetCode());
        }
コード例 #3
0
 public override void Emit(Emitter e)
 {
     foreach (var s in Statements)
     {
         s.Emit(e);
         if (s != Statements.Last())
         {
             e.Out(Opcodes.EOS);
         }
     }
 }
コード例 #4
0
 public override void Emit(Emitter e)
 {
     foreach (var s in Statements)
     {
         s.Emit(e);
         if (!(s is AstTypedef))
         {
             e.Out(Opcodes.EOS);
         }
     }
 }
コード例 #5
0
        public override void Emit(Emitter e)
        {
            Logger.Assert(DataType.IsVariable || DataType == DataTypes.Void, DataType);

            e.Out(Opcodes.LDACCBLK);
            e.OutLoad(NumberValue.Create(AccumIndex));
            e.OutLoad(DataType.DefaultValue());
            var seed = FoldedOp.GetSeed(DataType);
            var code = (FoldedOp.IsDefFunc)
          ? FoldedExpr.Compile(InvokeOp, CallInfo.Name, seed)
          : FoldedExpr.Compile(FoldedOp, seed, CallInfo);
            var eb = ExpressionBlock.Create("&i", ExpressionKinds.IsFolded, code, FoldedExpr.DataType, null, AccumIndex);

            e.OutSeg(eb);
            e.OutCall(Func);
        }
コード例 #6
0
 public override void Emit(Emitter e)
 {
     Logger.Assert(DataType.IsVariable || DataType == DataTypes.Void, DataType);
     Logger.Assert(Name == null || Code == null);
     if (Name != null)
     {
         e.OutName(Opcodes.LDCATR, Name);
     }
     else
     {
         Code.Emit(e);
     }
     e.Out(Opcodes.LDACCBLK);
     e.OutLoad(NumberValue.Create(AccumBase));
     foreach (var a in Arguments)
     {
         a.Emit(e);
     }
     e.OutCall(Func, NumVarArgs);
 }
コード例 #7
0
        ///============================================================================================
        ///
        /// Emit and execute
        ///

        ByteCode Emit(AstStatement statement)
        {
            Logger.Assert(statement.DataType != null);
            Logger.WriteLine(4, "|{0}", statement); // nopad
            var emitter = new Emitter();

            statement.Emit(emitter);
            if (statement.DataType.IsVariable)
            {
                //if (statement.DataType != DataTypes.Void) {
                emitter.OutCall(Symbols.FindIdent("pp"));
                emitter.OutCall(Symbols.FindIdent("write"));
            }
            // statement will have left value on stack (even if void)
            if (!(statement is AstTypedef))
            {
                emitter.Out(Opcodes.EOS);
            }
            var code = emitter.GetCode();

            return(code);
        }
コード例 #8
0
 public override void Emit(Emitter e)
 {
     e.OutSeg(ExpressionBlock.Create("&d", ExpressionKinds.Closed, Value.Compile(), Value.DataType));
     e.Out(Opcodes.LDACCBLK);
     e.OutCall(Func);
 }