/// <summary> /// Creates a closure from a bytecode address. /// </summary> /// <param name="address">The address.</param> /// <param name="envTable">The env table to create a 0-upvalue</param> /// <returns></returns> private DynValue MakeClosure(int address, Table envTable = null) { this.CheckScriptOwnership(envTable); Closure c; if (envTable == null) { c = new Closure(this, address, new SymbolRef[0], new DynValue[0]); } else { var syms = new SymbolRef[1] { new SymbolRef() { i_Env = null, i_Index = 0, i_Name = WellKnownSymbols.ENV, i_Type = SymbolRefType.DefaultEnv }, }; var vals = new DynValue[1] { DynValue.NewTable(envTable) }; c = new Closure(this, address, syms, vals); } return(DynValue.NewClosure(c)); }
/// <summary> /// Calls this function with the specified args /// </summary> /// <param name="args">The arguments (count > 0) to pass to the function. (Argument 0 MUST be empty!)</param> /// <returns></returns> /// <exception cref="System.ArgumentException">Thrown if function is not of DataType.Function</exception> public DynValue Call(IList <DynValue> args) { if (!isAlive) { throw new InvalidOperationException(string.Format("Attempting to Call on dead Closure")); } return(OwnerScript.Call(DynValue.NewClosure(this), args)); }
/// <summary> /// Creates a closure from a bytecode address. /// </summary> /// <param name="address">The address.</param> /// <returns></returns> private DynValue MakeClosure(int address) { Closure c = new Closure(this, address, new SymbolRef[0], new DynValue[0]); return(DynValue.NewClosure(c)); }
/// <summary> /// Creates a closure from a bytecode address. /// </summary> /// <param name="address">The address.</param> /// <param name="envTable">The env table to create a 0-upvalue</param> /// <returns></returns> private DynValue MakeClosure(int address, Table envTable = null) { if (!m_isAlive) { throw new InvalidOperationException(string.Format("Attempting to make a closure on dead Script [{0}]", FriendlyName)); } this.CheckScriptOwnership(envTable); Closure c; if (envTable == null) { Instruction meta = m_MainProcessor.FindMeta(ref address); // if we find the meta for a new chunk, we use the value in the meta for the _ENV upvalue if ((meta != null) && (meta.NumVal2 == (int)OpCodeMetadataType.ChunkEntrypoint)) { var index = HeapAllocatedDynValue.Allocate(ref meta.Value); ClosureRefValue refValue = new ClosureRefValue(SymbolRef.Upvalue(WellKnownSymbols.ENV, 0), index); c = new Closure(this, address, new ClosureRefValue[] { refValue }); HeapAllocatedDynValue.DecreaseReferenceCount(index); } else { ClosureRefValue[] refValue = new ClosureRefValue[0]; c = new Closure(this, address, refValue); } } else { var syms = new SymbolRef[] { new SymbolRef() { i_Env = null, i_Index = 0, i_Name = WellKnownSymbols.ENV, i_Type = SymbolRefType.DefaultEnv }, }; var d = DynValue.NewTable(envTable); var index = HeapAllocatedDynValue.Allocate(ref d); ClosureRefValue refValue = new ClosureRefValue(syms[0], index); c = new Closure(this, address, new ClosureRefValue[] { refValue }); HeapAllocatedDynValue.DecreaseReferenceCount(index); } return(DynValue.NewClosure(c)); }
/// <summary> /// Creates a closure from a bytecode address. /// </summary> /// <param name="address">The address.</param> /// <param name="envTable">The env table to create a 0-upvalue</param> /// <returns></returns> private DynValue MakeClosure(int address, Table envTable = null) { this.CheckScriptOwnership(envTable); Closure c; if (envTable == null) { Instruction meta = m_MainProcessor.FindMeta(ref address); // if we find the meta for a new chunk, we use the value in the meta for the _ENV upvalue if ((meta != null) && (meta.NumVal2 == (int)OpCodeMetadataType.ChunkEntrypoint)) { c = new Closure(this, address, new SymbolRef[] { SymbolRef.Upvalue(WellKnownSymbols.ENV, 0) }, new DynValue[] { meta.Value }); } else { c = new Closure(this, address, new SymbolRef[0], new DynValue[0]); } } else { var syms = new SymbolRef[] { new SymbolRef() { i_Env = null, i_Index = 0, i_Name = WellKnownSymbols.ENV, i_Type = SymbolRefType.DefaultEnv }, }; var vals = new DynValue[] { DynValue.NewTable(envTable) }; c = new Closure(this, address, syms, vals); } return(DynValue.NewClosure(c)); }