Skip to content

Commit c15d3f7

Browse files
committed
.
1 parent 289bb76 commit c15d3f7

File tree

9 files changed

+195
-86
lines changed

9 files changed

+195
-86
lines changed

languagetests.md

Lines changed: 14 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
BlockScope_shadowing
2+
BlockScope_shadowing("language/block-scope/shadowing/catch-parameter-shadowing-catch-parameter.js",False)
3+
BlockScope_shadowing("language/block-scope/shadowing/catch-parameter-shadowing-var-variable.js",False)
4+
BlockScope_shadowing("language/block-scope/shadowing/const-declaration-shadowing-catch-parameter.js",False)
5+
BlockScope_shadowing("language/block-scope/shadowing/const-declarations-shadowing-parameter-name-let-const-and-var-variables.js",False)
6+
BlockScope_shadowing("language/block-scope/shadowing/parameter-name-shadowing-catch-parameter.js",False)
7+
Expressions_class_decorator_syntax_classValid
8+
Expressions_class_decorator_syntax_classValid("language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js",False)
9+
Expressions_class_decorator_syntax_classValid("language/expressions/class/decorator/syntax/class-valid/decorator-member-expr-private-identifier.js",True)
110
Expressions_dynamicImport
211
Expressions_dynamicImport("language/expressions/dynamic-import/returns-promise.js",False)
312
Expressions_dynamicImport("language/expressions/dynamic-import/returns-promise.js",True)
@@ -7,22 +16,11 @@
716
Expressions_dynamicImport_assignmentExpression("language/expressions/dynamic-import/assignment-expression/import-meta.js",True)
817
Expressions_function
918
Expressions_function("language/expressions/function/param-dflt-yield-non-strict.js",False)
10-
Expressions_generators
11-
Expressions_generators("language/expressions/generators/named-no-strict-reassign-fn-name-in-body-in-arrow.js",False)
12-
Expressions_generators("language/expressions/generators/named-no-strict-reassign-fn-name-in-body-in-eval.js",False)
13-
Expressions_generators("language/expressions/generators/named-no-strict-reassign-fn-name-in-body.js",False)
14-
Expressions_generators("language/expressions/generators/scope-name-var-open-non-strict.js",False)
1519
Expressions_import_meta
1620
Expressions_import_meta("language/expressions/import.meta/distinct-for-each-module.js",True)
1721
Expressions_import_meta("language/expressions/import.meta/import-meta-is-an-ordinary-object.js",True)
1822
Expressions_import_meta("language/expressions/import.meta/not-accessible-from-direct-eval.js",True)
1923
Expressions_import_meta("language/expressions/import.meta/same-object-returned.js",True)
20-
Expressions_object_methodDefinition
21-
Expressions_object_methodDefinition("language/expressions/object/method-definition/generator-invoke-fn-no-strict.js",False)
22-
Expressions_object_methodDefinition("language/expressions/object/method-definition/generator-super-prop-param.js",False)
23-
Expressions_object_methodDefinition("language/expressions/object/method-definition/generator-super-prop-param.js",True)
24-
Expressions_object_methodDefinition("language/expressions/object/method-definition/name-super-prop-param.js",False)
25-
Expressions_object_methodDefinition("language/expressions/object/method-definition/name-super-prop-param.js",True)
2624
Expressions_optionalChaining
2725
Expressions_optionalChaining("language/expressions/optional-chaining/eval-optional-call.js",False)
2826
Expressions_optionalChaining("language/expressions/optional-chaining/eval-optional-call.js",True)
@@ -35,33 +33,23 @@
3533
Expressions_prefixDecrement("language/expressions/prefix-decrement/eval-nostrict.js",False)
3634
Expressions_prefixIncrement
3735
Expressions_prefixIncrement("language/expressions/prefix-increment/eval-nostrict.js",False)
38-
Expressions_yield
39-
Expressions_yield("language/expressions/yield/star-rhs-iter-thrw-res-done-no-value.js",False)
40-
Expressions_yield("language/expressions/yield/star-rhs-iter-thrw-res-done-no-value.js",True)
41-
Expressions_yield("language/expressions/yield/star-rhs-iter-thrw-res-value-final.js",False)
42-
Expressions_yield("language/expressions/yield/star-rhs-iter-thrw-res-value-final.js",True)
4336
FunctionCode
4437
FunctionCode("language/function-code/10.4.3-1-104.js",True)
4538
FunctionCode("language/function-code/10.4.3-1-106.js",True)
46-
FutureReservedWords
47-
FutureReservedWords("language/future-reserved-words/static.js",False)
48-
GlobalCode
49-
GlobalCode("language/global-code/decl-lex-restricted-global.js",True)
50-
GlobalCode("language/global-code/script-decl-func-err-non-extensible.js",False)
51-
GlobalCode("language/global-code/script-decl-func-err-non-extensible.js",True)
52-
GlobalCode("language/global-code/script-decl-lex-var-declared-via-eval.js",False)
5339
ModuleCode_topLevelAwait
5440
ModuleCode_topLevelAwait("language/module-code/top-level-await/async-module-does-not-block-sibling-modules.js",True)
5541
ModuleCode_topLevelAwait("language/module-code/top-level-await/await-dynamic-import-resolution.js",True)
5642
ModuleCode_topLevelAwait("language/module-code/top-level-await/module-graphs-does-not-hang.js",True)
5743
ModuleCode_topLevelAwait_syntax
5844
ModuleCode_topLevelAwait_syntax("language/module-code/top-level-await/syntax/await-expr-dyn-import.js",True)
59-
ReservedWords
60-
ReservedWords("language/reserved-words/unreserved-words.js",False)
61-
ReservedWords("language/reserved-words/unreserved-words.js",True)
6245
Statements_asyncGenerator
6346
Statements_asyncGenerator("language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js",False)
6447
Statements_asyncGenerator("language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js",True)
48+
Statements_class
49+
Statements_class("language/statements/class/static-init-scope-var-close.js",False)
50+
Statements_class("language/statements/class/static-init-scope-var-close.js",True)
51+
Statements_class("language/statements/class/static-init-scope-var-open.js",False)
52+
Statements_class("language/statements/class/static-init-scope-var-open.js",True)
6553
Statements_class_definition
6654
Statements_class_definition("language/statements/class/definition/invalid-extends.js",True)
6755
Statements_class_elements_syntax_valid
@@ -74,18 +62,3 @@
7462
Statements_const_syntax("language/statements/const/syntax/const-invalid-assignment-next-expression-for.js",True)
7563
Statements_function
7664
Statements_function("language/statements/function/param-dflt-yield-non-strict.js",False)
77-
Statements_labeled
78-
Statements_labeled("language/statements/labeled/value-await-non-module.js",False)
79-
Statements_labeled("language/statements/labeled/value-await-non-module.js",True)
80-
Statements_labeled("language/statements/labeled/value-yield-non-strict.js",False)
81-
Statements_switch
82-
Statements_switch("language/statements/switch/scope-lex-async-function.js",False)
83-
Statements_variable
84-
Statements_variable("language/statements/variable/binding-resolution.js",False)
85-
Statements_variable_dstr
86-
Statements_variable_dstr("language/statements/variable/dstr/obj-ptrn-elem-id-static-init-await-valid.js",False)
87-
Statements_variable_dstr("language/statements/variable/dstr/obj-ptrn-elem-id-static-init-await-valid.js",True)
88-
Statements_with
89-
Statements_with("language/statements/with/has-binding-call-with-proxy-env.js",False)
90-
Statements_with("language/statements/with/set-mutable-binding-binding-deleted-in-get-unscopables-strict-mode.js",False)
91-
Statements_with("language/statements/with/set-mutable-binding-binding-deleted-with-typed-array-in-proto-chain.js",False)

