private int SetFunction(ByteCode bc, int numPop) { int num = bc.Emit_Store(_funcSymbol, 0, 0); bc.Emit_Pop(numPop); return(num + 1); }
public override void Compile(ByteCode bc) { bc.PushSourceRef(m_RefFor); Loop L = new Loop() { Scope = m_StackFrame }; bc.LoopTracker.Loops.Push(L); m_End.Compile(bc); bc.Emit_ToNum(3); m_Step.Compile(bc); bc.Emit_ToNum(2); m_Start.Compile(bc); bc.Emit_ToNum(1); int start = bc.GetJumpPointForNextInstruction(); var jumpend = bc.Emit_Jump(OpCode.JFor, -1); bc.Emit_Enter(m_StackFrame); //bc.Emit_SymStorN(m_VarName); bc.Emit_Store(m_VarName, 0, 0); m_InnerBlock.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(m_RefEnd); bc.Emit_Debug("..end"); bc.Emit_Leave(m_StackFrame); bc.Emit_Incr(1); bc.Emit_Jump(OpCode.Jump, start); bc.LoopTracker.Loops.Pop(); int exitpoint = bc.GetJumpPointForNextInstruction(); foreach (Instruction i in L.BreakJumps) { i.NumVal = exitpoint; } jumpend.NumVal = exitpoint; bc.Emit_Pop(3); bc.PopSourceRef(); }
public override void Compile(ByteCode bc) { bc.PushSourceRef(_refFor); var l = new Loop { Scope = _stackFrame }; bc.LoopTracker.Loops.Push(l); _end.Compile(bc); bc.Emit_ToNum(3); _step.Compile(bc); bc.Emit_ToNum(2); _start.Compile(bc); bc.Emit_ToNum(1); int start = bc.GetJumpPointForNextInstruction(); var jumpend = bc.Emit_Jump(OpCode.JFor, -1); bc.Emit_Enter(_stackFrame); bc.Emit_Store(_varName, 0, 0); _innerBlock.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(_refEnd); bc.Emit_Leave(_stackFrame); bc.Emit_Incr(1); bc.Emit_Jump(OpCode.Jump, start); bc.LoopTracker.Loops.Pop(); int exitpoint = bc.GetJumpPointForNextInstruction(); foreach (var i in l.BreakJumps) { i.NumVal = exitpoint; } jumpend.NumVal = exitpoint; bc.Emit_Pop(3); bc.PopSourceRef(); }
public override void Compile(ByteCode bc) { var meta = bc.Emit_Meta("<chunk-root>", OpCodeMetadataType.ChunkEntrypoint); int metaip = bc.GetJumpPointForLastInstruction(); bc.Emit_BeginFn(_stackFrame); bc.Emit_Args(_varArgs); bc.Emit_Load(SymbolRef.Upvalue(WellKnownSymbols.ENV, 0)); bc.Emit_Store(_env, 0, 0); bc.Emit_Pop(); _block.Compile(bc); bc.Emit_Ret(0); meta.NumVal = bc.GetJumpPointForLastInstruction() - metaip; }
public int CompileBody(ByteCode bc, string friendlyName) { string funcName = friendlyName ?? $"<{_begin.FormatLocation(bc.Script)}>"; bc.PushSourceRef(_begin); var I = bc.Emit_Jump(OpCode.Jump, -1); var meta = bc.Emit_Meta(funcName, OpCodeMetadataType.FunctionEntrypoint); int metaip = bc.GetJumpPointForLastInstruction(); bc.Emit_BeginFn(_stackFrame); bc.LoopTracker.Loops.Push(new LoopBoundary()); int entryPoint = bc.GetJumpPointForLastInstruction(); if (_usesGlobalEnv) { bc.Emit_Load(SymbolRef.Upvalue(WellKnownSymbols.ENV, 0)); bc.Emit_Store(_env, 0, 0); bc.Emit_Pop(); } if (_paramNames.Length > 0) { bc.Emit_Args(_paramNames); } _statement.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(_end); bc.Emit_Ret(0); bc.LoopTracker.Loops.Pop(); I.NumVal = bc.GetJumpPointForNextInstruction(); meta.NumVal = bc.GetJumpPointForLastInstruction() - metaip; bc.PopSourceRef(); return(entryPoint); }
public int CompileBody(ByteCode bc, string friendlyName) { string funcName = friendlyName ?? ("<" + this.m_Begin.FormatLocation(bc.Script, true) + ">"); bc.PushSourceRef(m_Begin); Instruction I = bc.Emit_Jump(OpCode.Jump, -1); Instruction meta = bc.Emit_FuncMeta(funcName); int metaip = bc.GetJumpPointForLastInstruction(); bc.Emit_BeginFn(m_StackFrame); bc.LoopTracker.Loops.Push(new LoopBoundary()); int entryPoint = bc.GetJumpPointForLastInstruction(); if (m_GlobalEnv != null) { bc.Emit_Literal(DynValue.NewTable(m_GlobalEnv)); bc.Emit_Store(m_Env, 0, 0); bc.Emit_Pop(); } if (m_ParamNames.Length > 0) { bc.Emit_Args(m_ParamNames); } m_Statement.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(m_End); bc.Emit_Ret(0); bc.LoopTracker.Loops.Pop(); I.NumVal = bc.GetJumpPointForNextInstruction(); meta.NumVal = bc.GetJumpPointForLastInstruction() - metaip; bc.PopSourceRef(); return(entryPoint); }
public int CompileBody(ByteCode bc, string friendlyName) { string funcName = friendlyName ?? ("<" + this.m_Begin.FormatLocation(bc.Script, true) + ">"); bc.PushSourceRef(m_Begin); int I = bc.Emit_Jump(OpCode.Jump, -1); int meta = bc.Emit_Meta(funcName, OpCodeMetadataType.FunctionEntrypoint); bc.Emit_BeginFn(m_StackFrame); bc.LoopTracker.Loops.Push(new LoopBoundary()); int entryPoint = bc.GetJumpPointForLastInstruction(); if (m_UsesGlobalEnv) { bc.Emit_Load(SymbolRef.Upvalue(WellKnownSymbols.ENV, 0)); bc.Emit_Store(m_Env, 0, 0); bc.Emit_Pop(); } if (m_ParamNames.Length > 0) { bc.Emit_Args(m_ParamNames); } m_Statement.Compile(bc); bc.PopSourceRef(); bc.PushSourceRef(m_End); bc.Emit_Ret(0); bc.LoopTracker.Loops.Pop(); bc.SetNumVal(I, bc.GetJumpPointForNextInstruction()); bc.SetNumVal(meta, bc.GetJumpPointForLastInstruction() - meta); bc.PopSourceRef(); return(entryPoint); }
public override void Compile(ByteCode bc) { using (bc.EnterSource(_sourceRef)) { if (_local) { bc.Emit_Literal(DynValue.Nil); bc.Emit_Store(_funcSymbol, 0, 0); _funcDef.Compile(bc, () => this.SetFunction(bc, 2), _friendlyName); } else if (_methodName == null) { _funcDef.Compile(bc, () => this.SetFunction(bc, 1), _friendlyName); } else { _funcDef.Compile(bc, () => this.SetMethod(bc), _friendlyName); } } }
public void CompileAssignment(ByteCode bc, int stackofs, int tupleidx) { bc.Emit_Store(_ref, stackofs, tupleidx); }