/// <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); }
/// <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; } }
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); }