Skip to content

Commit aeea811

Browse files
committed
some star yielding
1 parent 9b47695 commit aeea811

File tree

2 files changed

+38
-23
lines changed

2 files changed

+38
-23
lines changed

Jint/Native/JsValue.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -37,7 +37,7 @@ internal JsValue(InternalTypes type)
3737

3838
[Pure]
3939
[MethodImpl(MethodImplOptions.AggressiveInlining)]
40-
internal IIterator GetIterator(Realm realm, GeneratorKind hint = GeneratorKind.Sync, ICallable method = null)
40+
internal IteratorInstance GetIterator(Realm realm, GeneratorKind hint = GeneratorKind.Sync, ICallable method = null)
4141
{
4242
if (!TryGetIterator(realm, out var iterator, hint, method))
4343
{
@@ -49,7 +49,7 @@ internal IIterator GetIterator(Realm realm, GeneratorKind hint = GeneratorKind.S
4949

5050
[Pure]
5151
[MethodImpl(MethodImplOptions.AggressiveInlining)]
52-
internal bool TryGetIterator(Realm realm, out IIterator iterator, GeneratorKind hint = GeneratorKind.Sync, ICallable method = null)
52+
internal bool TryGetIterator(Realm realm, out IteratorInstance iterator, GeneratorKind hint = GeneratorKind.Sync, ICallable method = null)
5353
{
5454
var obj = TypeConverter.ToObject(realm, this);
5555

@@ -84,7 +84,7 @@ internal bool TryGetIterator(Realm realm, out IIterator iterator, GeneratorKind
8484
ExceptionHelper.ThrowTypeError(realm, "Result of the Symbol.iterator method is not an object");
8585
}
8686

87-
if (iteratorResult is IIterator i)
87+
if (iteratorResult is IteratorInstance i)
8888
{
8989
iterator = i;
9090
}

Jint/Runtime/Interpreter/Expressions/JintYieldExpression.cs

Lines changed: 35 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
using Esprima.Ast;
22
using Jint.Native;
33
using Jint.Native.Generator;
4+
using Jint.Native.Iterator;
45
using Jint.Native.Object;
56

67
namespace 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

Comments
 (0)