11using Esprima . Ast ;
22using Jint . Native ;
33using Jint . Native . Generator ;
4+ using Jint . Native . Iterator ;
45using Jint . Native . Object ;
56
67namespace Jint . Runtime . Interpreter . Expressions
@@ -33,21 +34,20 @@ protected override ExpressionResult EvaluateInternal(EvaluationContext context)
3334
3435 if ( expression . Delegate )
3536 {
36- ExceptionHelper . ThrowNotImplementedException ( ) ;
37- // TODO return YieldDelegate(value);
37+ value = YieldDelegate ( value ) ;
3838 }
3939
4040 return new ExpressionResult ( ExpressionCompletionType . Return , Yield ( value ) , _expression . Location ) ;
4141 }
4242
43- /*
4443 /// <summary>
4544 /// https://tc39.es/ecma262/#sec-generator-function-definitions-runtime-semantics-evaluation
4645 /// </summary>
47- private object YieldDelegate(JsValue value)
46+ private JsValue YieldDelegate ( JsValue value )
4847 {
4948 var generatorKind = _engine . ExecutionContext . GetGeneratorKind ( ) ;
5049 var iterator = value . GetIterator ( _engine . Realm , generatorKind ) ;
50+ var iteratorRecord = iterator ;
5151 var received = new Completion ( CompletionType . Normal , JsValue . Undefined , default ) ;
5252 while ( true )
5353 {
@@ -83,9 +83,9 @@ private object YieldDelegate(JsValue value)
8383 else if ( received . Type == CompletionType . Throw )
8484 {
8585 var throwMethod = iterator . GetMethod ( "throw" ) ;
86- if (! throwMethod.IsUndefined() )
86+ if ( throwMethod is not null )
8787 {
88- var innerResult = throwMethod.Call(iterator, « received.[[ Value]] ») );
88+ var innerResult = throwMethod . Call ( iterator , new [ ] { received . Value } ) ;
8989 if ( generatorKind == GeneratorKind . Async )
9090 {
9191 innerResult = Await ( innerResult ) ;
@@ -97,8 +97,8 @@ private object YieldDelegate(JsValue value)
9797 ExceptionHelper . ThrowTypeError ( _engine . Realm ) ;
9898 }
9999
100- done = IteratorComplete(innerResult);
101- if (done is true )
100+ var done = IteratorComplete ( innerResult ) ;
101+ if ( done )
102102 {
103103 IteratorValue ( innerResult ) ;
104104 }
@@ -119,11 +119,11 @@ private object YieldDelegate(JsValue value)
119119 var closeCompletion = new Completion ( CompletionType . Normal , null , "" , _expression . Location ) ;
120120 if ( generatorKind == GeneratorKind . Async )
121121 {
122- AsyncIteratorClose(iteratorRecord, closeCompletion );
122+ AsyncIteratorClose ( iteratorRecord , CompletionType . Normal ) ;
123123 }
124124 else
125125 {
126- IteratorClose( iteratorRecord, closeCompletion );
126+ iteratorRecord . Close ( CompletionType . Normal ) ;
127127 }
128128
129129 ExceptionHelper . ThrowTypeError ( _engine . Realm , "Iterator does not have close method" ) ;
@@ -134,12 +134,13 @@ private object YieldDelegate(JsValue value)
134134 var returnMethod = iterator . GetMethod ( "return" ) ;
135135 if ( returnMethod is null )
136136 {
137+ var temp = received . Value ;
137138 if ( generatorKind == GeneratorKind . Async )
138139 {
139- received.Value = Await(received.Value);
140+ temp = Await ( received . Value ) ;
140141 }
141142
142- return received ;
143+ return temp ;
143144 }
144145
145146 var innerReturnResult = returnMethod . Call ( iterator , received . Value ) ;
@@ -156,8 +157,8 @@ private object YieldDelegate(JsValue value)
156157 var done = IteratorComplete ( innerReturnResult ) ;
157158 if ( done )
158159 {
159- var value = IteratorValue(innerReturnResult);
160- return new Completion(CompletionType.Return, value, "", _expression.Location) ;
160+ var val = IteratorValue ( innerReturnResult ) ;
161+ return val ;
161162 }
162163
163164 if ( generatorKind == GeneratorKind . Async )
@@ -167,30 +168,44 @@ private object YieldDelegate(JsValue value)
167168 else
168169 {
169170 received = GeneratorYield ( innerReturnResult ) ;
170-
171171 }
172172 }
173173 }
174174 }
175- */
176- private void AsyncIteratorClose ( object iteratorRecord , Completion closeCompletion )
175+
176+ private Completion GeneratorYield ( JsValue innerResult )
177+ {
178+ throw new System . NotImplementedException ( ) ;
179+ }
180+
181+ private static bool IteratorComplete ( JsValue iterResult )
182+ {
183+ return TypeConverter . ToBoolean ( iterResult . Get ( CommonProperties . Done ) ) ;
184+ }
185+
186+ private static JsValue IteratorValue ( JsValue iterResult )
187+ {
188+ return iterResult . Get ( CommonProperties . Value ) ;
189+ }
190+
191+ private void AsyncIteratorClose ( object iteratorRecord , CompletionType closeCompletion )
177192 {
178193 ExceptionHelper . ThrowNotImplementedException ( "async" ) ;
179194 }
180195
181196 /// <summary>
182197 /// https://tc39.es/ecma262/#sec-asyncgeneratoryield
183198 /// </summary>
184- private object AsyncGeneratorYield ( object iteratorValue )
199+ private Completion AsyncGeneratorYield ( object iteratorValue )
185200 {
186201 ExceptionHelper . ThrowNotImplementedException ( "async" ) ;
187- return null ;
202+ return default ;
188203 }
189204
190205 /// <summary>
191206 /// https://tc39.es/ecma262/#await
192207 /// </summary>
193- private ObjectInstance Await ( ObjectInstance innerResult )
208+ private ObjectInstance Await ( JsValue innerResult )
194209 {
195210 ExceptionHelper . ThrowNotImplementedException ( "await" ) ;
196211 return null ;
0 commit comments