示例#1
0
        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));
        }
示例#2
0
        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));
        }
示例#3
0
        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));
示例#4
0
        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));
            }
        }
示例#5
0
 public EcmaValue CreateIterResultObject(EcmaValue value)
 {
     return(EcmaValueUtility.CreateIterResultObject(value, done));
 }
示例#6
0
 private void Resolve(EcmaValue value, bool done)
 {
     queue.Dequeue().Capability.Resolve(EcmaValueUtility.CreateIterResultObject(value, done));
 }