src/Asynkron.JsEngine/Ast/TypedAstEvaluator.AsyncGeneratorFactory.cs

Lines changed: 75 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -287,17 +287,90 @@ public override string ToString()
287287
: "[AsyncGeneratorFunction]";
288288
}
289289

290+
private void EnsureAsyncGeneratorIntrinsics()
291+
{
292+
// %AsyncIteratorPrototype% (inherits from %Object.prototype%)
293+
if (_realmState.AsyncIteratorPrototype is null)
294+
{
295+
var asyncIteratorProto = new JsObject();
296+
if (_realmState.ObjectPrototype is not null)
297+
{
298+
asyncIteratorProto.SetPrototype(_realmState.ObjectPrototype);
299+
}
300+
301+
_realmState.AsyncIteratorPrototype = asyncIteratorProto;
302+
}
303+
304+
// %AsyncGeneratorPrototype% (inherits from %AsyncIteratorPrototype%)
305+
if (_realmState.AsyncGeneratorPrototype is null)
306+
{
307+
var asyncGenProto = new JsObject();
308+
asyncGenProto.SetPrototype(_realmState.AsyncIteratorPrototype ?? _realmState.ObjectPrototype);
309+
_realmState.AsyncGeneratorPrototype = asyncGenProto;
310+
}
311+
312+
// %AsyncGeneratorFunction.prototype%
313+
if (_realmState.AsyncGeneratorFunctionPrototype is null && _realmState.FunctionPrototype is not null)
314+
{
315+
var asyncGenFuncProto = new JsObject();
316+
asyncGenFuncProto.SetPrototype(_realmState.FunctionPrototype);
317+
318+
asyncGenFuncProto.DefineProperty("prototype",
319+
new PropertyDescriptor
320+
{
321+
Value = _realmState.AsyncGeneratorPrototype,
322+
Writable = false,
323+
Enumerable = false,
324+
Configurable = true,
325+
HasValue = true,
326+
HasWritable = true,
327+
HasEnumerable = true,
328+
HasConfigurable = true
329+
});
330+
331+
// Minimal AsyncGeneratorFunction constructor so constructor.prototype.prototype matches spec shape
332+
if (_realmState.AsyncGeneratorFunctionConstructor is null)
333+
{
334+
var constructor = new HostFunction(_ => null);
335+
constructor.Properties.SetPrototype(_realmState.FunctionPrototype);
336+
constructor.SetProperty("prototype", asyncGenFuncProto);
337+
_realmState.AsyncGeneratorFunctionConstructor = constructor;
338+
}
339+
340+
asyncGenFuncProto.DefineProperty("constructor",
341+
new PropertyDescriptor
342+
{
343+
Value = _realmState.AsyncGeneratorFunctionConstructor,
344+
Writable = false,
345+
Enumerable = false,
346+
Configurable = true,
347+
HasValue = true,
348+
HasWritable = true,
349+
HasEnumerable = true,
350+
HasConfigurable = true
351+
});
352+
353+
_realmState.AsyncGeneratorFunctionPrototype = asyncGenFuncProto;
354+
}
355+
}
356+
290357
private void InitializeProperties()
291358
{
292-
if (_realmState.FunctionPrototype is { } functionPrototype)
359+
EnsureAsyncGeneratorIntrinsics();
360+
361+
if (_realmState.AsyncGeneratorFunctionPrototype is { } asyncGenFuncProto)
362+
{
363+
_properties.SetPrototype(asyncGenFuncProto);
364+
}
365+
else if (_realmState.FunctionPrototype is { } functionPrototype)
293366
{
294367
_properties.SetPrototype(functionPrototype);
295368
}
296369

297370
if (_isConstructorEnabled && _realmState.ObjectPrototype is not null)
298371
{
299372
var generatorPrototype = new JsObject();
300-
generatorPrototype.SetPrototype(_realmState.ObjectPrototype);
373+
generatorPrototype.SetPrototype(_realmState.AsyncGeneratorPrototype ?? _realmState.ObjectPrototype);
301374
generatorPrototype.DefineProperty("constructor",
302375
new PropertyDescriptor
303376
{

src/Asynkron.JsEngine/Ast/TypedAstEvaluator.AsyncGeneratorInstance.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -183,7 +183,7 @@ private void HandlePendingStep(
183183
return prototypeObject;
184184
}
185185

186-
return realmState.ObjectPrototype;
186+
return realmState.AsyncGeneratorPrototype ?? realmState.ObjectPrototype;
187187
}
188188
}
189189
}

src/Asynkron.JsEngine/Ast/VariableKindExtensions.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,10 @@ private void EvaluateVariableDeclarator(VariableDeclarator declarator,
2020
declarator.Initializer is not null &&
2121
targetIdentifier is not null)
2222
{
23+
// Var bindings are hoisted to the nearest function scope before evaluating
24+
// the initializer so resolution targets the correct environment.
25+
EnsureFunctionScopedVarBinding(environment, targetIdentifier.Name, context);
26+
2327
var identifierExpression = new IdentifierExpression(declarator.Source, targetIdentifier.Name);
2428
preResolvedVarReference = AssignmentReferenceResolver.Resolve(
2529
identifierExpression,

src/Asynkron.JsEngine/JsTypes/HostFunction.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,7 +443,10 @@ private void EnsurePrototypeDataProperty()
443443

444444
private void RemovePrototypeDataProperty()
445445
{
446-
Properties.DeleteOwnProperty("prototype");
446+
if (!Properties.DeleteOwnProperty("prototype"))
447+
{
448+
Properties.ForceDeleteOwnProperty("prototype");
449+
}
447450
}
448451

449452
private bool HasPrototypeDataProperty()

src/Asynkron.JsEngine/JsTypes/JsObject.cs

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -999,6 +999,21 @@ public bool HasSetter(string name)
999999
return null;
10001000
}
10011001

1002+
internal bool ForceDeleteOwnProperty(string name)
1003+
{
1004+
var deletedDescriptor = _descriptors.Remove(name);
1005+
Remove(GetterPrefix + name);
1006+
Remove(SetterPrefix + name);
1007+
var deletedValue = Remove(name);
1008+
if (deletedDescriptor || deletedValue)
1009+
{
1010+
RemoveFromInsertionOrder(name);
1011+
return true;
1012+
}
1013+
1014+
return false;
1015+
}
1016+
10021017
public bool DeleteOwnProperty(string name)
10031018
{
10041019
if (_descriptors.TryGetValue(name, out var descriptor))

src/Asynkron.JsEngine/Parser/TypedAstParser.cs

Lines changed: 40 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -867,7 +867,10 @@ private ClassDefinition ParseClassDefinition(Symbol? className, Token classToken
867867
continue;
868868
}
869869

870-
if (Check(TokenType.Get) || Check(TokenType.Set))
870+
var isAccessorKeyword = (Check(TokenType.Get) || Check(TokenType.Set)) &&
871+
!HasLineTerminatorAfterCurrentToken();
872+
873+
if (isAccessorKeyword)
871874
{
872875
var accessorToken = Advance();
873876
var isGetter = accessorToken.Type == TokenType.Get;
@@ -4162,9 +4165,24 @@ private bool CheckAheadBindingIdentifier()
41624165
return false;
41634166
}
41644167

4165-
return next.Type is TokenType.Identifier ||
4166-
next.Type is TokenType.Async or TokenType.Await or TokenType.Yield ||
4167-
IsContextualIdentifierToken(next);
4168+
if (next.Type is TokenType.Identifier ||
4169+
next.Type is TokenType.Async or TokenType.Await or TokenType.Yield ||
4170+
IsContextualIdentifierToken(next))
4171+
{
4172+
return true;
4173+
}
4174+
4175+
if (!InStrictContext && next.Type is TokenType.Static or TokenType.Let)
4176+
{
4177+
return true;
4178+
}
4179+
4180+
if (next.Type is TokenType.Using)
4181+
{
4182+
return true;
4183+
}
4184+
4185+
return false;
41684186
}
41694187

41704188
private Token Advance()
@@ -4365,7 +4383,7 @@ private bool CheckIdentifierLike()
43654383
return true;
43664384
}
43674385

4368-
if (token.Type is TokenType.Async or TokenType.Await or TokenType.Yield ||
4386+
if (token.Type is TokenType.Async or TokenType.Await or TokenType.Yield or TokenType.Using ||
43694387
IsContextualIdentifierToken(token))
43704388
{
43714389
return true;
@@ -4376,6 +4394,11 @@ private bool CheckIdentifierLike()
43764394
return true;
43774395
}
43784396

4397+
if (token.Type is TokenType.Using)
4398+
{
4399+
return true;
4400+
}
4401+
43794402
return false;
43804403
}
43814404

@@ -4501,6 +4524,18 @@ private bool HasLineTerminatorBefore()
45014524
return currentToken.Line > previousToken.Line;
45024525
}
45034526

4527+
private bool HasLineTerminatorAfterCurrentToken()
4528+
{
4529+
if (_current < 0 || _current + 1 >= _tokens.Count)
4530+
{
4531+
return false;
4532+
}
4533+
4534+
var currentToken = _tokens[_current];
4535+
var nextToken = _tokens[_current + 1];
4536+
return nextToken.Line > currentToken.Line;
4537+
}
4538+
45044539
private bool IsAsyncToken()
45054540
{
45064541
var token = Peek();

src/Asynkron.JsEngine/Runtime/RealmState.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -51,6 +51,8 @@ public sealed class RealmState
5151
public HostFunction? GeneratorFunctionConstructor { get; set; }
5252
public JsObject? AsyncGeneratorFunctionPrototype { get; set; }
5353
public JsObject? AsyncGeneratorPrototype { get; set; }
54+
public JsObject? AsyncIteratorPrototype { get; set; }
55+
public HostFunction? AsyncGeneratorFunctionConstructor { get; set; }
5456
public IJsCallable? PromiseConstructor { get; set; }
5557

5658
// Internal flags to avoid re-attaching built-in surfaces per instance

0 commit comments

Comments
 (0)