Browse Source

Backport update test262 suite and fix typed array issues (#1903)

Marko Lahma 1 year ago
parent
commit
061d2c7b1c

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

@@ -1,5 +1,5 @@
 {
-  "SuiteGitSha": "c2ae5ed5e90d86e17730730b003e9b6fb050693e",
+  "SuiteGitSha": "c3a326ace810e7c80a4e1b8df8c8b704ed223c28",
   //"SuiteDirectory": "//mnt/c/work/test262",
   "TargetPath": "./Generated",
   "Namespace": "Jint.Tests.Test262",
@@ -11,6 +11,7 @@
     "Float16Array",
     "import-assertions",
     "iterator-helpers",
+    "promise-try",
     "regexp-duplicate-named-groups",
     "regexp-lookbehind",
     "regexp-modifiers",
@@ -73,7 +74,7 @@
     // C# can't distinguish 1.797693134862315808e+308 and 1.797693134862315708145274237317e+308
     "language/types/number/8.5.1.js",
 
-    // inner binding is immutable (from parameters) Expected SameValue(«null», «function() {{ ... }}») to be true
+    // inner binding is immutable (from parameters) Expected SameValue(�null�, �function() {{ ... }}�) to be true
     "language/expressions/function/scope-name-var-open-non-strict.js",
     "language/expressions/function/scope-name-var-open-strict.js",
 

+ 8 - 1
Jint/Native/Array/ArrayIteratorPrototype.cs

@@ -1,7 +1,9 @@
 using Jint.Collections;
+using Jint.Native.ArrayBuffer;
 using Jint.Native.Iterator;
 using Jint.Native.Object;
 using Jint.Native.Symbol;
+using Jint.Native.TypedArray;
 using Jint.Runtime;
 using Jint.Runtime.Descriptors;
 using Jint.Runtime.Interop;
@@ -119,7 +121,12 @@ internal sealed class ArrayIteratorPrototype : IteratorPrototype
             if (_typedArray is not null)
             {
                 _typedArray._viewedArrayBuffer.AssertNotDetached();
-                len = _typedArray.GetLength();
+                var taRecord = IntrinsicTypedArrayPrototype.MakeTypedArrayWithBufferWitnessRecord(_typedArray, ArrayBufferOrder.SeqCst);
+                if (!_closed && taRecord.IsTypedArrayOutOfBounds)
+                {
+                    ExceptionHelper.ThrowTypeError(_typedArray.Engine.Realm, "TypedArray is out of bounds");
+                }
+                len = taRecord.TypedArrayLength;
             }
             else
             {

+ 2 - 0
Jint/Native/JsTypedArray.cs

@@ -54,6 +54,8 @@ namespace Jint.Native
 
         internal override uint GetLength() => IntrinsicTypedArrayPrototype.MakeTypedArrayWithBufferWitnessRecord(this, ArrayBufferOrder.Unordered).TypedArrayLength;
 
+        internal override bool IsArrayLike => true;
+
         internal override bool IsIntegerIndexedArray => true;
 
         /// <summary>

+ 1 - 1
Jint/Native/TypedArray/IntrinsicTypedArrayConstructor.cs

@@ -174,7 +174,7 @@ namespace Jint.Native.TypedArray
             {
                 if (taRecord.IsTypedArrayOutOfBounds)
                 {
-                    ExceptionHelper.ThrowTypeError(realm);
+                    ExceptionHelper.ThrowTypeError(realm, "TypedArray is out of bounds");
                 }
                 if (newTypedArray.GetLength() < number._value)
                 {

+ 36 - 11
Jint/Native/TypedArray/IntrinsicTypedArrayPrototype.cs

@@ -208,7 +208,8 @@ namespace Jint.Native.TypedArray
                     var byteOffset  = o._byteOffset;
                     var elementSize = o._arrayElementType.GetElementSize();
                     var byteLength = (double) CachedBufferByteLength;
-                    return (uint) System.Math.Floor((byteLength - byteOffset) / elementSize);
+                    var floor = System.Math.Floor((byteLength - byteOffset) / elementSize);
+                    return floor < 0 ? 0 : (uint) floor;
                 }
             }
 
@@ -337,8 +338,16 @@ namespace Jint.Native.TypedArray
                 var buffer = o._viewedArrayBuffer;
                 buffer.AssertNotDetached();
 
+                taRecord = MakeTypedArrayWithBufferWitnessRecord(o, ArrayBufferOrder.SeqCst);
+                if (taRecord.IsTypedArrayOutOfBounds)
+                {
+                    ExceptionHelper.ThrowTypeError(_realm, "TypedArray is out of bounds");
+                }
+
+                len = taRecord.TypedArrayLength;
                 var elementSize = o._arrayElementType.GetElementSize();
                 var byteOffset = o._byteOffset;
+                var bufferByteLimit = len * elementSize + byteOffset;
                 var toByteIndex = to * elementSize + byteOffset;
                 var fromByteIndex = from * elementSize + byteOffset;
                 var countBytes = count * elementSize;
@@ -357,11 +366,18 @@ namespace Jint.Native.TypedArray
 
                 while (countBytes > 0)
                 {
-                    var value = buffer.GetValueFromBuffer((int) fromByteIndex, TypedArrayElementType.Uint8, true, ArrayBufferOrder.Unordered);
-                    buffer.SetValueInBuffer((int) toByteIndex, TypedArrayElementType.Uint8, value, true, ArrayBufferOrder.Unordered);
-                    fromByteIndex += direction;
-                    toByteIndex += direction;
-                    countBytes--;
+                    if (fromByteIndex < bufferByteLimit && toByteIndex < bufferByteLimit)
+                    {
+                        var value = buffer.GetValueFromBuffer((int) fromByteIndex, TypedArrayElementType.Uint8, isTypedArray: true, ArrayBufferOrder.Unordered);
+                        buffer.SetValueInBuffer((int) toByteIndex, TypedArrayElementType.Uint8, value, isTypedArray: true, ArrayBufferOrder.Unordered);
+                        fromByteIndex += direction;
+                        toByteIndex += direction;
+                        countBytes--;
+                    }
+                    else
+                    {
+                        countBytes = 0;
+                    }
                 }
             }
 
@@ -450,24 +466,33 @@ namespace Jint.Native.TypedArray
                 k = (int) System.Math.Min(relativeStart, len);
             }
 
-            uint final;
+            uint endIndex;
             var relativeEnd = end.IsUndefined() ? len : TypeConverter.ToIntegerOrInfinity(end);
             if (double.IsNegativeInfinity(relativeEnd))
             {
-                final = 0;
+                endIndex = 0;
             }
             else if (relativeEnd < 0)
             {
-                final = (uint) System.Math.Max(len + relativeEnd, 0);
+                endIndex = (uint) System.Math.Max(len + relativeEnd, 0);
             }
             else
             {
-                final = (uint) System.Math.Min(relativeEnd, len);
+                endIndex = (uint) System.Math.Min(relativeEnd, len);
             }
 
+            taRecord = MakeTypedArrayWithBufferWitnessRecord(o, ArrayBufferOrder.SeqCst);
+            if (taRecord.IsTypedArrayOutOfBounds)
+            {
+                ExceptionHelper.ThrowTypeError(_realm, "TypedArray is out of bounds");
+            }
+
+            len = taRecord.TypedArrayLength;
+            endIndex = System.Math.Min(endIndex, len);
+
             o._viewedArrayBuffer.AssertNotDetached();
 
-            for (var i = k; i < final; ++i)
+            for (var i = k; i < endIndex; ++i)
             {
                 o[i] = value;
             }

+ 1 - 1
Jint/Native/TypedArray/TypeArrayHelper.cs

@@ -16,7 +16,7 @@ internal static class TypeArrayHelper
         var taRecord = IntrinsicTypedArrayPrototype.MakeTypedArrayWithBufferWitnessRecord(typedArray, order);
         if (taRecord.IsTypedArrayOutOfBounds)
         {
-            ExceptionHelper.ThrowTypeError(realm);
+            ExceptionHelper.ThrowTypeError(realm, "TypedArray is out of bounds");
         }
 
         return taRecord;