示例#1
0
 public override void Emit(Emitter e)
 {
     Logger.Assert(DataType.IsVariable || DataType == DataTypes.Void, DataType);
     foreach (var a in Arguments)
     {
         a.Emit(e);
     }
     e.OutCall(Func, NumVarArgs, CallInfo);
 }
示例#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)
 {
     Logger.Assert(DataType.IsVariable || DataType == DataTypes.Void, DataType);
     e.OutLoad(TextValue.Create(UserFunc.DataType.Name));
     foreach (var a in Arguments)
     {
         a.Emit(e);
     }
     e.OutCall(Func, NumVarArgs);
 }
示例#4
0
        public override void Emit(Emitter e)
        {
            Logger.Assert(DataType is DataTypeRelation || DataType is DataTypeTuple);

            e.OutLoad(HeadingValue.Create(DataType.Heading));
            foreach (var a in Arguments)
            {
                a.Emit(e);
            }
            e.OutCall(Func, Arguments.Length);
        }
示例#5
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());
        }
示例#6
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);
        }
示例#7
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);
        }
示例#8
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);
 }
示例#9
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);
 }