// 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()); }
// 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()); }
public override void Emit(Emitter e) { foreach (var s in Statements) { s.Emit(e); if (s != Statements.Last()) { e.Out(Opcodes.EOS); } } }
public override void Emit(Emitter e) { foreach (var s in Statements) { s.Emit(e); if (!(s is AstTypedef)) { e.Out(Opcodes.EOS); } } }
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); }
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); }
///============================================================================================ /// /// 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); }
public override void Emit(Emitter e) { e.OutSeg(ExpressionBlock.Create("&d", ExpressionKinds.Closed, Value.Compile(), Value.DataType)); e.Out(Opcodes.LDACCBLK); e.OutCall(Func); }