Browse Source

Update test262 test suite and fix issues (#1958)

Marko Lahma 11 months ago
parent
commit
7f72d483eb

+ 1 - 2
Jint.Tests.Test262/Test262Harness.settings.json

@@ -1,5 +1,5 @@
 {
-  "SuiteGitSha": "941813e1f0e64ae9a5c4c5c8075f49ff89b0c642",
+  "SuiteGitSha": "d62fa93c8f9ce5e687c0bbaa5d2b59670ab2ff60",
   //"SuiteDirectory": "//mnt/c/work/test262",
   "TargetPath": "./Generated",
   "Namespace": "Jint.Tests.Test262",
@@ -10,7 +10,6 @@
     "Atomics",
     "decorators",
     "explicit-resource-management",
-    "import-assertions",
     "iterator-helpers",
     "Math.sumPrecise",
     "regexp-lookbehind",

+ 5 - 3
Jint/Native/Array/ArrayOperations.cs

@@ -79,7 +79,7 @@ internal abstract class ArrayOperations : IEnumerable<JsValue>
     public abstract JsValue Get(ulong index);
 
     public virtual JsValue[] GetAll(
-        Types elementTypes = Types.Undefined | Types.Null | Types.Boolean | Types.String | Types.Symbol | Types.Number | Types.Object,
+        Types elementTypes = Types.Undefined | Types.Null | Types.Boolean | Types.String | Types.Symbol | Types.Number | Types.BigInt | Types.Object,
         bool skipHoles = false)
     {
         uint writeIndex = 0;
@@ -265,13 +265,15 @@ internal abstract class ArrayOperations : IEnumerable<JsValue>
 
         public override JsValue Get(ulong index) => _target.Get((uint) index);
 
-        public override JsValue[] GetAll(Types elementTypes = Types.Undefined | Types.Null | Types.Boolean | Types.String | Types.Symbol | Types.Number | Types.Object, bool skipHoles = false)
+        public override JsValue[] GetAll(
+            Types elementTypes = Types.Empty | Types.Undefined | Types.Null | Types.Boolean | Types.String | Types.Number | Types.Symbol | Types.BigInt | Types.Object,
+            bool skipHoles = false)
         {
             var n = _target.GetLength();
 
             if (_target._dense == null || _target._dense.Length < n)
             {
-                return base.GetAll(elementTypes);
+                return base.GetAll(elementTypes, skipHoles);
             }
 
             // optimized

+ 26 - 32
Jint/Native/JsTypedArray.cs

@@ -88,13 +88,10 @@ public sealed class JsTypedArray : ObjectInstance
     /// </summary>
     public override bool HasProperty(JsValue property)
     {
-        if (property.IsString())
+        var numericIndex = TypeConverter.CanonicalNumericIndexString(property);
+        if (numericIndex is not null)
         {
-            var numericIndex = TypeConverter.CanonicalNumericIndexString(property);
-            if (numericIndex is not null)
-            {
-                return IsValidIntegerIndex(numericIndex.Value);
-            }
+            return IsValidIntegerIndex(numericIndex.Value);
         }
 
         return base.HasProperty(property);
@@ -162,39 +159,36 @@ public sealed class JsTypedArray : ObjectInstance
     /// </summary>
     public override bool DefineOwnProperty(JsValue property, PropertyDescriptor desc)
     {
-        if (property.IsString())
+        var numericIndex = TypeConverter.CanonicalNumericIndexString(property);
+        if (numericIndex is not null)
         {
-            var numericIndex = TypeConverter.CanonicalNumericIndexString(property);
-            if (numericIndex is not null)
+            if (!IsValidIntegerIndex(numericIndex.Value))
             {
-                if (!IsValidIntegerIndex(numericIndex.Value))
-                {
-                    return false;
-                }
-
-                if (desc.ConfigurableSet && !desc.Configurable)
-                {
-                    return false;
-                }
+                return false;
+            }
 
-                if (desc.EnumerableSet && !desc.Enumerable)
-                {
-                    return false;
-                }
+            if (desc is { ConfigurableSet: true, Configurable: false })
+            {
+                return false;
+            }
 
-                if (desc.IsAccessorDescriptor())
-                {
-                    return false;
-                }
+            if (desc is { EnumerableSet: true, Enumerable: false })
+            {
+                return false;
+            }
 
-                if (desc.WritableSet && !desc.Writable)
-                {
-                    return false;
-                }
+            if (desc.IsAccessorDescriptor())
+            {
+                return false;
+            }
 
-                IntegerIndexedElementSet(numericIndex.Value, desc.Value);
-                return true;
+            if (desc is { WritableSet: true, Writable: false })
+            {
+                return false;
             }
+
+            IntegerIndexedElementSet(numericIndex.Value, desc.Value);
+            return true;
         }
 
         return base.DefineOwnProperty(property, desc);

+ 1 - 1
Jint/Runtime/Debugger/DebugScope.cs

@@ -57,7 +57,7 @@ public sealed class DebugScope
     /// <returns>Value of the binding</returns>
     public JsValue? GetBindingValue(string name)
     {
-        _record.TryGetBinding(new Environment.BindingName(name), out var result);
+        _record.TryGetBinding(new Environment.BindingName(name), strict: false, out var result);
         return result;
     }
 

+ 1 - 1
Jint/Runtime/Descriptors/Specialized/ClrAccessDescriptor.cs

@@ -31,7 +31,7 @@ internal sealed class ClrAccessDescriptor : PropertyDescriptor
 
     private JsValue DoGet(JsValue n)
     {
-        return _env.TryGetBinding(_name, out var value)
+        return _env.TryGetBinding(_name, strict: true, out var value)
             ? value
             : JsValue.Undefined;
     }

+ 1 - 1
Jint/Runtime/Environments/DeclarativeEnvironment.cs

@@ -23,7 +23,7 @@ internal class DeclarativeEnvironment : Environment
 
     internal sealed override bool HasBinding(Key name) => _dictionary is not null && _dictionary.ContainsKey(name);
 
-    internal override bool TryGetBinding(BindingName name, [NotNullWhen(true)] out JsValue? value)
+    internal override bool TryGetBinding(BindingName name, bool strict, [NotNullWhen(true)] out JsValue? value)
     {
         if (_dictionary?.TryGetValue(name.Key, out var binding) == true)
         {

+ 1 - 1
Jint/Runtime/Environments/Environment.cs

@@ -28,7 +28,7 @@ internal abstract class Environment : JsValue
 
     internal abstract bool HasBinding(BindingName name);
 
-    internal abstract bool TryGetBinding(BindingName name, [NotNullWhen(true)] out JsValue? value);
+    internal abstract bool TryGetBinding(BindingName name, bool strict, [NotNullWhen(true)] out JsValue? value);
 
     /// <summary>
     /// Creates a new mutable binding in an environment record.

+ 2 - 2
Jint/Runtime/Environments/GlobalEnvironment.cs

@@ -69,9 +69,9 @@ internal sealed class GlobalEnvironment : Environment
         return _global.HasProperty(name.Value);
     }
 
-    internal override bool TryGetBinding(BindingName name, [NotNullWhen(true)] out JsValue? value)
+    internal override bool TryGetBinding(BindingName name, bool strict, [NotNullWhen(true)] out JsValue? value)
     {
-        if (_declarativeRecord._dictionary is not null && _declarativeRecord.TryGetBinding(name, out value))
+        if (_declarativeRecord._dictionary is not null && _declarativeRecord.TryGetBinding(name, strict, out value))
         {
             return true;
         }

+ 3 - 2
Jint/Runtime/Environments/JintEnvironment.cs

@@ -35,6 +35,7 @@ internal static class JintEnvironment
     internal static bool TryGetIdentifierEnvironmentWithBindingValue(
         Environment env,
         Environment.BindingName name,
+        bool strict,
         [NotNullWhen(true)] out Environment? record,
         [NotNullWhen(true)] out JsValue? value)
     {
@@ -43,12 +44,12 @@ internal static class JintEnvironment
 
         if (env._outerEnv is null)
         {
-            return ((GlobalEnvironment) env).TryGetBinding(name, out value);
+            return ((GlobalEnvironment) env).TryGetBinding(name, strict, out value);
         }
 
         while (record is not null)
         {
-            if (record.TryGetBinding(name, out value))
+            if (record.TryGetBinding(name, strict, out value))
             {
                 return true;
             }

+ 2 - 2
Jint/Runtime/Environments/ModuleEnvironment.cs

@@ -47,7 +47,7 @@ internal sealed class ModuleEnvironment : DeclarativeEnvironment
         return base.GetBindingValue(name, strict);
     }
 
-    internal override bool TryGetBinding(BindingName name, [NotNullWhen(true)] out JsValue? value)
+    internal override bool TryGetBinding(BindingName name, bool strict, [NotNullWhen(true)] out JsValue? value)
     {
         if (_importBindings.TryGetValue(name.Key, out var indirectBinding))
         {
@@ -55,7 +55,7 @@ internal sealed class ModuleEnvironment : DeclarativeEnvironment
             return true;
         }
 
-        return base.TryGetBinding(name, out value);
+        return base.TryGetBinding(name, strict, out value);
     }
 
     /// <summary>

+ 11 - 9
Jint/Runtime/Environments/ObjectEnvironment.cs

@@ -30,7 +30,7 @@ internal sealed class ObjectEnvironment : Environment
     internal override bool HasBinding(Key name)
     {
         var property = new JsString(name.Name);
-        var foundBinding = HasProperty(property);
+        var foundBinding = _bindingObject.HasProperty(property);
 
         if (!foundBinding)
         {
@@ -47,7 +47,7 @@ internal sealed class ObjectEnvironment : Environment
 
     internal override bool HasBinding(BindingName name)
     {
-        var foundBinding = HasProperty(name.Value);
+        var foundBinding = _bindingObject.HasProperty(name.Value);
 
         if (!foundBinding)
         {
@@ -62,15 +62,10 @@ internal sealed class ObjectEnvironment : Environment
         return !IsBlocked(name.Value);
     }
 
-    private bool HasProperty(JsValue property)
-    {
-        return _bindingObject.HasProperty(property);
-    }
-
-    internal override bool TryGetBinding(BindingName name, [NotNullWhen(true)] out JsValue? value)
+    internal override bool TryGetBinding(BindingName name, bool strict, [NotNullWhen(true)] out JsValue? value)
     {
         // we unwrap by name
-        if (!HasProperty(name.Value))
+        if (!_bindingObject.HasProperty(name.Value))
         {
             value = default;
             return false;
@@ -83,6 +78,13 @@ internal sealed class ObjectEnvironment : Environment
         }
 
         value = _bindingObject.Get(name.Value);
+
+        if (strict && value.IsUndefined() && !_bindingObject.HasProperty(name.Value))
+        {
+            // data was deleted during reading of unscopable information, of course...
+            ExceptionHelper.ThrowReferenceNameError(_engine.Realm, name.Key);
+        }
+
         return true;
     }
 

+ 3 - 1
Jint/Runtime/Interpreter/Expressions/JintAssignmentExpression.cs

@@ -42,17 +42,19 @@ internal sealed class JintAssignmentExpression : JintExpression
     protected override object EvaluateInternal(EvaluationContext context)
     {
         var engine = context.Engine;
+        var strict = StrictModeScope.IsStrictModeCode;
 
         JsValue originalLeftValue;
         Reference lref;
         if (_leftIdentifier is not null && JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                 engine.ExecutionContext.LexicalEnvironment,
                 _leftIdentifier.Identifier,
+                strict,
                 out var identifierEnvironment,
                 out var temp))
         {
             originalLeftValue = temp;
-            lref = engine._referencePool.Rent(identifierEnvironment, _leftIdentifier.Identifier.Value, StrictModeScope.IsStrictModeCode, thisValue: null);
+            lref = engine._referencePool.Rent(identifierEnvironment, _leftIdentifier.Identifier.Value, strict, thisValue: null);
         }
         else
         {

+ 3 - 1
Jint/Runtime/Interpreter/Expressions/JintIdentifierExpression.cs

@@ -56,10 +56,12 @@ internal sealed class JintIdentifierExpression : JintExpression
 
         var engine = context.Engine;
         var env = engine.ExecutionContext.LexicalEnvironment;
+        var strict = StrictModeScope.IsStrictModeCode;
 
         if (JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                 env,
                 identifier,
+                strict,
                 out _,
                 out var value))
         {
@@ -70,7 +72,7 @@ internal sealed class JintIdentifierExpression : JintExpression
         }
         else
         {
-            var reference = engine._referencePool.Rent(JsValue.Undefined, identifier.Value, StrictModeScope.IsStrictModeCode, thisValue: null);
+            var reference = engine._referencePool.Rent(JsValue.Undefined, identifier.Value, strict, thisValue: null);
             value = engine.GetValue(reference, returnReferenceToPool: true);
         }
 

+ 3 - 1
Jint/Runtime/Interpreter/Expressions/JintMemberExpression.cs

@@ -61,6 +61,7 @@ internal sealed class JintMemberExpression : JintExpression
         JsValue? baseValue = null;
 
         var engine = context.Engine;
+        var strict = StrictModeScope.IsStrictModeCode;
         if (_objectExpression is JintIdentifierExpression identifierExpression)
         {
             var identifier = identifierExpression.Identifier;
@@ -69,6 +70,7 @@ internal sealed class JintMemberExpression : JintExpression
             JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                 env,
                 identifier,
+                strict,
                 out _,
                 out baseValue);
         }
@@ -135,4 +137,4 @@ internal sealed class JintMemberExpression : JintExpression
         var privateName = privEnv!.ResolvePrivateIdentifier(privateIdentifier.ToString());
         return engine._referencePool.Rent(baseValue, privateName!, strict: true, thisValue: null);
     }
-}
+}

+ 6 - 3
Jint/Runtime/Interpreter/Expressions/JintUpdateExpression.cs

@@ -122,13 +122,16 @@ internal sealed class JintUpdateExpression : JintExpression
     private JsValue? UpdateIdentifier(EvaluationContext context)
     {
         var name = _leftIdentifier!.Identifier;
+        var strict = StrictModeScope.IsStrictModeCode;
+
         if (JintEnvironment.TryGetIdentifierEnvironmentWithBindingValue(
                 context.Engine.ExecutionContext.LexicalEnvironment,
                 name,
+                strict,
                 out var environmentRecord,
                 out var value))
         {
-            if (_evalOrArguments && StrictModeScope.IsStrictModeCode)
+            if (_evalOrArguments && strict)
             {
                 ExceptionHelper.ThrowSyntaxError(context.Engine.Realm);
             }
@@ -163,7 +166,7 @@ internal sealed class JintUpdateExpression : JintExpression
                 }
             }
 
-            environmentRecord.SetMutableBinding(name.Key, newValue!, StrictModeScope.IsStrictModeCode);
+            environmentRecord.SetMutableBinding(name.Key, newValue!, strict);
             if (_prefix)
             {
                 return newValue;
@@ -179,4 +182,4 @@ internal sealed class JintUpdateExpression : JintExpression
 
         return null;
     }
-}
+}