public virtual EcmaValue Next() { if (this.IteratedObject == null) { return(EcmaValueUtility.CreateIterResultObject(EcmaValue.Undefined, true)); } if (iterator.MoveNext()) { KeyValuePair <EcmaValue, EcmaValue> entry = iterator.Current; switch (this.ResultKind) { case EcmaIteratorResultKind.Key: return(EcmaValueUtility.CreateIterResultObject(entry.Key, false)); case EcmaIteratorResultKind.Value: return(EcmaValueUtility.CreateIterResultObject(entry.Value, false)); case EcmaIteratorResultKind.Entry: return(EcmaValueUtility.CreateIterResultObject(new EcmaArray(new[] { entry.Key, entry.Value }), false)); } throw new InvalidOperationException("Unknown kind value"); } Close(); return(EcmaValueUtility.CreateIterResultObject(EcmaValue.Undefined, true)); }
EcmaValue IGeneratorEnumerable.Resume(GeneratorResumeState state, EcmaValue value) { switch (state) { case GeneratorResumeState.Return: throw new GeneratorClosedException(value); case GeneratorResumeState.Throw: throw EcmaException.FromValue(value); } if (MoveNext()) { return(EcmaValueUtility.CreateIterResultObject(this.Current, false)); } return(EcmaValueUtility.CreateIterResultObject(EcmaValue.Undefined, true)); }
public override EcmaValue Resume(GeneratorResumeState state, EcmaValue value) { if (this.State == GeneratorState.Running) { throw new EcmaTypeErrorException(InternalString.Error.GeneratorRunning); } nextState = state; if (this.State != GeneratorState.SuspendedYield) { switch (state) { case GeneratorResumeState.Throw: Close(); throw EcmaException.FromValue(value); case GeneratorResumeState.Return: Close(); return(EcmaValueUtility.CreateIterResultObject(value, true)); } } else { resumeValue = value; } if (this.State != GeneratorState.Closed) { try { this.State = GeneratorState.Running; if (TryYieldNext(out EcmaValue result)) { return(EcmaValueUtility.CreateIterResultObject(result, false)); } } catch { if (nextState != GeneratorResumeState.Return) { Close(); throw; } } finally { if (this.State != GeneratorState.Closed) { this.State = GeneratorState.SuspendedYield; } } Close(); } return(EcmaValueUtility.CreateIterResultObject(nextState == GeneratorResumeState.Return ? resumeValue : default, true));
public override EcmaValue Resume(GeneratorResumeState state, EcmaValue value) { if (this.State != GeneratorState.Closed) { this.State = GeneratorState.Running; } try { EcmaValue result = default; bool done = true; switch (state) { case GeneratorResumeState.Resume: done = !iterator.MoveNext(value); result = iterator.Current; break; case GeneratorResumeState.Return: if (!TryGetResult(WellKnownProperty.Return, value, out done, out result)) { this.State = GeneratorState.Closed; return(Promise.Resolve(EcmaValueUtility.CreateIterResultObject(value, true))); } break; case GeneratorResumeState.Throw: if (!TryGetResult(WellKnownProperty.Throw, value, out done, out result)) { this.State = GeneratorState.Closed; return(Promise.Reject(value)); } break; } if (done) { this.State = GeneratorState.Closed; } return(Promise.Resolve(result, new ResultHandler(done).CreateIterResultObject, null)); } catch (Exception ex) { return(Promise.Reject(ex)); } }
public EcmaValue CreateIterResultObject(EcmaValue value) { return(EcmaValueUtility.CreateIterResultObject(value, done)); }
private void Resolve(EcmaValue value, bool done) { queue.Dequeue().Capability.Resolve(EcmaValueUtility.CreateIterResultObject(value, done)); }