Skip to content

Commit 74fbd55

Browse files
authored
Merge branch 'main' into jsengine-module-code3
2 parents 2bb1faf + ca24244 commit 74fbd55

File tree

4 files changed

+34
-92
lines changed

4 files changed

+34
-92
lines changed

continue.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@
2525
- `using` and `await using` declarations still TypeError on non-object initializers but now allow initializer-less for-in/of heads with per-iteration lexical environments, so the TDZ/fresh-binding for-of cases are green.
2626
- Typed array subclass instances now report their concrete @@toStringTag, generator/async generator functions (and their bound/proxy wrappers) are treated as non-constructors during class heritage resolution, and derived classes extending null leave `this` uninitialized until super, so the class subclass builtins/null-proto/generator superclass cases are green.
2727
- Module evaluation now walks requested modules ahead of body execution, ResolveExport/export\* follow the spec (cycle-aware, ambiguous names filtered), module namespaces expose unambiguous exports only, and namespace [[Set]]/Reflect.set return false instead of throwing.
28+
- Object destructuring rest now walks [[OwnPropertyKeys]] with exclusions checked before GetOwnPropertyDescriptor, skips Get for non-enumerables, and uses the original object (including proxies) instead of cloning; the proxy rest destructuring get/gOPD/ownKeys-order tests are passing.
2829

2930
## Next Iteration Plan
3031
1. Re-run the Language suite to refresh the current failure set after the for-in/of using and array setter fixes.

languagetests.md

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -86,23 +86,12 @@
8686
Statements_asyncGenerator("language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js",False)
8787
Statements_asyncGenerator("language/statements/async-generator/yield-star-async-from-sync-iterator-inaccessible.js",True)
8888
Statements_class_definition
89-
Statements_class_definition("language/statements/class/definition/constructable-but-no-prototype.js",False)
90-
Statements_class_definition("language/statements/class/definition/constructable-but-no-prototype.js",True)
9189
Statements_class_definition("language/statements/class/definition/invalid-extends.js",True)
92-
Statements_class_definition("language/statements/class/definition/prototype-getter.js",False)
93-
Statements_class_definition("language/statements/class/definition/prototype-getter.js",True)
94-
Statements_class_definition("language/statements/class/definition/prototype-setter.js",False)
95-
Statements_class_definition("language/statements/class/definition/prototype-setter.js",True)
9690
Statements_class_elements_syntax_valid
9791
Statements_class_elements_syntax_valid("language/statements/class/elements/syntax/valid/grammar-field-named-get-followed-by-generator-asi.js",False)
9892
Statements_class_elements_syntax_valid("language/statements/class/elements/syntax/valid/grammar-field-named-get-followed-by-generator-asi.js",True)
9993
Statements_class_elements_syntax_valid("language/statements/class/elements/syntax/valid/grammar-field-named-set-followed-by-generator-asi.js",False)
10094
Statements_class_elements_syntax_valid("language/statements/class/elements/syntax/valid/grammar-field-named-set-followed-by-generator-asi.js",True)
101-
Statements_class_subclass
102-
Statements_class_subclass("language/statements/class/subclass/superclass-async-generator-function.js",False)
103-
Statements_class_subclass("language/statements/class/subclass/superclass-async-generator-function.js",True)
104-
Statements_class_subclass("language/statements/class/subclass/superclass-generator-function.js",False)
105-
Statements_class_subclass("language/statements/class/subclass/superclass-generator-function.js",True)
10695
Statements_const_syntax
10796
Statements_const_syntax("language/statements/const/syntax/const-invalid-assignment-next-expression-for.js",False)
10897
Statements_const_syntax("language/statements/const/syntax/const-invalid-assignment-next-expression-for.js",True)

src/Asynkron.JsEngine/Ast/ObjectBindingExtensions.cs

Lines changed: 19 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ private void BindObjectPattern(object? value, JsEnvironment environment,
5555
}
5656

