public override void Compile(Kernel k) { Symbol returnSymbol = k.Lookup("+return"); if (this.Value != null) this.Value.Compile(k); else k.Emit(Opcode.PUSHNIL); var rvn = new RetrieveVariableNode(-1, -1) {VariableName = "+return"}; rvn.PrePass(k); rvn.PreCompile(k); rvn.Compile(k); uint mem = 0; Scope current = k.CurrentScope; while(current != returnSymbol.SScope) { mem += current.MemorySpace; current.PopMemory(k, false); current = current.Parent; } mem += current.MemorySpace; current.PopMemory(k, false); k.EmitPush(mem + "u").Comment = "deallocate function memory"; k.Emit(Opcode.DEALLOC); k.Emit(Opcode.JUMP).SetDebug(File, Line, Column, DebugType.Return, ""); }
protected void CompileLibrary(Kernel k) { for (int i = this.Arguments.Count - 1; i >= 0; i--) { this.Arguments[i].Compile(k); } uint returnId = k.CurrentScope.RequestLabelId(); k.Emit(Opcode.PLABL, "\"sl_r_" + k.GetScopeName() + "_" + returnId.ToString() + "\""); var rvn = new RetrieveVariableNode(-1, -1) { VariableName = this.Function }; rvn.PrePass(k); rvn.PreCompile(k); rvn.Compile(k); k.CurrentScope.PushMemory(k); k.Emit(Opcode.JUMP).SetDebug(File, Line, Column, DebugType.LCall, this.Function); k.Emit(Opcode.LABEL, "sl_r_" + k.GetScopeName() + "_" + returnId.ToString()).Comment = "return point from " + this.Function; k.CurrentScope.PopMemory(k); }