Exemple #1
0
 /// <summary>
 /// Initializes a new instance of the <see cref="Closure"/> class.
 /// </summary>
 /// <param name="script">The script.</param>
 /// <param name="idx">The index.</param>
 /// <param name="resolvedLocals">The resolved locals.</param>
 internal Closure(Script script, int idx, ClosureRefValue[] resolvedLocals)
 {
     isAlive     = true;
     OwnerScript = script;
     EntryPointByteCodeLocation = idx;
     ClosureContext             = new ClosureContext(resolvedLocals);
     script.RegisterClosure(this);
 }
Exemple #2
0
        /// <summary>
        /// Initializes a new instance of the <see cref="Closure"/> class.
        /// </summary>
        /// <param name="script">The script.</param>
        /// <param name="idx">The index.</param>
        /// <param name="symbols">The symbols.</param>
        /// <param name="resolvedLocals">The resolved locals.</param>
        internal Closure(Script script, int idx, SymbolRef[] symbols, IEnumerable <DynValue> resolvedLocals)
        {
            OwnerScript = script;

            EntryPointByteCodeLocation = idx;

            if (symbols.Length > 0)
            {
                ClosureContext = new ClosureContext(symbols, resolvedLocals);
            }
            else
            {
                ClosureContext = emptyClosure;
            }
        }
Exemple #3
0
        public override Value Evaluate()
        {
            Value value = block.Evaluate();

            if (value.IsNil)
            {
                return(null);
            }
            switch (type)
            {
            case "return":
                Runtime.State.ReturnSignal = true;
                Runtime.State.ReturnValue  = value;
                return(value);

            case "exit":
                if (value.IsEmpty || value.IsTrue)
                {
                    Runtime.State.ExitSignal = true;
                }
                return(null);

            case "continue":
                if (value.IsEmpty || value.IsTrue)
                {
                    Runtime.State.SkipSignal = true;
                }
                return(null);

            case "yield":
                IStringify stringify;
                if (value.IsA(out stringify))
                {
                    value = stringify.String;
                }
                ClosureContext context = Runtime.State.ClosureContext;
                if (context == null)
                {
                    return(value);
                }
                ArrayYielder yielder = context.Yielder;
                yielder.Add(value.Resolve());
                return(value);
            }
            return(null);
        }