Example #1
0
        /// <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));
        }
Example #2
0
 /// <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));
 }
Example #3
0
        /// <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));
        }
Example #4
0
        /// <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));
        }
Example #5
0
        /// <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));
        }