5757
usedKeys.Add(propertyName);
58-
var hasProperty = obj.TryGetProperty(propertyName, obj, context, out var val);
58+
var hasProperty = JsOps.TryGetPropertyValue(obj, propertyName, out var val, context);
5959
if (context.ShouldStopEvaluation)
6060
{
6161
throw new ThrowSignal(context.FlowValue);
@@ -107,18 +107,26 @@ private void BindObjectPattern(object? value, JsEnvironment environment,
107107
restObject.SetPrototype(context.RealmState.ObjectPrototype);
108108
}
109109

110-
foreach (var key in GetEnumerableOwnPropertyKeysInOrder(obj))
110+
foreach (var key in obj.GetOwnPropertyKeysInOrder(includeSymbols: true, includeNonEnumerable: true))
111111
{
112-
if (!usedKeys.Contains(key))
112+
if (usedKeys.Contains(key))
113113
{
114-
if (obj.TryGetProperty(key, obj, context, out var restValue))
115-
{
116-
restObject.SetProperty(key, restValue);
117-
}
118-
else if (context.ShouldStopEvaluation)
119-
{
120-
throw new ThrowSignal(context.FlowValue);
121-
}
114+
continue;
115+
}
116+
117+
var descriptor = obj.GetOwnPropertyDescriptor(key);
118+
if (descriptor is not { Enumerable: true })
119+
{
120+
continue;
121+
}
122+
123+
if (JsOps.TryGetPropertyValue(obj, key, out var restValue, context))
124+
{
125+
restObject.SetProperty(key, restValue);
126+
}
127+
else if (context.ShouldStopEvaluation)
128+
{
129+
throw new ThrowSignal(context.FlowValue);
122130
}
123131
}
124132

src/Asynkron.JsEngine/Ast/TypedAstEvaluator.cs

Lines changed: 14 additions & 70 deletions
Original file line numberDiff line numberDiff line change
@@ -1180,87 +1180,31 @@ private static bool TryGetIteratorForDestructuring(object? value, EvaluationCont
11801180
return Enumerate().GetEnumerator();
11811181
}
11821182

1183-
private static JsObject ToObjectForDestructuring(object? value, EvaluationContext context)
1183+
private static IJsObjectLike ToObjectForDestructuring(object? value, EvaluationContext context)
11841184
{
11851185
var realm = context.RealmState;
11861186
switch (value)
11871187
{
1188-
case JsObject jsObj:
1189-
return jsObj;
1190-
case JsArray jsArray:
1191-
{
1192-
var obj = new JsObject();
1193-
if (realm?.ArrayPrototype is not null)
1194-
{
1195-
obj.SetPrototype(realm.ArrayPrototype);
1196-
}
1197-
1198-
var length = jsArray.Length;
1199-
var count = length > int.MaxValue ? int.MaxValue : (int)length;
1200-
for (var i = 0; i < count; i++)
1201-
{
1202-
obj.SetProperty(i.ToString(CultureInfo.InvariantCulture), jsArray.GetElement(i));
1203-
}
1204-
1205-
obj.SetProperty("length", length);
1206-
return obj;
1207-
}
12081188
case null:
12091189
case Symbol sym when ReferenceEquals(sym, Symbol.Undefined):
12101190
case IIsHtmlDda:
12111191
throw StandardLibrary.ThrowTypeError("Cannot destructure undefined or null", context, realm);
1212-
case string s:
1213-
return StandardLibrary.CreateStringWrapper(s, context, realm);
1214-
case JsBigInt bi:
1215-
return StandardLibrary.CreateBigIntWrapper(bi, context, realm);
1216-
case TypedAstSymbol symbolValue:
1217-
{
1218-
var obj = new JsObject();
1219-
if (realm?.ObjectPrototype is not null)
1220-
{
1221-
obj.SetPrototype(realm.ObjectPrototype);
1222-
}
1223-
1224-
obj.SetProperty("__value__", symbolValue);
1225-
return obj;
1226-
}
1227-
case double:
1228-
case float:
1229-
case decimal:
1230-
case int:
1231-
case uint:
1232-
case long:
1233-
case ulong:
1234-
case short:
1235-
case ushort:
1236-
case byte:
1237-
case sbyte:
1238-
{
1239-
var num = Convert.ToDouble(value, CultureInfo.InvariantCulture);
1240-
return StandardLibrary.CreateNumberWrapper(num, context, realm);
1241-
}
1242-
case bool b:
1243-
{
1244-
var obj = new JsObject();
1245-
if (realm?.BooleanPrototype is not null)
1246-
{
1247-
obj.SetPrototype(realm.BooleanPrototype);
1248-
}
1192+
case IJsObjectLike objectLike:
1193+
return objectLike;
1194+
}
12491195

1250-
obj.SetProperty("__value__", b);
1251-
return obj;
1252-
}
1253-
default:
1254-
{
1255-
var obj = new JsObject();
1256-
if (realm?.ObjectPrototype is not null)
1257-
{
1258-
obj.SetPrototype(realm.ObjectPrototype);
1259-
}
1196+
if (realm is not null && StandardLibrary.TryGetObject(value, realm, out var coerced))
1197+
{
1198+
return coerced;
1199+
}
12601200

1261-
return obj;
1262-
}
1201+
var obj = new JsObject();
1202+
if (realm?.ObjectPrototype is not null)
1203+
{
1204+
obj.SetPrototype(realm.ObjectPrototype);
12631205
}
1206+
1207+
return obj;
12641208
}
12651209

12661210
private static JsObject CreateGeneratorIteratorObject(

0 commit comments

Comments
 (0)