diff options
Diffstat (limited to 'deps/v8/test/mjsunit')
66 files changed, 3293 insertions, 2184 deletions
diff --git a/deps/v8/test/mjsunit/compiler/bigint-add-no-deopt-loop.js b/deps/v8/test/mjsunit/compiler/bigint-add-no-deopt-loop.js index 2004477932..f8ad1035ae 100644 --- a/deps/v8/test/mjsunit/compiler/bigint-add-no-deopt-loop.js +++ b/deps/v8/test/mjsunit/compiler/bigint-add-no-deopt-loop.js @@ -24,7 +24,9 @@ assertEquals(testAdd(6n, 2n), 8n); assertOptimized(testAdd); assertThrows(() => testAdd(big, big), RangeError); -assertUnoptimized(testAdd); +if (%Is64Bit()) { + assertUnoptimized(testAdd); +} testAdd(30n, -50n); testAdd(23n, 5n); diff --git a/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-4.js b/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-4.js index 49da8832f0..02b8aa2373 100644 --- a/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-4.js +++ b/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-4.js @@ -41,6 +41,7 @@ %OptimizeFunctionForTopTier(foo); assertEquals(78, foo(26, 6, 46, null)); assertOptimized(foo); + %PrepareFunctionForOptimization(foo); if (i < 3) { assertFalse(sum_js_got_interpreted); @@ -60,6 +61,7 @@ assertUnoptimized(foo); } else { assertOptimized(foo); + %PrepareFunctionForOptimization(foo); } } })(); diff --git a/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-7.js b/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-7.js index 96e50dd906..1655ba54ca 100644 --- a/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-7.js +++ b/deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-7.js @@ -43,6 +43,7 @@ // The call with spread should have been inlined. assertFalse(log_got_interpreted); assertOptimized(foo); + %PrepareFunctionForOptimization(foo); // This invalidates the DependOnArrayIteratorProtector and causes deopt. Object.defineProperty(Array.prototype, Symbol.iterator, { diff --git a/deps/v8/test/mjsunit/compiler/regress-crbug-1228407.js b/deps/v8/test/mjsunit/compiler/regress-crbug-1228407.js new file mode 100644 index 0000000000..f01eafb80e --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-crbug-1228407.js @@ -0,0 +1,24 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --interrupt-budget=100 + +function foo() { + return function bar() { + a.p = 42; + for (let i = 0; i < 100; i++) this.p(); + this.p = a; + }; +} + +var a = foo(); +var b = foo(); + +a.prototype = { p() {} }; +b.prototype = { p() { + this.q = new a(); + for (let i = 0; i < 200; i++) ; +}}; + +new b(); diff --git a/deps/v8/test/mjsunit/compiler/regress-crbug-1234764.js b/deps/v8/test/mjsunit/compiler/regress-crbug-1234764.js new file mode 100644 index 0000000000..eca9346d17 --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-crbug-1234764.js @@ -0,0 +1,21 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax + +function foo(arg_true) { + let o = {c0: 0}; + let c0a = arg_true ? 0 : "x"; + let c0 = Math.max(c0a, 0) + c0a; + let v01 = 2**32 + (o.c0 & 1); + let ra = ((2**32 - 1) >>> c0) - v01; + let rb = (-1) << (32 - c0); + return (ra^rb) >> 31; +} + +%PrepareFunctionForOptimization(foo); +assertEquals(0, foo(true)); +assertEquals(0, foo(true)); +%OptimizeFunctionOnNextCall(foo); +assertEquals(0, foo(true)); diff --git a/deps/v8/test/mjsunit/compiler/regress-crbug-1234770.js b/deps/v8/test/mjsunit/compiler/regress-crbug-1234770.js new file mode 100644 index 0000000000..22f68db902 --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-crbug-1234770.js @@ -0,0 +1,14 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax + +function foo(a) { + return ((a & 1) == 1) & ((a & 2) == 1); +} + +%PrepareFunctionForOptimization(foo); +assertEquals(0, foo(1)); +%OptimizeFunctionOnNextCall(foo); +assertEquals(0, foo(1)); diff --git a/deps/v8/test/mjsunit/compiler/regress-crbug-1247763.js b/deps/v8/test/mjsunit/compiler/regress-crbug-1247763.js new file mode 100644 index 0000000000..760fb92d08 --- /dev/null +++ b/deps/v8/test/mjsunit/compiler/regress-crbug-1247763.js @@ -0,0 +1,30 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax + +class C extends Array {}; +%NeverOptimizeFunction(C); + +for (let i = 0; i < 3; i++) { + + function store_global() { global = new C(); }; + store_global(); + %PrepareFunctionForOptimization(store_global); + store_global(); + %OptimizeFunctionOnNextCall(store_global); + store_global(); + + new C(42); + + function load_global() { global.p1 = {}; global.p2 = {}; } + if (i) { + load_global(); + %PrepareFunctionForOptimization(load_global); + load_global(); + %OptimizeFunctionOnNextCall(load_global); + load_global(); + } + +} diff --git a/deps/v8/test/mjsunit/es6/map-constructor-entry-side-effect2.js b/deps/v8/test/mjsunit/es6/map-constructor-entry-side-effect2.js index de92b8d211..9fcaa0b04a 100644 --- a/deps/v8/test/mjsunit/es6/map-constructor-entry-side-effect2.js +++ b/deps/v8/test/mjsunit/es6/map-constructor-entry-side-effect2.js @@ -38,6 +38,11 @@ function TestMapConstructorEntrySideEffect(ctor) { ctor.prototype.set = originalPrototypeSet; } +// Forbid inlining these helper functions to avoid deopt surprises. +%NeverOptimizeFunction(assertEquals); +%NeverOptimizeFunction(assertFalse); +%NeverOptimizeFunction(assertTrue); + %PrepareFunctionForOptimization(TestMapConstructorEntrySideEffect); TestMapConstructorEntrySideEffect(Map); TestMapConstructorEntrySideEffect(Map); @@ -48,6 +53,7 @@ assertOptimized(TestMapConstructorEntrySideEffect); // This call would deopt TestMapConstructorEntrySideEffect(WeakMap); + %PrepareFunctionForOptimization(TestMapConstructorEntrySideEffect); TestMapConstructorEntrySideEffect(WeakMap); TestMapConstructorEntrySideEffect(WeakMap); diff --git a/deps/v8/test/mjsunit/es6/regress/regress-5929-1.js b/deps/v8/test/mjsunit/es6/regress/regress-5929-1.js index 5f361f3a78..c4653cbc8a 100644 --- a/deps/v8/test/mjsunit/es6/regress/regress-5929-1.js +++ b/deps/v8/test/mjsunit/es6/regress/regress-5929-1.js @@ -11,4 +11,6 @@ tmp[Symbol.toPrimitive] = function () { %ArrayBufferDetach(arr.buffer); return 50; } -arr.copyWithin(tmp); +assertThrows(function() { + arr.copyWithin(tmp); +}, TypeError); diff --git a/deps/v8/test/mjsunit/harmony/private-brand-checks.js b/deps/v8/test/mjsunit/harmony/private-brand-checks.js index 8ee8774480..45dd384504 100644 --- a/deps/v8/test/mjsunit/harmony/private-brand-checks.js +++ b/deps/v8/test/mjsunit/harmony/private-brand-checks.js @@ -565,3 +565,8 @@ const commonThrowCases = [100, 'foo', undefined, null]; assertFalse(d.exfilEval(c)); assertFalse(d.exfilEval(d)); })(); + +(function TestBinaryOperatorPrecedenceParseError() { + assertThrows(() => eval(`class C { #x; test() { 0 << #x in {} } }`), + SyntaxError); +})(); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-flag-sequence-generated.js b/deps/v8/test/mjsunit/harmony/regexp-property-emoji-flag-sequence-generated.js deleted file mode 100644 index 1de0a48e3f..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-flag-sequence-generated.js +++ /dev/null @@ -1,270 +0,0 @@ -// Copyright 2019 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// These tests have been generated by the script at -// https://gist.github.com/mathiasbynens/3b42c99a227521dabfe68d9e63f00f42. -// Do not modify this file directly! - -const re = /\p{Emoji_Flag_Sequence}/u; - -assertTrue(re.test('\u{1F1E6}\u{1F1E8}')); -assertTrue(re.test('\u{1F1FF}\u{1F1FC}')); -assertTrue(re.test('\u{1F1E6}\u{1F1EA}')); -assertTrue(re.test('\u{1F1E6}\u{1F1EB}')); -assertTrue(re.test('\u{1F1E6}\u{1F1EC}')); -assertTrue(re.test('\u{1F1E6}\u{1F1EE}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F1}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F2}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F4}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F6}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F7}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F8}')); -assertTrue(re.test('\u{1F1E6}\u{1F1F9}')); -assertTrue(re.test('\u{1F1E6}\u{1F1FA}')); -assertTrue(re.test('\u{1F1E6}\u{1F1FC}')); -assertTrue(re.test('\u{1F1E6}\u{1F1FD}')); -assertTrue(re.test('\u{1F1E6}\u{1F1FF}')); -assertTrue(re.test('\u{1F1E7}\u{1F1E6}')); -assertTrue(re.test('\u{1F1E7}\u{1F1E7}')); -assertTrue(re.test('\u{1F1E7}\u{1F1E9}')); -assertTrue(re.test('\u{1F1E7}\u{1F1EA}')); -assertTrue(re.test('\u{1F1E7}\u{1F1EB}')); -assertTrue(re.test('\u{1F1E7}\u{1F1EC}')); -assertTrue(re.test('\u{1F1E7}\u{1F1ED}')); -assertTrue(re.test('\u{1F1E7}\u{1F1EE}')); -assertTrue(re.test('\u{1F1E7}\u{1F1EF}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F1}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F2}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F3}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F4}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F6}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F7}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F8}')); -assertTrue(re.test('\u{1F1E7}\u{1F1F9}')); -assertTrue(re.test('\u{1F1E7}\u{1F1FB}')); -assertTrue(re.test('\u{1F1E7}\u{1F1FC}')); -assertTrue(re.test('\u{1F1E7}\u{1F1FE}')); -assertTrue(re.test('\u{1F1E7}\u{1F1FF}')); -assertTrue(re.test('\u{1F1E8}\u{1F1E6}')); -assertTrue(re.test('\u{1F1E8}\u{1F1E8}')); -assertTrue(re.test('\u{1F1E8}\u{1F1E9}')); -assertTrue(re.test('\u{1F1E8}\u{1F1EB}')); -assertTrue(re.test('\u{1F1E8}\u{1F1EC}')); -assertTrue(re.test('\u{1F1E8}\u{1F1ED}')); -assertTrue(re.test('\u{1F1E8}\u{1F1EE}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F0}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F1}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F2}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F3}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F4}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F5}')); -assertTrue(re.test('\u{1F1E8}\u{1F1F7}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FA}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FB}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FC}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FD}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FE}')); -assertTrue(re.test('\u{1F1E8}\u{1F1FF}')); -assertTrue(re.test('\u{1F1E9}\u{1F1EA}')); -assertTrue(re.test('\u{1F1E9}\u{1F1EC}')); -assertTrue(re.test('\u{1F1E9}\u{1F1EF}')); -assertTrue(re.test('\u{1F1E9}\u{1F1F0}')); -assertTrue(re.test('\u{1F1E9}\u{1F1F2}')); -assertTrue(re.test('\u{1F1E9}\u{1F1F4}')); -assertTrue(re.test('\u{1F1E9}\u{1F1FF}')); -assertTrue(re.test('\u{1F1EA}\u{1F1E6}')); -assertTrue(re.test('\u{1F1EA}\u{1F1E8}')); -assertTrue(re.test('\u{1F1EA}\u{1F1EA}')); -assertTrue(re.test('\u{1F1EA}\u{1F1EC}')); -assertTrue(re.test('\u{1F1EA}\u{1F1ED}')); -assertTrue(re.test('\u{1F1EA}\u{1F1F7}')); -assertTrue(re.test('\u{1F1EA}\u{1F1F8}')); -assertTrue(re.test('\u{1F1EA}\u{1F1F9}')); -assertTrue(re.test('\u{1F1EA}\u{1F1FA}')); -assertTrue(re.test('\u{1F1EB}\u{1F1EE}')); -assertTrue(re.test('\u{1F1EB}\u{1F1EF}')); -assertTrue(re.test('\u{1F1EB}\u{1F1F0}')); -assertTrue(re.test('\u{1F1EB}\u{1F1F2}')); -assertTrue(re.test('\u{1F1EB}\u{1F1F4}')); -assertTrue(re.test('\u{1F1EB}\u{1F1F7}')); -assertTrue(re.test('\u{1F1EC}\u{1F1E6}')); -assertTrue(re.test('\u{1F1EC}\u{1F1E7}')); -assertTrue(re.test('\u{1F1EC}\u{1F1E9}')); -assertTrue(re.test('\u{1F1EC}\u{1F1EA}')); -assertTrue(re.test('\u{1F1EC}\u{1F1EB}')); -assertTrue(re.test('\u{1F1EC}\u{1F1EC}')); -assertTrue(re.test('\u{1F1EC}\u{1F1ED}')); -assertTrue(re.test('\u{1F1EC}\u{1F1EE}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F1}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F2}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F3}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F5}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F6}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F7}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F8}')); -assertTrue(re.test('\u{1F1EC}\u{1F1F9}')); -assertTrue(re.test('\u{1F1EC}\u{1F1FA}')); -assertTrue(re.test('\u{1F1EC}\u{1F1FC}')); -assertTrue(re.test('\u{1F1EC}\u{1F1FE}')); -assertTrue(re.test('\u{1F1ED}\u{1F1F0}')); -assertTrue(re.test('\u{1F1ED}\u{1F1F2}')); -assertTrue(re.test('\u{1F1ED}\u{1F1F3}')); -assertTrue(re.test('\u{1F1ED}\u{1F1F7}')); -assertTrue(re.test('\u{1F1ED}\u{1F1F9}')); -assertTrue(re.test('\u{1F1ED}\u{1F1FA}')); -assertTrue(re.test('\u{1F1EE}\u{1F1E8}')); -assertTrue(re.test('\u{1F1EE}\u{1F1E9}')); -assertTrue(re.test('\u{1F1EE}\u{1F1EA}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F1}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F2}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F3}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F4}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F6}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F7}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F8}')); -assertTrue(re.test('\u{1F1EE}\u{1F1F9}')); -assertTrue(re.test('\u{1F1EF}\u{1F1EA}')); -assertTrue(re.test('\u{1F1EF}\u{1F1F2}')); -assertTrue(re.test('\u{1F1EF}\u{1F1F4}')); -assertTrue(re.test('\u{1F1EF}\u{1F1F5}')); -assertTrue(re.test('\u{1F1F0}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F0}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F0}\u{1F1ED}')); -assertTrue(re.test('\u{1F1F0}\u{1F1EE}')); -assertTrue(re.test('\u{1F1F0}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F0}\u{1F1F3}')); -assertTrue(re.test('\u{1F1F0}\u{1F1F5}')); -assertTrue(re.test('\u{1F1F0}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F0}\u{1F1FC}')); -assertTrue(re.test('\u{1F1E6}\u{1F1E9}')); -assertTrue(re.test('\u{1F1F0}\u{1F1FF}')); -assertTrue(re.test('\u{1F1F1}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F1}\u{1F1E7}')); -assertTrue(re.test('\u{1F1F1}\u{1F1E8}')); -assertTrue(re.test('\u{1F1F1}\u{1F1EE}')); -assertTrue(re.test('\u{1F1F1}\u{1F1F0}')); -assertTrue(re.test('\u{1F1F1}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F1}\u{1F1F8}')); -assertTrue(re.test('\u{1F1F1}\u{1F1F9}')); -assertTrue(re.test('\u{1F1F1}\u{1F1FA}')); -assertTrue(re.test('\u{1F1F1}\u{1F1FB}')); -assertTrue(re.test('\u{1F1F1}\u{1F1FE}')); -assertTrue(re.test('\u{1F1F2}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F2}\u{1F1E8}')); -assertTrue(re.test('\u{1F1F2}\u{1F1E9}')); -assertTrue(re.test('\u{1F1F2}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F2}\u{1F1EB}')); -assertTrue(re.test('\u{1F1F2}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F2}\u{1F1ED}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F0}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F1}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F3}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F4}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F5}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F6}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F8}')); -assertTrue(re.test('\u{1F1F2}\u{1F1F9}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FA}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FB}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FC}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FD}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FE}')); -assertTrue(re.test('\u{1F1F2}\u{1F1FF}')); -assertTrue(re.test('\u{1F1F3}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F3}\u{1F1E8}')); -assertTrue(re.test('\u{1F1F3}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F3}\u{1F1EB}')); -assertTrue(re.test('\u{1F1F3}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F3}\u{1F1EE}')); -assertTrue(re.test('\u{1F1F3}\u{1F1F1}')); -assertTrue(re.test('\u{1F1F3}\u{1F1F4}')); -assertTrue(re.test('\u{1F1F3}\u{1F1F5}')); -assertTrue(re.test('\u{1F1F3}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F3}\u{1F1FA}')); -assertTrue(re.test('\u{1F1F3}\u{1F1FF}')); -assertTrue(re.test('\u{1F1F4}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F5}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F5}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F5}\u{1F1EB}')); -assertTrue(re.test('\u{1F1F5}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F5}\u{1F1ED}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F0}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F1}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F3}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F8}')); -assertTrue(re.test('\u{1F1F5}\u{1F1F9}')); -assertTrue(re.test('\u{1F1F5}\u{1F1FC}')); -assertTrue(re.test('\u{1F1F5}\u{1F1FE}')); -assertTrue(re.test('\u{1F1F6}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F7}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F7}\u{1F1F4}')); -assertTrue(re.test('\u{1F1F7}\u{1F1F8}')); -assertTrue(re.test('\u{1F1F7}\u{1F1FA}')); -assertTrue(re.test('\u{1F1F7}\u{1F1FC}')); -assertTrue(re.test('\u{1F1F8}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F8}\u{1F1E7}')); -assertTrue(re.test('\u{1F1F8}\u{1F1E8}')); -assertTrue(re.test('\u{1F1F8}\u{1F1E9}')); -assertTrue(re.test('\u{1F1F8}\u{1F1EA}')); -assertTrue(re.test('\u{1F1F8}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F8}\u{1F1ED}')); -assertTrue(re.test('\u{1F1F8}\u{1F1EE}')); -assertTrue(re.test('\u{1F1F8}\u{1F1EF}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F0}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F1}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F3}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F4}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F8}')); -assertTrue(re.test('\u{1F1F8}\u{1F1F9}')); -assertTrue(re.test('\u{1F1F8}\u{1F1FB}')); -assertTrue(re.test('\u{1F1F8}\u{1F1FD}')); -assertTrue(re.test('\u{1F1F8}\u{1F1FE}')); -assertTrue(re.test('\u{1F1F8}\u{1F1FF}')); -assertTrue(re.test('\u{1F1F9}\u{1F1E6}')); -assertTrue(re.test('\u{1F1F9}\u{1F1E8}')); -assertTrue(re.test('\u{1F1F9}\u{1F1E9}')); -assertTrue(re.test('\u{1F1F9}\u{1F1EB}')); -assertTrue(re.test('\u{1F1F9}\u{1F1EC}')); -assertTrue(re.test('\u{1F1F9}\u{1F1ED}')); -assertTrue(re.test('\u{1F1F9}\u{1F1EF}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F0}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F1}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F3}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F4}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F7}')); -assertTrue(re.test('\u{1F1F9}\u{1F1F9}')); -assertTrue(re.test('\u{1F1F9}\u{1F1FB}')); -assertTrue(re.test('\u{1F1F9}\u{1F1FC}')); -assertTrue(re.test('\u{1F1F9}\u{1F1FF}')); -assertTrue(re.test('\u{1F1FA}\u{1F1E6}')); -assertTrue(re.test('\u{1F1FA}\u{1F1EC}')); -assertTrue(re.test('\u{1F1FA}\u{1F1F2}')); -assertTrue(re.test('\u{1F1FA}\u{1F1F3}')); -assertTrue(re.test('\u{1F1FA}\u{1F1F8}')); -assertTrue(re.test('\u{1F1FA}\u{1F1FE}')); -assertTrue(re.test('\u{1F1FA}\u{1F1FF}')); -assertTrue(re.test('\u{1F1FB}\u{1F1E6}')); -assertTrue(re.test('\u{1F1FB}\u{1F1E8}')); -assertTrue(re.test('\u{1F1FB}\u{1F1EA}')); -assertTrue(re.test('\u{1F1FB}\u{1F1EC}')); -assertTrue(re.test('\u{1F1FB}\u{1F1EE}')); -assertTrue(re.test('\u{1F1FB}\u{1F1F3}')); -assertTrue(re.test('\u{1F1FB}\u{1F1FA}')); -assertTrue(re.test('\u{1F1FC}\u{1F1EB}')); -assertTrue(re.test('\u{1F1FC}\u{1F1F8}')); -assertTrue(re.test('\u{1F1FD}\u{1F1F0}')); -assertTrue(re.test('\u{1F1FE}\u{1F1EA}')); -assertTrue(re.test('\u{1F1FE}\u{1F1F9}')); -assertTrue(re.test('\u{1F1FF}\u{1F1E6}')); -assertTrue(re.test('\u{1F1FF}\u{1F1F2}')); -assertTrue(re.test('\u{1F1F0}\u{1F1FE}')); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-keycap-sequence-generated.js b/deps/v8/test/mjsunit/harmony/regexp-property-emoji-keycap-sequence-generated.js deleted file mode 100644 index 2d72b474d9..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-keycap-sequence-generated.js +++ /dev/null @@ -1,24 +0,0 @@ -// Copyright 2019 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// These tests have been generated by the script at -// https://gist.github.com/mathiasbynens/3b42c99a227521dabfe68d9e63f00f42. -// Do not modify this file directly! - -const re = /\p{Emoji_Keycap_Sequence}/u; - -assertTrue(re.test('#\uFE0F\u20E3')); -assertTrue(re.test('9\uFE0F\u20E3')); -assertTrue(re.test('0\uFE0F\u20E3')); -assertTrue(re.test('1\uFE0F\u20E3')); -assertTrue(re.test('2\uFE0F\u20E3')); -assertTrue(re.test('3\uFE0F\u20E3')); -assertTrue(re.test('*\uFE0F\u20E3')); -assertTrue(re.test('5\uFE0F\u20E3')); -assertTrue(re.test('6\uFE0F\u20E3')); -assertTrue(re.test('7\uFE0F\u20E3')); -assertTrue(re.test('8\uFE0F\u20E3')); -assertTrue(re.test('4\uFE0F\u20E3')); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-modifier-sequence-generated.js b/deps/v8/test/mjsunit/harmony/regexp-property-emoji-modifier-sequence-generated.js deleted file mode 100644 index b990bf7aaf..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-modifier-sequence-generated.js +++ /dev/null @@ -1,541 +0,0 @@ -// Copyright 2018 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// TODO(mathias): Update these tests once a Unicode 12-friendly ICU -// version rolls into V8. - -const re = /\p{Emoji_Modifier_Sequence}/u; - -assertTrue(re.test('\u261D\u{1F3FB}')); -assertTrue(re.test('\u{1F9DD}\u{1F3FF}')); -assertTrue(re.test('\u261D\u{1F3FD}')); -assertTrue(re.test('\u261D\u{1F3FE}')); -assertTrue(re.test('\u261D\u{1F3FF}')); -assertTrue(re.test('\u26F9\u{1F3FB}')); -assertTrue(re.test('\u26F9\u{1F3FC}')); -assertTrue(re.test('\u26F9\u{1F3FD}')); -assertTrue(re.test('\u26F9\u{1F3FE}')); -assertTrue(re.test('\u26F9\u{1F3FF}')); -assertTrue(re.test('\u270A\u{1F3FB}')); -assertTrue(re.test('\u270A\u{1F3FC}')); -assertTrue(re.test('\u270A\u{1F3FD}')); -assertTrue(re.test('\u270A\u{1F3FE}')); -assertTrue(re.test('\u270A\u{1F3FF}')); -assertTrue(re.test('\u270B\u{1F3FB}')); -assertTrue(re.test('\u270B\u{1F3FC}')); -assertTrue(re.test('\u270B\u{1F3FD}')); -assertTrue(re.test('\u270B\u{1F3FE}')); -assertTrue(re.test('\u270B\u{1F3FF}')); -assertTrue(re.test('\u270C\u{1F3FB}')); -assertTrue(re.test('\u270C\u{1F3FC}')); -assertTrue(re.test('\u270C\u{1F3FD}')); -assertTrue(re.test('\u270C\u{1F3FE}')); -assertTrue(re.test('\u270C\u{1F3FF}')); -assertTrue(re.test('\u270D\u{1F3FB}')); -assertTrue(re.test('\u270D\u{1F3FC}')); -assertTrue(re.test('\u270D\u{1F3FD}')); -assertTrue(re.test('\u270D\u{1F3FE}')); -assertTrue(re.test('\u270D\u{1F3FF}')); -assertTrue(re.test('\u{1F385}\u{1F3FB}')); -assertTrue(re.test('\u{1F385}\u{1F3FC}')); -assertTrue(re.test('\u{1F385}\u{1F3FD}')); -assertTrue(re.test('\u{1F385}\u{1F3FE}')); -assertTrue(re.test('\u{1F385}\u{1F3FF}')); -assertTrue(re.test('\u{1F3C2}\u{1F3FB}')); -assertTrue(re.test('\u{1F3C2}\u{1F3FC}')); -assertTrue(re.test('\u{1F3C2}\u{1F3FD}')); -assertTrue(re.test('\u{1F3C2}\u{1F3FE}')); -assertTrue(re.test('\u{1F3C2}\u{1F3FF}')); -assertTrue(re.test('\u{1F3C3}\u{1F3FB}')); -assertTrue(re.test('\u{1F3C3}\u{1F3FC}')); -assertTrue(re.test('\u{1F3C3}\u{1F3FD}')); -assertTrue(re.test('\u{1F3C3}\u{1F3FE}')); -assertTrue(re.test('\u{1F3C3}\u{1F3FF}')); -assertTrue(re.test('\u{1F3C4}\u{1F3FB}')); -assertTrue(re.test('\u{1F3C4}\u{1F3FC}')); -assertTrue(re.test('\u{1F3C4}\u{1F3FD}')); -assertTrue(re.test('\u{1F3C4}\u{1F3FE}')); -assertTrue(re.test('\u{1F3C4}\u{1F3FF}')); -assertTrue(re.test('\u{1F3C7}\u{1F3FB}')); -assertTrue(re.test('\u{1F3C7}\u{1F3FC}')); -assertTrue(re.test('\u{1F3C7}\u{1F3FD}')); -assertTrue(re.test('\u{1F3C7}\u{1F3FE}')); -assertTrue(re.test('\u{1F3C7}\u{1F3FF}')); -assertTrue(re.test('\u{1F3CA}\u{1F3FB}')); -assertTrue(re.test('\u{1F3CA}\u{1F3FC}')); -assertTrue(re.test('\u{1F3CA}\u{1F3FD}')); -assertTrue(re.test('\u{1F3CA}\u{1F3FE}')); -assertTrue(re.test('\u{1F3CA}\u{1F3FF}')); -assertTrue(re.test('\u{1F3CB}\u{1F3FB}')); -assertTrue(re.test('\u{1F3CB}\u{1F3FC}')); -assertTrue(re.test('\u{1F3CB}\u{1F3FD}')); -assertTrue(re.test('\u{1F3CB}\u{1F3FE}')); -assertTrue(re.test('\u{1F3CB}\u{1F3FF}')); -assertTrue(re.test('\u{1F3CC}\u{1F3FB}')); -assertTrue(re.test('\u{1F3CC}\u{1F3FC}')); -assertTrue(re.test('\u{1F3CC}\u{1F3FD}')); -assertTrue(re.test('\u{1F3CC}\u{1F3FE}')); -assertTrue(re.test('\u{1F3CC}\u{1F3FF}')); -assertTrue(re.test('\u{1F442}\u{1F3FB}')); -assertTrue(re.test('\u{1F442}\u{1F3FC}')); -assertTrue(re.test('\u{1F442}\u{1F3FD}')); -assertTrue(re.test('\u{1F442}\u{1F3FE}')); -assertTrue(re.test('\u{1F442}\u{1F3FF}')); -assertTrue(re.test('\u{1F443}\u{1F3FB}')); -assertTrue(re.test('\u{1F443}\u{1F3FC}')); -assertTrue(re.test('\u{1F443}\u{1F3FD}')); -assertTrue(re.test('\u{1F443}\u{1F3FE}')); -assertTrue(re.test('\u{1F443}\u{1F3FF}')); -assertTrue(re.test('\u{1F446}\u{1F3FB}')); -assertTrue(re.test('\u{1F446}\u{1F3FC}')); -assertTrue(re.test('\u{1F446}\u{1F3FD}')); -assertTrue(re.test('\u{1F446}\u{1F3FE}')); -assertTrue(re.test('\u{1F446}\u{1F3FF}')); -assertTrue(re.test('\u{1F447}\u{1F3FB}')); -assertTrue(re.test('\u{1F447}\u{1F3FC}')); -assertTrue(re.test('\u{1F447}\u{1F3FD}')); -assertTrue(re.test('\u{1F447}\u{1F3FE}')); -assertTrue(re.test('\u{1F447}\u{1F3FF}')); -assertTrue(re.test('\u{1F448}\u{1F3FB}')); -assertTrue(re.test('\u{1F448}\u{1F3FC}')); -assertTrue(re.test('\u{1F448}\u{1F3FD}')); -assertTrue(re.test('\u{1F448}\u{1F3FE}')); -assertTrue(re.test('\u{1F448}\u{1F3FF}')); -assertTrue(re.test('\u{1F449}\u{1F3FB}')); -assertTrue(re.test('\u{1F449}\u{1F3FC}')); -assertTrue(re.test('\u{1F449}\u{1F3FD}')); -assertTrue(re.test('\u{1F449}\u{1F3FE}')); -assertTrue(re.test('\u{1F449}\u{1F3FF}')); -assertTrue(re.test('\u{1F44A}\u{1F3FB}')); -assertTrue(re.test('\u{1F44A}\u{1F3FC}')); -assertTrue(re.test('\u{1F44A}\u{1F3FD}')); -assertTrue(re.test('\u{1F44A}\u{1F3FE}')); -assertTrue(re.test('\u{1F44A}\u{1F3FF}')); -assertTrue(re.test('\u{1F44B}\u{1F3FB}')); -assertTrue(re.test('\u{1F44B}\u{1F3FC}')); -assertTrue(re.test('\u{1F44B}\u{1F3FD}')); -assertTrue(re.test('\u{1F44B}\u{1F3FE}')); -assertTrue(re.test('\u{1F44B}\u{1F3FF}')); -assertTrue(re.test('\u{1F44C}\u{1F3FB}')); -assertTrue(re.test('\u{1F44C}\u{1F3FC}')); -assertTrue(re.test('\u{1F44C}\u{1F3FD}')); -assertTrue(re.test('\u{1F44C}\u{1F3FE}')); -assertTrue(re.test('\u{1F44C}\u{1F3FF}')); -assertTrue(re.test('\u{1F44D}\u{1F3FB}')); -assertTrue(re.test('\u{1F44D}\u{1F3FC}')); -assertTrue(re.test('\u{1F44D}\u{1F3FD}')); -assertTrue(re.test('\u{1F44D}\u{1F3FE}')); -assertTrue(re.test('\u{1F44D}\u{1F3FF}')); -assertTrue(re.test('\u{1F44E}\u{1F3FB}')); -assertTrue(re.test('\u{1F44E}\u{1F3FC}')); -assertTrue(re.test('\u{1F44E}\u{1F3FD}')); -assertTrue(re.test('\u{1F44E}\u{1F3FE}')); -assertTrue(re.test('\u{1F44E}\u{1F3FF}')); -assertTrue(re.test('\u{1F44F}\u{1F3FB}')); -assertTrue(re.test('\u{1F44F}\u{1F3FC}')); -assertTrue(re.test('\u{1F44F}\u{1F3FD}')); -assertTrue(re.test('\u{1F44F}\u{1F3FE}')); -assertTrue(re.test('\u{1F44F}\u{1F3FF}')); -assertTrue(re.test('\u{1F450}\u{1F3FB}')); -assertTrue(re.test('\u{1F450}\u{1F3FC}')); -assertTrue(re.test('\u{1F450}\u{1F3FD}')); -assertTrue(re.test('\u{1F450}\u{1F3FE}')); -assertTrue(re.test('\u{1F450}\u{1F3FF}')); -assertTrue(re.test('\u{1F466}\u{1F3FB}')); -assertTrue(re.test('\u{1F466}\u{1F3FC}')); -assertTrue(re.test('\u{1F466}\u{1F3FD}')); -assertTrue(re.test('\u{1F466}\u{1F3FE}')); -assertTrue(re.test('\u{1F466}\u{1F3FF}')); -assertTrue(re.test('\u{1F467}\u{1F3FB}')); -assertTrue(re.test('\u{1F467}\u{1F3FC}')); -assertTrue(re.test('\u{1F467}\u{1F3FD}')); -assertTrue(re.test('\u{1F467}\u{1F3FE}')); -assertTrue(re.test('\u{1F467}\u{1F3FF}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}')); -assertTrue(re.test('\u{1F46E}\u{1F3FB}')); -assertTrue(re.test('\u{1F46E}\u{1F3FC}')); -assertTrue(re.test('\u{1F46E}\u{1F3FD}')); -assertTrue(re.test('\u{1F46E}\u{1F3FE}')); -assertTrue(re.test('\u{1F46E}\u{1F3FF}')); -assertTrue(re.test('\u{1F470}\u{1F3FB}')); -assertTrue(re.test('\u{1F470}\u{1F3FC}')); -assertTrue(re.test('\u{1F470}\u{1F3FD}')); -assertTrue(re.test('\u{1F470}\u{1F3FE}')); -assertTrue(re.test('\u{1F470}\u{1F3FF}')); -assertTrue(re.test('\u{1F471}\u{1F3FB}')); -assertTrue(re.test('\u{1F471}\u{1F3FC}')); -assertTrue(re.test('\u{1F471}\u{1F3FD}')); -assertTrue(re.test('\u{1F471}\u{1F3FE}')); -assertTrue(re.test('\u{1F471}\u{1F3FF}')); -assertTrue(re.test('\u{1F472}\u{1F3FB}')); -assertTrue(re.test('\u{1F472}\u{1F3FC}')); -assertTrue(re.test('\u{1F472}\u{1F3FD}')); -assertTrue(re.test('\u{1F472}\u{1F3FE}')); -assertTrue(re.test('\u{1F472}\u{1F3FF}')); -assertTrue(re.test('\u{1F473}\u{1F3FB}')); -assertTrue(re.test('\u{1F473}\u{1F3FC}')); -assertTrue(re.test('\u{1F473}\u{1F3FD}')); -assertTrue(re.test('\u{1F473}\u{1F3FE}')); -assertTrue(re.test('\u{1F473}\u{1F3FF}')); -assertTrue(re.test('\u{1F474}\u{1F3FB}')); -assertTrue(re.test('\u{1F474}\u{1F3FC}')); -assertTrue(re.test('\u{1F474}\u{1F3FD}')); -assertTrue(re.test('\u{1F474}\u{1F3FE}')); -assertTrue(re.test('\u{1F474}\u{1F3FF}')); -assertTrue(re.test('\u{1F475}\u{1F3FB}')); -assertTrue(re.test('\u{1F475}\u{1F3FC}')); -assertTrue(re.test('\u{1F475}\u{1F3FD}')); -assertTrue(re.test('\u{1F475}\u{1F3FE}')); -assertTrue(re.test('\u{1F475}\u{1F3FF}')); -assertTrue(re.test('\u{1F476}\u{1F3FB}')); -assertTrue(re.test('\u{1F476}\u{1F3FC}')); -assertTrue(re.test('\u{1F476}\u{1F3FD}')); -assertTrue(re.test('\u{1F476}\u{1F3FE}')); -assertTrue(re.test('\u{1F476}\u{1F3FF}')); -assertTrue(re.test('\u{1F477}\u{1F3FB}')); -assertTrue(re.test('\u{1F477}\u{1F3FC}')); -assertTrue(re.test('\u{1F477}\u{1F3FD}')); -assertTrue(re.test('\u{1F477}\u{1F3FE}')); -assertTrue(re.test('\u{1F477}\u{1F3FF}')); -assertTrue(re.test('\u{1F478}\u{1F3FB}')); -assertTrue(re.test('\u{1F478}\u{1F3FC}')); -assertTrue(re.test('\u{1F478}\u{1F3FD}')); -assertTrue(re.test('\u{1F478}\u{1F3FE}')); -assertTrue(re.test('\u{1F478}\u{1F3FF}')); -assertTrue(re.test('\u{1F47C}\u{1F3FB}')); -assertTrue(re.test('\u{1F47C}\u{1F3FC}')); -assertTrue(re.test('\u{1F47C}\u{1F3FD}')); -assertTrue(re.test('\u{1F47C}\u{1F3FE}')); -assertTrue(re.test('\u{1F47C}\u{1F3FF}')); -assertTrue(re.test('\u{1F481}\u{1F3FB}')); -assertTrue(re.test('\u{1F481}\u{1F3FC}')); -assertTrue(re.test('\u{1F481}\u{1F3FD}')); -assertTrue(re.test('\u{1F481}\u{1F3FE}')); -assertTrue(re.test('\u{1F481}\u{1F3FF}')); -assertTrue(re.test('\u{1F482}\u{1F3FB}')); -assertTrue(re.test('\u{1F482}\u{1F3FC}')); -assertTrue(re.test('\u{1F482}\u{1F3FD}')); -assertTrue(re.test('\u{1F482}\u{1F3FE}')); -assertTrue(re.test('\u{1F482}\u{1F3FF}')); -assertTrue(re.test('\u{1F483}\u{1F3FB}')); -assertTrue(re.test('\u{1F483}\u{1F3FC}')); -assertTrue(re.test('\u{1F483}\u{1F3FD}')); -assertTrue(re.test('\u{1F483}\u{1F3FE}')); -assertTrue(re.test('\u{1F483}\u{1F3FF}')); -assertTrue(re.test('\u{1F485}\u{1F3FB}')); -assertTrue(re.test('\u{1F485}\u{1F3FC}')); -assertTrue(re.test('\u{1F485}\u{1F3FD}')); -assertTrue(re.test('\u{1F485}\u{1F3FE}')); -assertTrue(re.test('\u{1F485}\u{1F3FF}')); -assertTrue(re.test('\u{1F486}\u{1F3FB}')); -assertTrue(re.test('\u{1F486}\u{1F3FC}')); -assertTrue(re.test('\u{1F486}\u{1F3FD}')); -assertTrue(re.test('\u{1F486}\u{1F3FE}')); -assertTrue(re.test('\u{1F486}\u{1F3FF}')); -assertTrue(re.test('\u{1F487}\u{1F3FB}')); -assertTrue(re.test('\u{1F487}\u{1F3FC}')); -assertTrue(re.test('\u{1F487}\u{1F3FD}')); -assertTrue(re.test('\u{1F487}\u{1F3FE}')); -assertTrue(re.test('\u{1F487}\u{1F3FF}')); -assertTrue(re.test('\u{1F4AA}\u{1F3FB}')); -assertTrue(re.test('\u{1F4AA}\u{1F3FC}')); -assertTrue(re.test('\u{1F4AA}\u{1F3FD}')); -assertTrue(re.test('\u{1F4AA}\u{1F3FE}')); -assertTrue(re.test('\u{1F4AA}\u{1F3FF}')); -assertTrue(re.test('\u{1F574}\u{1F3FB}')); -assertTrue(re.test('\u{1F574}\u{1F3FC}')); -assertTrue(re.test('\u{1F574}\u{1F3FD}')); -assertTrue(re.test('\u{1F574}\u{1F3FE}')); -assertTrue(re.test('\u{1F574}\u{1F3FF}')); -assertTrue(re.test('\u{1F575}\u{1F3FB}')); -assertTrue(re.test('\u{1F575}\u{1F3FC}')); -assertTrue(re.test('\u{1F575}\u{1F3FD}')); -assertTrue(re.test('\u{1F575}\u{1F3FE}')); -assertTrue(re.test('\u{1F575}\u{1F3FF}')); -assertTrue(re.test('\u{1F57A}\u{1F3FB}')); -assertTrue(re.test('\u{1F57A}\u{1F3FC}')); -assertTrue(re.test('\u{1F57A}\u{1F3FD}')); -assertTrue(re.test('\u{1F57A}\u{1F3FE}')); -assertTrue(re.test('\u{1F57A}\u{1F3FF}')); -assertTrue(re.test('\u{1F590}\u{1F3FB}')); -assertTrue(re.test('\u{1F590}\u{1F3FC}')); -assertTrue(re.test('\u{1F590}\u{1F3FD}')); -assertTrue(re.test('\u{1F590}\u{1F3FE}')); -assertTrue(re.test('\u{1F590}\u{1F3FF}')); -assertTrue(re.test('\u261D\u{1F3FC}')); -assertTrue(re.test('\u{1F595}\u{1F3FC}')); -assertTrue(re.test('\u{1F595}\u{1F3FD}')); -assertTrue(re.test('\u{1F595}\u{1F3FE}')); -assertTrue(re.test('\u{1F595}\u{1F3FF}')); -assertTrue(re.test('\u{1F596}\u{1F3FB}')); -assertTrue(re.test('\u{1F596}\u{1F3FC}')); -assertTrue(re.test('\u{1F596}\u{1F3FD}')); -assertTrue(re.test('\u{1F596}\u{1F3FE}')); -assertTrue(re.test('\u{1F596}\u{1F3FF}')); -assertTrue(re.test('\u{1F645}\u{1F3FB}')); -assertTrue(re.test('\u{1F645}\u{1F3FC}')); -assertTrue(re.test('\u{1F645}\u{1F3FD}')); -assertTrue(re.test('\u{1F645}\u{1F3FE}')); -assertTrue(re.test('\u{1F645}\u{1F3FF}')); -assertTrue(re.test('\u{1F646}\u{1F3FB}')); -assertTrue(re.test('\u{1F646}\u{1F3FC}')); -assertTrue(re.test('\u{1F646}\u{1F3FD}')); -assertTrue(re.test('\u{1F646}\u{1F3FE}')); -assertTrue(re.test('\u{1F646}\u{1F3FF}')); -assertTrue(re.test('\u{1F647}\u{1F3FB}')); -assertTrue(re.test('\u{1F647}\u{1F3FC}')); -assertTrue(re.test('\u{1F647}\u{1F3FD}')); -assertTrue(re.test('\u{1F647}\u{1F3FE}')); -assertTrue(re.test('\u{1F647}\u{1F3FF}')); -assertTrue(re.test('\u{1F64B}\u{1F3FB}')); -assertTrue(re.test('\u{1F64B}\u{1F3FC}')); -assertTrue(re.test('\u{1F64B}\u{1F3FD}')); -assertTrue(re.test('\u{1F64B}\u{1F3FE}')); -assertTrue(re.test('\u{1F64B}\u{1F3FF}')); -assertTrue(re.test('\u{1F64C}\u{1F3FB}')); -assertTrue(re.test('\u{1F64C}\u{1F3FC}')); -assertTrue(re.test('\u{1F64C}\u{1F3FD}')); -assertTrue(re.test('\u{1F64C}\u{1F3FE}')); -assertTrue(re.test('\u{1F64C}\u{1F3FF}')); -assertTrue(re.test('\u{1F64D}\u{1F3FB}')); -assertTrue(re.test('\u{1F64D}\u{1F3FC}')); -assertTrue(re.test('\u{1F64D}\u{1F3FD}')); -assertTrue(re.test('\u{1F64D}\u{1F3FE}')); -assertTrue(re.test('\u{1F64D}\u{1F3FF}')); -assertTrue(re.test('\u{1F64E}\u{1F3FB}')); -assertTrue(re.test('\u{1F64E}\u{1F3FC}')); -assertTrue(re.test('\u{1F64E}\u{1F3FD}')); -assertTrue(re.test('\u{1F64E}\u{1F3FE}')); -assertTrue(re.test('\u{1F64E}\u{1F3FF}')); -assertTrue(re.test('\u{1F64F}\u{1F3FB}')); -assertTrue(re.test('\u{1F64F}\u{1F3FC}')); -assertTrue(re.test('\u{1F64F}\u{1F3FD}')); -assertTrue(re.test('\u{1F64F}\u{1F3FE}')); -assertTrue(re.test('\u{1F64F}\u{1F3FF}')); -assertTrue(re.test('\u{1F6A3}\u{1F3FB}')); -assertTrue(re.test('\u{1F6A3}\u{1F3FC}')); -assertTrue(re.test('\u{1F6A3}\u{1F3FD}')); -assertTrue(re.test('\u{1F6A3}\u{1F3FE}')); -assertTrue(re.test('\u{1F6A3}\u{1F3FF}')); -assertTrue(re.test('\u{1F6B4}\u{1F3FB}')); -assertTrue(re.test('\u{1F6B4}\u{1F3FC}')); -assertTrue(re.test('\u{1F6B4}\u{1F3FD}')); -assertTrue(re.test('\u{1F6B4}\u{1F3FE}')); -assertTrue(re.test('\u{1F6B4}\u{1F3FF}')); -assertTrue(re.test('\u{1F6B5}\u{1F3FB}')); -assertTrue(re.test('\u{1F6B5}\u{1F3FC}')); -assertTrue(re.test('\u{1F6B5}\u{1F3FD}')); -assertTrue(re.test('\u{1F6B5}\u{1F3FE}')); -assertTrue(re.test('\u{1F6B5}\u{1F3FF}')); -assertTrue(re.test('\u{1F6B6}\u{1F3FB}')); -assertTrue(re.test('\u{1F6B6}\u{1F3FC}')); -assertTrue(re.test('\u{1F6B6}\u{1F3FD}')); -assertTrue(re.test('\u{1F6B6}\u{1F3FE}')); -assertTrue(re.test('\u{1F6B6}\u{1F3FF}')); -assertTrue(re.test('\u{1F6C0}\u{1F3FB}')); -assertTrue(re.test('\u{1F6C0}\u{1F3FC}')); -assertTrue(re.test('\u{1F6C0}\u{1F3FD}')); -assertTrue(re.test('\u{1F6C0}\u{1F3FE}')); -assertTrue(re.test('\u{1F6C0}\u{1F3FF}')); -assertTrue(re.test('\u{1F6CC}\u{1F3FB}')); -assertTrue(re.test('\u{1F6CC}\u{1F3FC}')); -assertTrue(re.test('\u{1F6CC}\u{1F3FD}')); -assertTrue(re.test('\u{1F6CC}\u{1F3FE}')); -assertTrue(re.test('\u{1F6CC}\u{1F3FF}')); -assertTrue(re.test('\u{1F918}\u{1F3FB}')); -assertTrue(re.test('\u{1F918}\u{1F3FC}')); -assertTrue(re.test('\u{1F918}\u{1F3FD}')); -assertTrue(re.test('\u{1F918}\u{1F3FE}')); -assertTrue(re.test('\u{1F918}\u{1F3FF}')); -assertTrue(re.test('\u{1F919}\u{1F3FB}')); -assertTrue(re.test('\u{1F919}\u{1F3FC}')); -assertTrue(re.test('\u{1F919}\u{1F3FD}')); -assertTrue(re.test('\u{1F919}\u{1F3FE}')); -assertTrue(re.test('\u{1F919}\u{1F3FF}')); -assertTrue(re.test('\u{1F91A}\u{1F3FB}')); -assertTrue(re.test('\u{1F91A}\u{1F3FC}')); -assertTrue(re.test('\u{1F91A}\u{1F3FD}')); -assertTrue(re.test('\u{1F91A}\u{1F3FE}')); -assertTrue(re.test('\u{1F91A}\u{1F3FF}')); -assertTrue(re.test('\u{1F91B}\u{1F3FB}')); -assertTrue(re.test('\u{1F91B}\u{1F3FC}')); -assertTrue(re.test('\u{1F91B}\u{1F3FD}')); -assertTrue(re.test('\u{1F91B}\u{1F3FE}')); -assertTrue(re.test('\u{1F91B}\u{1F3FF}')); -assertTrue(re.test('\u{1F91C}\u{1F3FB}')); -assertTrue(re.test('\u{1F91C}\u{1F3FC}')); -assertTrue(re.test('\u{1F91C}\u{1F3FD}')); -assertTrue(re.test('\u{1F91C}\u{1F3FE}')); -assertTrue(re.test('\u{1F91C}\u{1F3FF}')); -assertTrue(re.test('\u{1F91E}\u{1F3FB}')); -assertTrue(re.test('\u{1F91E}\u{1F3FC}')); -assertTrue(re.test('\u{1F91E}\u{1F3FD}')); -assertTrue(re.test('\u{1F91E}\u{1F3FE}')); -assertTrue(re.test('\u{1F91E}\u{1F3FF}')); -assertTrue(re.test('\u{1F91F}\u{1F3FB}')); -assertTrue(re.test('\u{1F91F}\u{1F3FC}')); -assertTrue(re.test('\u{1F91F}\u{1F3FD}')); -assertTrue(re.test('\u{1F91F}\u{1F3FE}')); -assertTrue(re.test('\u{1F91F}\u{1F3FF}')); -assertTrue(re.test('\u{1F926}\u{1F3FB}')); -assertTrue(re.test('\u{1F926}\u{1F3FC}')); -assertTrue(re.test('\u{1F926}\u{1F3FD}')); -assertTrue(re.test('\u{1F926}\u{1F3FE}')); -assertTrue(re.test('\u{1F926}\u{1F3FF}')); -assertTrue(re.test('\u{1F930}\u{1F3FB}')); -assertTrue(re.test('\u{1F930}\u{1F3FC}')); -assertTrue(re.test('\u{1F930}\u{1F3FD}')); -assertTrue(re.test('\u{1F930}\u{1F3FE}')); -assertTrue(re.test('\u{1F930}\u{1F3FF}')); -assertTrue(re.test('\u{1F931}\u{1F3FB}')); -assertTrue(re.test('\u{1F931}\u{1F3FC}')); -assertTrue(re.test('\u{1F931}\u{1F3FD}')); -assertTrue(re.test('\u{1F931}\u{1F3FE}')); -assertTrue(re.test('\u{1F931}\u{1F3FF}')); -assertTrue(re.test('\u{1F932}\u{1F3FB}')); -assertTrue(re.test('\u{1F932}\u{1F3FC}')); -assertTrue(re.test('\u{1F932}\u{1F3FD}')); -assertTrue(re.test('\u{1F932}\u{1F3FE}')); -assertTrue(re.test('\u{1F932}\u{1F3FF}')); -assertTrue(re.test('\u{1F933}\u{1F3FB}')); -assertTrue(re.test('\u{1F933}\u{1F3FC}')); -assertTrue(re.test('\u{1F933}\u{1F3FD}')); -assertTrue(re.test('\u{1F933}\u{1F3FE}')); -assertTrue(re.test('\u{1F933}\u{1F3FF}')); -assertTrue(re.test('\u{1F934}\u{1F3FB}')); -assertTrue(re.test('\u{1F934}\u{1F3FC}')); -assertTrue(re.test('\u{1F934}\u{1F3FD}')); -assertTrue(re.test('\u{1F934}\u{1F3FE}')); -assertTrue(re.test('\u{1F934}\u{1F3FF}')); -assertTrue(re.test('\u{1F935}\u{1F3FB}')); -assertTrue(re.test('\u{1F935}\u{1F3FC}')); -assertTrue(re.test('\u{1F935}\u{1F3FD}')); -assertTrue(re.test('\u{1F935}\u{1F3FE}')); -assertTrue(re.test('\u{1F935}\u{1F3FF}')); -assertTrue(re.test('\u{1F936}\u{1F3FB}')); -assertTrue(re.test('\u{1F936}\u{1F3FC}')); -assertTrue(re.test('\u{1F936}\u{1F3FD}')); -assertTrue(re.test('\u{1F936}\u{1F3FE}')); -assertTrue(re.test('\u{1F936}\u{1F3FF}')); -assertTrue(re.test('\u{1F937}\u{1F3FB}')); -assertTrue(re.test('\u{1F937}\u{1F3FC}')); -assertTrue(re.test('\u{1F937}\u{1F3FD}')); -assertTrue(re.test('\u{1F937}\u{1F3FE}')); -assertTrue(re.test('\u{1F937}\u{1F3FF}')); -assertTrue(re.test('\u{1F938}\u{1F3FB}')); -assertTrue(re.test('\u{1F938}\u{1F3FC}')); -assertTrue(re.test('\u{1F938}\u{1F3FD}')); -assertTrue(re.test('\u{1F938}\u{1F3FE}')); -assertTrue(re.test('\u{1F938}\u{1F3FF}')); -assertTrue(re.test('\u{1F939}\u{1F3FB}')); -assertTrue(re.test('\u{1F939}\u{1F3FC}')); -assertTrue(re.test('\u{1F939}\u{1F3FD}')); -assertTrue(re.test('\u{1F939}\u{1F3FE}')); -assertTrue(re.test('\u{1F939}\u{1F3FF}')); -assertTrue(re.test('\u{1F93D}\u{1F3FB}')); -assertTrue(re.test('\u{1F93D}\u{1F3FC}')); -assertTrue(re.test('\u{1F93D}\u{1F3FD}')); -assertTrue(re.test('\u{1F93D}\u{1F3FE}')); -assertTrue(re.test('\u{1F93D}\u{1F3FF}')); -assertTrue(re.test('\u{1F93E}\u{1F3FB}')); -assertTrue(re.test('\u{1F93E}\u{1F3FC}')); -assertTrue(re.test('\u{1F93E}\u{1F3FD}')); -assertTrue(re.test('\u{1F93E}\u{1F3FE}')); -assertTrue(re.test('\u{1F93E}\u{1F3FF}')); -assertTrue(re.test('\u{1F9B5}\u{1F3FB}')); -assertTrue(re.test('\u{1F9B5}\u{1F3FC}')); -assertTrue(re.test('\u{1F9B5}\u{1F3FD}')); -assertTrue(re.test('\u{1F9B5}\u{1F3FE}')); -assertTrue(re.test('\u{1F9B5}\u{1F3FF}')); -assertTrue(re.test('\u{1F9B6}\u{1F3FB}')); -assertTrue(re.test('\u{1F9B6}\u{1F3FC}')); -assertTrue(re.test('\u{1F9B6}\u{1F3FD}')); -assertTrue(re.test('\u{1F9B6}\u{1F3FE}')); -assertTrue(re.test('\u{1F9B6}\u{1F3FF}')); -assertTrue(re.test('\u{1F9B8}\u{1F3FB}')); -assertTrue(re.test('\u{1F9B8}\u{1F3FC}')); -assertTrue(re.test('\u{1F9B8}\u{1F3FD}')); -assertTrue(re.test('\u{1F9B8}\u{1F3FE}')); -assertTrue(re.test('\u{1F9B8}\u{1F3FF}')); -assertTrue(re.test('\u{1F9B9}\u{1F3FB}')); -assertTrue(re.test('\u{1F9B9}\u{1F3FC}')); -assertTrue(re.test('\u{1F9B9}\u{1F3FD}')); -assertTrue(re.test('\u{1F9B9}\u{1F3FE}')); -assertTrue(re.test('\u{1F9B9}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D2}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D2}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D2}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D2}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D2}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D3}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D3}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D3}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D3}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D3}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D4}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D4}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D4}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D4}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D4}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D5}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D5}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D5}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D5}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D5}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D6}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D6}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D6}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D6}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D6}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D7}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D7}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D7}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D7}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D7}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D8}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D8}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D8}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D8}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D8}\u{1F3FF}')); -assertTrue(re.test('\u{1F9D9}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D9}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D9}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D9}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D9}\u{1F3FF}')); -assertTrue(re.test('\u{1F9DA}\u{1F3FB}')); -assertTrue(re.test('\u{1F9DA}\u{1F3FC}')); -assertTrue(re.test('\u{1F9DA}\u{1F3FD}')); -assertTrue(re.test('\u{1F9DA}\u{1F3FE}')); -assertTrue(re.test('\u{1F9DA}\u{1F3FF}')); -assertTrue(re.test('\u{1F9DB}\u{1F3FB}')); -assertTrue(re.test('\u{1F9DB}\u{1F3FC}')); -assertTrue(re.test('\u{1F9DB}\u{1F3FD}')); -assertTrue(re.test('\u{1F9DB}\u{1F3FE}')); -assertTrue(re.test('\u{1F9DB}\u{1F3FF}')); -assertTrue(re.test('\u{1F9DC}\u{1F3FB}')); -assertTrue(re.test('\u{1F9DC}\u{1F3FC}')); -assertTrue(re.test('\u{1F9DC}\u{1F3FD}')); -assertTrue(re.test('\u{1F9DC}\u{1F3FE}')); -assertTrue(re.test('\u{1F9DC}\u{1F3FF}')); -assertTrue(re.test('\u{1F9DD}\u{1F3FB}')); -assertTrue(re.test('\u{1F9DD}\u{1F3FC}')); -assertTrue(re.test('\u{1F9DD}\u{1F3FD}')); -assertTrue(re.test('\u{1F9DD}\u{1F3FE}')); -assertTrue(re.test('\u{1F595}\u{1F3FB}')); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-tag-sequence-generated.js b/deps/v8/test/mjsunit/harmony/regexp-property-emoji-tag-sequence-generated.js deleted file mode 100644 index 839d55791f..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-tag-sequence-generated.js +++ /dev/null @@ -1,15 +0,0 @@ -// Copyright 2019 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// These tests have been generated by the script at -// https://gist.github.com/mathiasbynens/3b42c99a227521dabfe68d9e63f00f42. -// Do not modify this file directly! - -const re = /\p{Emoji_Tag_Sequence}/u; - -assertTrue(re.test('\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}\u{E007F}')); -assertTrue(re.test('\u{1F3F4}\u{E0067}\u{E0062}\u{E0073}\u{E0063}\u{E0074}\u{E007F}')); -assertTrue(re.test('\u{1F3F4}\u{E0067}\u{E0062}\u{E0077}\u{E006C}\u{E0073}\u{E007F}')); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-zwj-sequence-generated.js b/deps/v8/test/mjsunit/harmony/regexp-property-emoji-zwj-sequence-generated.js deleted file mode 100644 index b04f0e441b..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-emoji-zwj-sequence-generated.js +++ /dev/null @@ -1,915 +0,0 @@ -// Copyright 2019 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// These tests have been generated by the script at -// https://gist.github.com/mathiasbynens/3b42c99a227521dabfe68d9e63f00f42. -// Do not modify this file directly! - -const re = /\p{Emoji_ZWJ_Sequence}/u; - -assertTrue(re.test('\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F468}')); -assertTrue(re.test('\u{1F441}\uFE0F\u200D\u{1F5E8}\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F466}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F467}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F467}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F468}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F468}\u200D\u{1F466}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F468}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F468}\u200D\u{1F467}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F469}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F469}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F468}')); -assertTrue(re.test('\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F469}')); -assertTrue(re.test('\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}')); -assertTrue(re.test('\u{1F469}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F469}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F466}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F467}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F467}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F469}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F469}\u200D\u{1F466}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F469}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F466}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F469}\u200D\u{1F467}\u200D\u{1F467}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FF}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FF}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FF}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FF}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F468}\u{1F3FE}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FB}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FC}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FD}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F469}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D1}\u200D\u{1F91D}\u200D\u{1F9D1}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FB}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FC}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FD}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FE}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FB}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FC}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FD}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FE}')); -assertTrue(re.test('\u{1F9D1}\u{1F3FF}\u200D\u{1F91D}\u200D\u{1F9D1}\u{1F3FF}')); -assertTrue(re.test('\u{1F468}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9BD}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u2695\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u2696\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u2708\uFE0F')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F33E}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F373}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F393}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F3A4}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F3A8}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F3EB}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F3ED}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F4BB}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F4BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F527}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F52C}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F680}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F692}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9AF}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9BC}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9BD}')); -assertTrue(re.test('\u26F9\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u26F9\uFE0F\u200D\u2640\uFE0F')); -assertTrue(re.test('\u26F9\uFE0F\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C3}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3C4}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CA}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CB}\uFE0F\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CB}\uFE0F\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F3CC}\uFE0F\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F3CC}\uFE0F\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46E}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F46F}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F46F}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F471}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F473}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F477}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F481}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F482}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F482}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u2764\uFE0F\u200D\u{1F48B}\u200D\u{1F468}')); -assertTrue(re.test('\u{1F482}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F482}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F486}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F487}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F575}\uFE0F\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F575}\uFE0F\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F645}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F646}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F647}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64B}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64D}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F64E}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6A3}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B4}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B5}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F6B6}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F926}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F937}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F938}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F939}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93C}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93C}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93D}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F93E}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B8}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9B9}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CD}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CE}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9CF}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D6}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D7}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D8}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9D9}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DA}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DB}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DC}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FB}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FB}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FC}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FC}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FD}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FD}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DD}\u{1F3FF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DE}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DE}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F9DF}\u200D\u2640\uFE0F')); -assertTrue(re.test('\u{1F9DF}\u200D\u2642\uFE0F')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u{1F3FB}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u{1F3FC}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u{1F3FD}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u{1F3FE}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F468}\u{1F3FF}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u{1F3FB}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u{1F3FC}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u{1F3FD}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u{1F3FE}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9B0}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9B1}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9B2}')); -assertTrue(re.test('\u{1F469}\u{1F3FF}\u200D\u{1F9B3}')); -assertTrue(re.test('\u{1F3F3}\uFE0F\u200D\u{1F308}')); -assertTrue(re.test('\u{1F3F4}\u200D\u2620\uFE0F')); -assertTrue(re.test('\u{1F415}\u200D\u{1F9BA}')); -assertTrue(re.test('\u{1F482}\u{1F3FB}\u200D\u2640\uFE0F')); diff --git a/deps/v8/test/mjsunit/harmony/regexp-property-sequence.js b/deps/v8/test/mjsunit/harmony/regexp-property-sequence.js deleted file mode 100644 index 4d43298016..0000000000 --- a/deps/v8/test/mjsunit/harmony/regexp-property-sequence.js +++ /dev/null @@ -1,88 +0,0 @@ -// Copyright 2018 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -// Flags: --harmony-regexp-sequence - -// Normal usage. -assertDoesNotThrow("/\\p{Emoji_Flag_Sequence}/u"); -assertTrue(/\p{Emoji_Flag_Sequence}/u.test("\u{1F1E9}\u{1F1EA}")); - -assertDoesNotThrow("/\\p{Emoji_Keycap_Sequence}/u"); -assertTrue(/\p{Emoji_Keycap_Sequence}/u.test("\u0023\uFE0F\u20E3")); - -assertDoesNotThrow("/\\p{Emoji_Keycap_Sequence}/u"); -assertFalse(/\p{Emoji_Keycap_Sequence}/u.test("\u0022\uFE0F\u20E3")); - -assertDoesNotThrow("/\\p{Emoji_Modifier_Sequence}/u"); -assertTrue(/\p{Emoji_Modifier_Sequence}/u.test("\u26F9\u{1F3FF}")); - -assertDoesNotThrow("/\\p{Emoji_ZWJ_Sequence}/u"); -assertTrue(/\p{Emoji_ZWJ_Sequence}/u.test("\u{1F468}\u{200D}\u{1F467}")); - -// Without unicode flag. -assertDoesNotThrow("/\\p{Emoji_Flag_Sequence}/"); -assertFalse(/\p{Emoji_Flag_Sequence}/.test("\u{1F1E9}\u{1F1EA}")); -assertTrue(/\p{Emoji_Flag_Sequence}/.test("\\p{Emoji_Flag_Sequence}")); - -// Negated and/or inside a character class. -assertThrows("/\\P{Emoji_Flag_Sequence}/u"); -assertThrows("/\\P{Emoji_Keycap_Sequence}/u"); -assertThrows("/\\P{Emoji_Modifier_Sequence}/u"); -assertThrows("/\\P{Emoji_Tag_Sequence}/u"); -assertThrows("/\\P{Emoji_ZWJ_Sequence}/u"); - -assertThrows("/[\\p{Emoji_Flag_Sequence}]/u"); -assertThrows("/[\\p{Emoji_Keycap_Sequence}]/u"); -assertThrows("/[\\p{Emoji_Modifier_Sequence}]/u"); -assertThrows("/[\\p{Emoji_Tag_Sequence}]/u"); -assertThrows("/[\\p{Emoji_ZWJ_Sequence}]/u"); - -assertThrows("/[\\P{Emoji_Flag_Sequence}]/u"); -assertThrows("/[\\P{Emoji_Keycap_Sequence}]/u"); -assertThrows("/[\\P{Emoji_Modifier_Sequence}]/u"); -assertThrows("/[\\P{Emoji_Tag_Sequence}]/u"); -assertThrows("/[\\P{Emoji_ZWJ_Sequence}]/u"); - -assertThrows("/[\\w\\p{Emoji_Flag_Sequence}]/u"); -assertThrows("/[\\w\\p{Emoji_Keycap_Sequence}]/u"); -assertThrows("/[\\w\\p{Emoji_Modifier_Sequence}]/u"); -assertThrows("/[\\w\\p{Emoji_Tag_Sequence}]/u"); -assertThrows("/[\\w\\p{Emoji_ZWJ_Sequence}]/u"); - -assertThrows("/[\\w\\P{Emoji_Flag_Sequence}]/u"); -assertThrows("/[\\w\\P{Emoji_Keycap_Sequence}]/u"); -assertThrows("/[\\w\\P{Emoji_Modifier_Sequence}]/u"); -assertThrows("/[\\w\\P{Emoji_Tag_Sequence}]/u"); -assertThrows("/[\\w\\P{Emoji_ZWJ_Sequence}]/u"); - -// Two regional indicators, but not a country. -assertFalse(/\p{Emoji_Flag_Sequence}/u.test("\u{1F1E6}\u{1F1E6}")); - -// ZWJ sequence as in two ZWJ elements joined by a ZWJ, but not in the list. -assertFalse(/\p{Emoji_ZWJ_Sequence}/u.test("\u{1F467}\u{200D}\u{1F468}")); - -// More complex regexp -assertEquals( - ["country flag: \u{1F1E6}\u{1F1F9}"], - /Country Flag: \p{Emoji_Flag_Sequence}/iu.exec( - "this is an example of a country flag: \u{1F1E6}\u{1F1F9} is Austria")); -assertEquals( - ["country flag: \u{1F1E6}\u{1F1F9}", "\u{1F1E6}\u{1F1F9}"], - /Country Flag: (\p{Emoji_Flag_Sequence})/iu.exec( - "this is an example of a country flag: \u{1F1E6}\u{1F1F9} is Austria")); -assertEquals( - ["country flag: \u{1F1E6}\u{1F1F9}"], - /Country Flag: ..(?<=\p{Emoji_Flag_Sequence})/iu.exec( - "this is an example of a country flag: \u{1F1E6}\u{1F1F9} is Austria")); -assertEquals( - ["flag: \u{1F1E6}\u{1F1F9}", "\u{1F1E6}\u{1F1F9}"], - /Flag: ..(?<=(\p{Emoji_Flag_Sequence})|\p{Emoji_Keycap_Sequence})/iu.exec( - "this is an example of a country flag: \u{1F1E6}\u{1F1F9} is Austria")); - -// Partial sequences. -assertFalse(/\p{Emoji_Flag_Sequence}/u.test("\u{1F1E6}_")); -assertFalse(/\p{Emoji_Keycap_Sequence}/u.test("2\uFE0F_")); -assertFalse(/\p{Emoji_Modifier_Sequence}/u.test("\u261D_")); -assertFalse(/\p{Emoji_Tag_Sequence}/u.test("\u{1F3F4}\u{E0067}\u{E0062}\u{E0065}\u{E006E}\u{E0067}_")); -assertFalse(/\p{Emoji_ZWJ_Sequence}/u.test("\u{1F468}\u200D\u2764\uFE0F\u200D_")); diff --git a/deps/v8/test/mjsunit/ic-migrated-map-add-when-monomorphic.js b/deps/v8/test/mjsunit/ic-migrated-map-add-when-monomorphic.js index ecc2a239f1..3816d37592 100644 --- a/deps/v8/test/mjsunit/ic-migrated-map-add-when-monomorphic.js +++ b/deps/v8/test/mjsunit/ic-migrated-map-add-when-monomorphic.js @@ -13,7 +13,8 @@ function load(o) { return o.x } %PrepareFunctionForOptimization(load); // Initialize the load IC with a map that will not be deprecated. -load(new A()); +var a = new A(); +load(a); const oldB = new B(); (new B()).x = 1.5; // deprecates map diff --git a/deps/v8/test/mjsunit/json.js b/deps/v8/test/mjsunit/json.js index f6e4c20da2..37d427aa83 100644 --- a/deps/v8/test/mjsunit/json.js +++ b/deps/v8/test/mjsunit/json.js @@ -523,3 +523,8 @@ assertEquals('{"":"inf"}', JSON.stringify({"":Infinity}, reviver)); assertEquals([10.4, "\u1234"], JSON.parse("[10.4, \"\u1234\"]")); assertEquals(10, JSON.parse('{"10":10}')["10"]); + +assertEquals(`[ + 1, + 2 +]`, JSON.stringify([1,2], undefined, 1000000000000000)); diff --git a/deps/v8/test/mjsunit/mjsunit.status b/deps/v8/test/mjsunit/mjsunit.status index 0a19067cc6..5a9f713142 100644 --- a/deps/v8/test/mjsunit/mjsunit.status +++ b/deps/v8/test/mjsunit/mjsunit.status @@ -77,7 +77,7 @@ # Enable once serializing a running isolate is fully implemented. 'serialize-deserialize-now': [SKIP], - # BUG(v8:9506): times out. + # BUG(v8:9506): slow tests. 'wasm/shared-memory-worker-explicit-gc-stress': [PASS, SLOW], 'wasm/shared-memory-worker-gc-stress': [PASS, SLOW], @@ -211,11 +211,6 @@ 'regress/regress-crbug-941743': [PASS, HEAVY], 'regress/regress-crbug-1191886': [PASS, HEAVY], 'wasm/externref-globals': [PASS, HEAVY], - - # BUG(v8:12173). - 'compiler/call-with-arraylike-or-spread-7': [PASS, FAIL], - 'ic-migrated-map-add-when-monomorphic': [PASS, FAIL], - 'es6/map-constructor-entry-side-effect2': [PASS, FAIL] }], # ALWAYS ############################################################################## @@ -848,7 +843,6 @@ 'regress/regress-490': [SKIP], 'regress/regress-create-exception': [SKIP], 'regress/regress-3247124': [SKIP], - 'compiler/regress-1226988': [SKIP], # Requires bigger stack size in the Genesis and if stack size is increased, # the test requires too much time to run. However, the problem test covers @@ -876,9 +870,6 @@ 'regress/regress-1138075': [SKIP], 'regress/regress-1138611': [SKIP], - # Some atomic functions are not yet implemented - 'regress/wasm/regress-1196837': [SKIP], - # SIMD not be implemented 'regress/wasm/regress-1054466': [SKIP], 'regress/wasm/regress-1065599': [SKIP], @@ -1284,17 +1275,17 @@ }], # arch != x64 or deopt_fuzzer ############################################################################## -# Liftoff is currently only sufficiently implemented on x64, ia32, arm64 and -# arm. -# TODO(clemensb): Implement on all other platforms (crbug.com/v8/6600). -['arch not in (x64, ia32, arm64, arm)', { +# Skip Liftoff tests on platforms that do not fully implement Liftoff. +['arch not in (x64, ia32, arm64, arm, s390x)', { 'wasm/liftoff': [SKIP], 'wasm/liftoff-debug': [SKIP], 'wasm/tier-up-testing-flag': [SKIP], 'wasm/tier-down-to-liftoff': [SKIP], 'wasm/wasm-dynamic-tiering': [SKIP], 'wasm/test-partial-serialization': [SKIP], -}], # arch not in (x64, ia32, arm64, arm) + 'regress/wasm/regress-1248024': [SKIP], + 'regress/wasm/regress-1251465': [SKIP], +}], # arch not in (x64, ia32, arm64, arm, s390x) ############################################################################## ['system != linux or virtual_memory_cage == True', { @@ -1438,6 +1429,7 @@ 'wasm/liftoff-simd-params': [SKIP], 'wasm/multi-value-simd': [SKIP], 'wasm/simd-*': [SKIP], + 'regress/wasm/regress-9447': [SKIP], 'regress/wasm/regress-10309': [SKIP], 'regress/wasm/regress-10831': [SKIP], 'regress/wasm/regress-1054466': [SKIP], @@ -1450,16 +1442,23 @@ 'regress/wasm/regress-1124885': [SKIP], 'regress/wasm/regress-1132461': [SKIP], 'regress/wasm/regress-1161555': [SKIP], + 'regress/wasm/regress-1161654': [SKIP], 'regress/wasm/regress-1161954': [SKIP], 'regress/wasm/regress-1165966': [SKIP], 'regress/wasm/regress-1187831': [SKIP], 'regress/wasm/regress-1199662': [SKIP], 'regress/wasm/regress-1231950': [SKIP], + 'regress/wasm/regress-1237024': [SKIP], 'regress/wasm/regress-1242300': [SKIP], 'regress/wasm/regress-1242689': [SKIP], }], # no_simd_hardware == True ############################################################################## +['no_simd_hardware == False', { + 'regress/wasm/regress-1254675': [SKIP], +}], # no_simd_hardware == False + +############################################################################## # TODO(v8:11421): Port baseline compiler to other architectures. ['arch not in (x64, arm64, ia32, arm, mips64el, mipsel, riscv64, loong64)', { 'baseline/*': [SKIP], @@ -1477,13 +1476,6 @@ 'regress/regress-779407': [SKIP], }], # variant == experimental_regexp -############################################################################## -['variant == instruction_scheduling or variant == stress_instruction_scheduling', { - # BUG(12018): These tests currently fail with --turbo-instruction-scheduling. - 'regress/wasm/regress-1231950': [SKIP], - 'regress/wasm/regress-1242300': [SKIP], -}], # variant == instruction_scheduling or variant == stress_instruction_scheduling - ################################################################################ ['single_generation', { # These tests rely on allocation site tracking which only works in the young generation. diff --git a/deps/v8/test/mjsunit/regress/asm/regress-1248677.js b/deps/v8/test/mjsunit/regress/asm/regress-1248677.js new file mode 100644 index 0000000000..f18f5068df --- /dev/null +++ b/deps/v8/test/mjsunit/regress/asm/regress-1248677.js @@ -0,0 +1,24 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +function setup_proxy() { + // Mess with the prototype to get funky conversion behavior. + Function.prototype.__proto__ = new Proxy(setup_proxy, { + get: async (target, key) => { + console.log(key); + } + }); +} + +setup_proxy(); + +function asm(global, imports) { + 'use asm'; + // Trigger proxy trap when looking up #toPrimitive: + var bar = +imports.bar; + function f() {} + return {f: f}; +} + +assertThrows(() => asm(undefined, {bar: setup_proxy}), TypeError); diff --git a/deps/v8/test/mjsunit/regress/asm/regress-1252747.js b/deps/v8/test/mjsunit/regress/asm/regress-1252747.js new file mode 100644 index 0000000000..4a9497bfc4 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/asm/regress-1252747.js @@ -0,0 +1,27 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +function print_stack(unsigned) { + print('stack:'); + print((new Error()).stack); +} + +function asm(global, env) { + 'use asm'; + + var print_stack = env.print_stack; + + function main() { + var count = 0; + + while ((count | 0) < 10) { + print_stack(1); + count = count + 1 | 0; + } + } + + return main; +} + +asm({}, {'print_stack': print_stack})(); diff --git a/deps/v8/test/mjsunit/regress/regress-1016450.js b/deps/v8/test/mjsunit/regress/regress-1016450.js index a98f2744a5..9c722cfc0d 100644 --- a/deps/v8/test/mjsunit/regress/regress-1016450.js +++ b/deps/v8/test/mjsunit/regress/regress-1016450.js @@ -26,4 +26,6 @@ assertEquals(17n, f(2n)); assertEquals(16n, f(1n)); assertOptimized(f); assertEquals(15n, f(0)); -assertUnoptimized(f); +if (%Is64Bit()) { + assertUnoptimized(f); +} diff --git a/deps/v8/test/mjsunit/regress/regress-1073440.js b/deps/v8/test/mjsunit/regress/regress-1073440.js index 81c328e828..8d049af559 100644 --- a/deps/v8/test/mjsunit/regress/regress-1073440.js +++ b/deps/v8/test/mjsunit/regress/regress-1073440.js @@ -25,7 +25,9 @@ assertEquals(foo(1), 0); assertOptimized(foo); %PrepareFunctionForOptimization(foo); assertEquals(foo(2), 1); -assertUnoptimized(foo); +if (%Is64Bit()) { + assertUnoptimized(foo); +} // Check that we learned something and do not loop deoptimizations. %OptimizeFunctionOnNextCall(foo); assertEquals(foo(1), 0); diff --git a/deps/v8/test/mjsunit/regress/regress-12256.js b/deps/v8/test/mjsunit/regress/regress-12256.js deleted file mode 100644 index e6407c06ed..0000000000 --- a/deps/v8/test/mjsunit/regress/regress-12256.js +++ /dev/null @@ -1,54 +0,0 @@ -// Copyright 2021 the V8 project authors. All rights reserved. -// Use of this source code is governed by a BSD-style license that can be -// found in the LICENSE file. - -const dates = [{ year: '2021', month: '10', day: '22', hour: '10', minute: '12', second: '32' }, - { year: '2021', month: '8', day: '3', hour: '9', minute: '9', second: '6' }]; - -for (let date of dates) { - const { year, month, day, hour, minute, second } = date; - const s0 = `${year}-${month}-${day} ${hour}:${minute}:${second}Z`; - - // V8 reads at most kMaxSignificantDigits (9) to build the value of a numeral, - // so let's test up to 9 leading zeros. - - // For years - for (let i = 1; i < 10; i++) { - const s1 = `${'0'.repeat(i) + year}-${month}-${day} ${hour}:${minute}:${second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // For months - for (let i = 1; i < 10; i++) { - const s1 = `${year}-${'0'.repeat(i) + month}-${day} ${hour}:${minute}:${second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // For days - for (let i = 1; i < 10; i++) { - const s1 = `${year}-${month}-${'0'.repeat(i) + day} ${hour}:${minute}:${second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // For hours - for (let i = 1; i < 10; i++) { - const s1 = `${year}-${month}-${day} ${'0'.repeat(i) + hour}:${minute}:${second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // For minutes - for (let i = 1; i < 10; i++) { - const s1 = `${year}-${month}-${day} ${hour}:${'0'.repeat(i) + minute}:${second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // For seconds - for (let i = 1; i < 10; i++) { - const s1 = `${year}-${month}-${day} ${hour}:${minute}:${'0'.repeat(i) + second}Z`; - assertTrue(new Date(s0).getTime() == new Date(s1).getTime()); - } - - // With same input date string, - // Date() and Date.parse() should return the same date - assertTrue(new Date(s0).getTime() == Date.parse(s0)); -} diff --git a/deps/v8/test/mjsunit/regress/regress-1238033.js b/deps/v8/test/mjsunit/regress/regress-1238033.js new file mode 100644 index 0000000000..8d3e40f277 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1238033.js @@ -0,0 +1,6 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +RegExp.prototype[Symbol.match] = null; +'ab'.matchAll(/./); // Must not throw. diff --git a/deps/v8/test/mjsunit/regress/regress-1254191.js b/deps/v8/test/mjsunit/regress/regress-1254191.js new file mode 100644 index 0000000000..19a3062c86 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-1254191.js @@ -0,0 +1,18 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax --opt + +function f(a) { + let x = -1n; + if (!a) { + x = a; + } + x|0; +} + +%PrepareFunctionForOptimization(f); +f(false); +%OptimizeFunctionOnNextCall(f); +assertThrows(() => f(true), TypeError); diff --git a/deps/v8/test/mjsunit/regress/regress-353004.js b/deps/v8/test/mjsunit/regress/regress-353004.js index f5430c6df4..a40eaff136 100644 --- a/deps/v8/test/mjsunit/regress/regress-353004.js +++ b/deps/v8/test/mjsunit/regress/regress-353004.js @@ -36,23 +36,6 @@ assertThrows(() => assertTrue(convertedOffset); assertTrue(convertedLength); -var buffer3 = new ArrayBuffer(100 * 1024 * 1024); -var dataView1 = new DataView(buffer3, {valueOf : function() { - %ArrayBufferDetach(buffer3); - return 0; -}}); - -assertEquals(0, dataView1.byteLength); - -var buffer4 = new ArrayBuffer(100 * 1024); -assertThrows(function() { - var dataView2 = new DataView(buffer4, 0, {valueOf : function() { - %ArrayBufferDetach(buffer4); - return 100 * 1024 * 1024; - }}); -}, RangeError); - - var buffer5 = new ArrayBuffer(100 * 1024); assertThrows(function() { buffer5.slice({valueOf : function() { diff --git a/deps/v8/test/mjsunit/regress/regress-9441.js b/deps/v8/test/mjsunit/regress/regress-9441.js index d2fb17a239..f342ec790c 100644 --- a/deps/v8/test/mjsunit/regress/regress-9441.js +++ b/deps/v8/test/mjsunit/regress/regress-9441.js @@ -14,7 +14,9 @@ assertEquals(-1n, foo(1n, 2n)); assertEquals(1n, foo(2n, 1n)); assertOptimized(foo); assertThrows(() => foo(2n, undefined)); -assertUnoptimized(foo); +if (%Is64Bit()) { + assertUnoptimized(foo); +} %PrepareFunctionForOptimization(foo); %OptimizeFunctionOnNextCall(foo); assertEquals(-1n, foo(1n, 2n)); diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1248704.js b/deps/v8/test/mjsunit/regress/regress-crbug-1248704.js new file mode 100644 index 0000000000..06ef707871 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-crbug-1248704.js @@ -0,0 +1,12 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +let evil = { + valueOf: function () { + array.length = 1; + } +}; +let array = [1, 2, 3]; +let newArray = array.slice(evil); +assertEquals(3, newArray.length); diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1249941.js b/deps/v8/test/mjsunit/regress/regress-crbug-1249941.js new file mode 100644 index 0000000000..0f1e6b1e85 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-crbug-1249941.js @@ -0,0 +1,16 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax --always-opt + +(function() { + function foo() { + assertThrowsAsync(new Promise(() => { %DeoptimizeFunction(foo); throw new Error(); })); + } + %PrepareFunctionForOptimization(foo); + foo(); + foo(); + %OptimizeFunctionOnNextCall(foo); + foo(); +})(); diff --git a/deps/v8/test/mjsunit/regress/regress-crbug-1254704.js b/deps/v8/test/mjsunit/regress/regress-crbug-1254704.js new file mode 100644 index 0000000000..222ee5f3dd --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-crbug-1254704.js @@ -0,0 +1,5 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +assertEquals(/[\k(]\1/.exec("ab(\1cd"), ["(\1"]); diff --git a/deps/v8/test/mjsunit/regress/regress-v8-10602.js b/deps/v8/test/mjsunit/regress/regress-v8-10602.js new file mode 100644 index 0000000000..37c4db2725 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-v8-10602.js @@ -0,0 +1,5 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +assertThrows(String.raw`/[\k](?<a>)/.exec()`); diff --git a/deps/v8/test/mjsunit/regress/regress-v8-12194.js b/deps/v8/test/mjsunit/regress/regress-v8-12194.js new file mode 100644 index 0000000000..cf9c423416 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/regress-v8-12194.js @@ -0,0 +1,74 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --allow-natives-syntax --opt --no-always-opt --no-stress-opt +// Flags: --deopt-every-n-times=0 --no-force-slow-path + +(function TestSliceWithoutParams() { + let array = [0, 1, 2]; + + function f() { + let array2 = array.slice(); + array2[1] = array2[0]; + } + + %PrepareFunctionForOptimization(f); + f(); + %OptimizeFunctionOnNextCall(f); + f(); + + // Assert that the function was not deoptimized. + assertOptimized(f); +})(); + +(function TestSliceWithStartZero() { + let array = [0, 1, 2]; + + function f() { + let array2 = array.slice(0); + array2[1] = array2[0]; + } + + %PrepareFunctionForOptimization(f); + f(); + %OptimizeFunctionOnNextCall(f); + f(); + + // Assert that the function was not deoptimized. + assertOptimized(f); +})(); + +(function TestSliceWithStartNonZero() { + let array = [0, 1, 2]; + + function f() { + let array2 = array.slice(1); + array2[1] = array2[0]; + } + + %PrepareFunctionForOptimization(f); + f(); + %OptimizeFunctionOnNextCall(f); + f(); + + // Assert that the function was not deoptimized. + assertOptimized(f); +})(); + +(function TestSliceWithStartZeroEndNonUndefined() { + let array = [0, 1, 2]; + + function f() { + let array2 = array.slice(0, 1); + array2[1] = array2[0]; + } + + %PrepareFunctionForOptimization(f); + f(); + %OptimizeFunctionOnNextCall(f); + f(); + + // Assert that the function was not deoptimized. + assertOptimized(f); +})(); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1237024.js b/deps/v8/test/mjsunit/regress/wasm/regress-1237024.js index 04dd8018bf..8e5c8272b9 100644 --- a/deps/v8/test/mjsunit/regress/wasm/regress-1237024.js +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1237024.js @@ -14,7 +14,7 @@ builder.addFunction("main", kSig_i_i) .addBody([ kExprLocalGet, 0, kGCPrefix, kExprRttCanon, array_index, - kGCPrefix, kExprArrayNewDefault, array_index, + kGCPrefix, kExprArrayNewDefaultWithRtt, array_index, kGCPrefix, kExprArrayLen, array_index, ]) .exportFunc(); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1239116.js b/deps/v8/test/mjsunit/regress/wasm/regress-1239116.js new file mode 100644 index 0000000000..58c6fbe0ca --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1239116.js @@ -0,0 +1,19 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +load('test/mjsunit/wasm/wasm-module-builder.js'); + +const builder = new WasmModuleBuilder(); +builder.addMemory(1, 1, true); +builder.addFunction('main', kSig_i_v) + .addBody([ + kExprI32Const, 0, // i32.const + kExprI32LoadMem8S, 0, 0, // i32.load8_s + kExprI32LoadMem, 0, 0, // i32.load + ]) + .exportFunc(); +const instance = builder.instantiate(); +let mem = new Uint8Array(instance.exports.memory.buffer); +mem[0] = -1; +assertTraps(kTrapMemOutOfBounds, instance.exports.main); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1239116b.js b/deps/v8/test/mjsunit/regress/wasm/regress-1239116b.js new file mode 100644 index 0000000000..10ce395964 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1239116b.js @@ -0,0 +1,19 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +load('test/mjsunit/wasm/wasm-module-builder.js'); + +const builder = new WasmModuleBuilder(); +builder.addMemory(1, 1, true); +builder.addFunction('main', kSig_i_v) + .addBody([ + kExprI32Const, 0, // i32.const + kExprI32LoadMem16S, 0, 0, // i32.load16_s + kExprI32LoadMem, 0, 0, // i32.load + ]) + .exportFunc(); +const instance = builder.instantiate(); +let mem = new Uint16Array(instance.exports.memory.buffer); +mem[0] = -1; +assertTraps(kTrapMemOutOfBounds, instance.exports.main); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1248024.js b/deps/v8/test/mjsunit/regress/wasm/regress-1248024.js new file mode 100644 index 0000000000..d295a3974a --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1248024.js @@ -0,0 +1,20 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --liftoff-only --trace-wasm-memory + +d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); + +const builder = new WasmModuleBuilder(); +builder.addMemory(16, 17); +// Generate function 1 (out of 3). +builder.addFunction('load', kSig_i_v) + .addBody([ + // body: + kExprI32Const, 0, // i32.const + kExprI32LoadMem8U, 0, 5, // i32.load8_u + ]) + .exportFunc(); +const instance = builder.instantiate(); +instance.exports.load(); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1251465.js b/deps/v8/test/mjsunit/regress/wasm/regress-1251465.js new file mode 100644 index 0000000000..ae832bda83 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1251465.js @@ -0,0 +1,26 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --wasm-staging --experimental-wasm-gc --liftoff-only + +d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); + +const builder = new WasmModuleBuilder(); +builder.addMemory(16, 32, false, false); +builder.addType(makeSig([], [kWasmI32])); +builder.addTable(kWasmFuncRef, 1, 1, undefined) +builder.addFunction(undefined, 0 /* sig */) + .addBodyWithEnd([ +kExprI32Const, 0x00, +kExprI32Const, 0x00, +kExprTableGet, 0x00, +kExprI32Const, 0xff, 0x01, +kNumericPrefix, kExprTableGrow, 0x00, +kExprF32Const, 0x00, 0x00, 0x00, 0x00, +kExprF32StoreMem, 0x00, 0x01, +kExprEnd +]); +builder.addExport('main', 0); +const instance = builder.instantiate(); +assertThrows(() => instance.exports.main(), WebAssembly.RuntimeError); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1254674.js b/deps/v8/test/mjsunit/regress/wasm/regress-1254674.js new file mode 100644 index 0000000000..f56e1fef6f --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1254674.js @@ -0,0 +1,11 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// Flags: --print-wasm-code + +d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); + +var builder = new WasmModuleBuilder(); +builder.addImport('Math', 'sqrt', kSig_d_d); +builder.instantiate({Math: Math}); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1254675.js b/deps/v8/test/mjsunit/regress/wasm/regress-1254675.js new file mode 100644 index 0000000000..9df8f17211 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1254675.js @@ -0,0 +1,30 @@ +// Copyright 2020 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +// This test should only be run on configurations that don't support Wasm SIMD. + +d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); + +// Test case manually reduced from https://crbug.com/1254675. +// This exercises a bug where we are missing checks for SIMD hardware support +// when a function has a v128 parameter but doesn't use any SIMD instructions. +(function() { + const builder = new WasmModuleBuilder(); + builder.addType(kSig_i_s); + builder.addFunction(undefined, 0) + .addBodyWithEnd([kExprUnreachable, kExprEnd]); + + assertThrows(() => builder.instantiate()); +}()); + +// Additional test case to verify that a declared v128 local traps. +(function() { + const builder = new WasmModuleBuilder(); + builder.addType(kSig_i_i); + builder.addFunction(undefined, 0) + .addBodyWithEnd([kExprUnreachable, kExprEnd]) + .addLocals('v128', 1); + + assertThrows(() => builder.instantiate()); +}()); diff --git a/deps/v8/test/mjsunit/regress/wasm/regress-1255354.js b/deps/v8/test/mjsunit/regress/wasm/regress-1255354.js new file mode 100644 index 0000000000..2a8d30e635 --- /dev/null +++ b/deps/v8/test/mjsunit/regress/wasm/regress-1255354.js @@ -0,0 +1,26 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. +// +// Flags: --no-liftoff +load("test/mjsunit/wasm/wasm-module-builder.js"); + +var builder = new WasmModuleBuilder(); + +builder.addMemory(1, 1, /* exported = */ false); + +builder.addFunction("main", kSig_i_i).addBody([ + kExprLocalGet, 0, + kExprIf, kWasmI32, + kExprLocalGet, 0, + kExprElse, + kExprI32Const, 42, // value + kExprI32Const, 0, // index + kExprI32StoreMem, 0, 0, + kExprI32Const, 11, + kExprLocalGet, 0, + kExprI32DivS, + kExprEnd + ]).exportFunc(); + +var instance = builder.instantiate({}); diff --git a/deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js b/deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js index 3e779af415..b24d097395 100644 --- a/deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js +++ b/deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js @@ -6,6 +6,8 @@ "use strict"; +d8.file.execute('test/mjsunit/typedarray-helpers.js'); + function CreateResizableArrayBuffer(byteLength, maxByteLength) { return new ArrayBuffer(byteLength, {maxByteLength: maxByteLength}); } @@ -52,11 +54,11 @@ function growHelper(ab, value) { assertEquals(0, rab.maxByteLength); })(); -const ctors = [[ArrayBuffer, (b) => b.resizable], - [SharedArrayBuffer, (b) => b.growable]]; +const arrayBufferCtors = [[ArrayBuffer, (b) => b.resizable], + [SharedArrayBuffer, (b) => b.growable]]; (function TestOptionsBagNotObject() { - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { const buffer = new ctor(10, 'this is not an options bag'); assertFalse(resizable(buffer)); } @@ -66,7 +68,7 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], let evil = {}; Object.defineProperty(evil, 'maxByteLength', {get: () => { throw new Error('thrown'); }}); - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { let caught = false; try { new ctor(10, evil); @@ -79,14 +81,14 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], })(); (function TestMaxByteLengthNonExisting() { - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { const buffer = new ctor(10, {}); assertFalse(resizable(buffer)); } })(); (function TestMaxByteLengthUndefinedOrNan() { - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { const buffer1 = new ctor(10, {maxByteLength: undefined}); assertFalse(resizable(buffer1)); const buffer2 = new ctor(0, {maxByteLength: NaN}); @@ -97,7 +99,7 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], })(); (function TestMaxByteLengthBooleanNullOrString() { - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { const buffer1 = new ctor(0, {maxByteLength: true}); assertTrue(resizable(buffer1)); assertEquals(0, buffer1.byteLength); @@ -118,7 +120,7 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], })(); (function TestMaxByteLengthDouble() { - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { const buffer1 = new ctor(0, {maxByteLength: -0.0}); assertTrue(resizable(buffer1)); assertEquals(0, buffer1.byteLength); @@ -138,7 +140,7 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], (function TestMaxByteLengthThrows() { const evil = {valueOf: () => { throw new Error('thrown');}}; - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { let caught = false; try { new ctor(0, {maxByteLength: evil}); @@ -153,7 +155,7 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], (function TestByteLengthThrows() { const evil1 = {valueOf: () => { throw new Error('byteLength throws');}}; const evil2 = {valueOf: () => { throw new Error('maxByteLength throws');}}; - for (let [ctor, resizable] of ctors) { + for (let [ctor, resizable] of arrayBufferCtors) { let caught = false; try { new ctor(evil1, {maxByteLength: evil2}); @@ -544,3 +546,73 @@ const ctors = [[ArrayBuffer, (b) => b.resizable], assertEquals('ok', w.getMessage()); assertEquals(15, gsab.byteLength); })(); + +(function Slice() { + const rab = CreateResizableArrayBuffer(10, 20); + const sliced1 = rab.slice(); + assertEquals(10, sliced1.byteLength); + assertTrue(sliced1 instanceof ArrayBuffer); + assertFalse(sliced1 instanceof SharedArrayBuffer); + assertFalse(sliced1.resizable); + + const gsab = CreateGrowableSharedArrayBuffer(10, 20); + const sliced2 = gsab.slice(); + assertEquals(10, sliced2.byteLength); + assertFalse(sliced2 instanceof ArrayBuffer); + assertTrue(sliced2 instanceof SharedArrayBuffer); + assertFalse(sliced2.growable); +})(); + +(function SliceSpeciesConstructorReturnsResizable() { + class MyArrayBuffer extends ArrayBuffer { + static get [Symbol.species]() { return MyResizableArrayBuffer; } + } + + class MyResizableArrayBuffer extends ArrayBuffer { + constructor(byteLength) { + super(byteLength, {maxByteLength: byteLength * 2}); + } + } + + const ab = new MyArrayBuffer(20); + const sliced1 = ab.slice(); + assertTrue(sliced1.resizable); + + class MySharedArrayBuffer extends SharedArrayBuffer { + static get [Symbol.species]() { return MyGrowableSharedArrayBuffer; } + } + + class MyGrowableSharedArrayBuffer extends SharedArrayBuffer { + constructor(byteLength) { + super(byteLength, {maxByteLength: byteLength * 2}); + } + } + + const sab = new MySharedArrayBuffer(20); + const sliced2 = sab.slice(); + assertTrue(sliced2.growable); +})(); + +(function SliceSpeciesConstructorResizes() { + let rab; + let resizeWhenConstructorCalled = false; + class MyArrayBuffer extends ArrayBuffer { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + rab.resize(2); + } + } + } + rab = new MyArrayBuffer(4, {maxByteLength: 8}); + const taWrite = new Uint8Array(rab); + for (let i = 0; i < 4; ++i) { + taWrite[i] = 1; + } + assertEquals([1, 1, 1, 1], ToNumbers(taWrite)); + resizeWhenConstructorCalled = true; + const sliced = rab.slice(); + assertEquals(2, rab.byteLength); + assertEquals(4, sliced.byteLength); + assertEquals([1, 1, 0, 0], ToNumbers(new Uint8Array(sliced))); +})(); diff --git a/deps/v8/test/mjsunit/tools/tickprocessor-test-large.log b/deps/v8/test/mjsunit/tools/tickprocessor-test-large.log index 6aa49159f9..5c966d1c32 100644 --- a/deps/v8/test/mjsunit/tools/tickprocessor-test-large.log +++ b/deps/v8/test/mjsunit/tools/tickprocessor-test-large.log @@ -171,7 +171,7 @@ code-creation,Builtin,2,5847,0x557426348760,1112,DeleteProperty code-creation,Builtin,2,5859,0x557426348bc0,1972,CopyDataProperties code-creation,Builtin,2,5871,0x557426349380,10024,SetDataProperties code-creation,Builtin,2,5883,0x55742634bac0,28,Abort -code-creation,Builtin,2,5895,0x55742634bae0,28,AbortCSAAssert +code-creation,Builtin,2,5895,0x55742634bae0,28,AbortCSADcheck code-creation,Builtin,2,5907,0x55742634bb00,12,EmptyFunction code-creation,Builtin,2,5922,0x55742634bb20,12,Illegal code-creation,Builtin,2,5934,0x55742634bb40,12,StrictPoisonPillThrower diff --git a/deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js b/deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js index fe18f4649c..0bf84a5a72 100644 --- a/deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js +++ b/deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js @@ -3,6 +3,7 @@ // found in the LICENSE file. // Flags: --harmony-rab-gsab --allow-natives-syntax +// Flags: --harmony-relative-indexing-methods "use strict"; @@ -398,7 +399,7 @@ function CreateGrowableSharedArrayBuffer(byteLength, maxByteLength) { // We can use the same GSAB for all the TAs below, since we won't modify it // after writing the initial values. const gsab = CreateGrowableSharedArrayBuffer(buffer_byte_length, - 2 * buffer_byte_length); + 2 * buffer_byte_length); const byte_offset = offset * ctor.BYTES_PER_ELEMENT; // Write some data into the array. @@ -461,7 +462,12 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, let values = []; let grown = false; for (const value of ta) { - values.push(Number(value)); + if (value instanceof Array) { + // When iterating via entries(), the values will be arrays [key, value]. + values.push([value[0], Number(value[1])]); + } else { + values.push(Number(value)); + } if (!grown && values.length == grow_after) { gsab.grow(new_byte_length); grown = true; @@ -571,7 +577,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, (function Destructuring() { for (let ctor of ctors) { const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, - 8 * ctor.BYTES_PER_ELEMENT); + 8 * ctor.BYTES_PER_ELEMENT); const fixedLength = new ctor(gsab, 0, 4); const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); const lengthTracking = new ctor(gsab, 0); @@ -639,7 +645,7 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, (function TestFill() { for (let ctor of ctors) { const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, - 8 * ctor.BYTES_PER_ELEMENT); + 8 * ctor.BYTES_PER_ELEMENT); const fixedLength = new ctor(gsab, 0, 4); const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); const lengthTracking = new ctor(gsab, 0); @@ -687,3 +693,686 @@ function TestIterationAndGrow(ta, expected, gsab, grow_after, assertEquals([15, 19, 19, 20, 16, 16], ReadDataFromBuffer(gsab, ctor)); } })(); + +(function At() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(gsab, 0, 4); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(gsab, 0); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + let ta_write = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(ta_write, i, i); + } + + assertEquals(3, AtHelper(fixedLength, -1)); + assertEquals(3, AtHelper(lengthTracking, -1)); + assertEquals(3, AtHelper(fixedLengthWithOffset, -1)); + assertEquals(3, AtHelper(lengthTrackingWithOffset, -1)); + + // Grow. New memory is zeroed. + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + assertEquals(3, AtHelper(fixedLength, -1)); + assertEquals(0, AtHelper(lengthTracking, -1)); + assertEquals(3, AtHelper(fixedLengthWithOffset, -1)); + assertEquals(0, AtHelper(lengthTrackingWithOffset, -1)); + } +})(); + +(function Slice() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(gsab, 0, 4); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(gsab, 0); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + const fixedLengthSlice = fixedLength.slice(); + assertEquals([0, 1, 2, 3], ToNumbers(fixedLengthSlice)); + assertTrue(fixedLengthSlice.buffer instanceof ArrayBuffer); + assertFalse(fixedLengthSlice.buffer instanceof SharedArrayBuffer); + assertFalse(fixedLengthSlice.buffer.resizable); + + const fixedLengthWithOffsetSlice = fixedLengthWithOffset.slice(); + assertEquals([2, 3], ToNumbers(fixedLengthWithOffsetSlice)); + assertTrue(fixedLengthWithOffsetSlice.buffer instanceof ArrayBuffer); + assertFalse(fixedLengthWithOffsetSlice.buffer instanceof SharedArrayBuffer); + assertFalse(fixedLengthWithOffsetSlice.buffer.resizable); + + const lengthTrackingSlice = lengthTracking.slice(); + assertEquals([0, 1, 2, 3], ToNumbers(lengthTrackingSlice)); + assertTrue(lengthTrackingSlice.buffer instanceof ArrayBuffer); + assertFalse(lengthTrackingSlice.buffer instanceof SharedArrayBuffer); + assertFalse(lengthTrackingSlice.buffer.resizable); + + const lengthTrackingWithOffsetSlice = lengthTrackingWithOffset.slice(); + assertEquals([2, 3], ToNumbers(lengthTrackingWithOffsetSlice)); + assertTrue(lengthTrackingWithOffsetSlice.buffer instanceof ArrayBuffer); + assertFalse(lengthTrackingWithOffsetSlice.buffer instanceof + SharedArrayBuffer); + assertFalse(lengthTrackingWithOffsetSlice.buffer.resizable); + + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + assertEquals([0, 1, 2, 3], ToNumbers(fixedLength.slice())); + assertEquals([2, 3], ToNumbers(fixedLengthWithOffset.slice())); + assertEquals([0, 1, 2, 3, 0, 0], ToNumbers(lengthTracking.slice())); + assertEquals([2, 3, 0, 0], ToNumbers(lengthTrackingWithOffset.slice())); + + // Verify that the previously created slices aren't affected by the growing. + assertEquals([0, 1, 2, 3], ToNumbers(fixedLengthSlice)); + assertEquals([2, 3], ToNumbers(fixedLengthWithOffsetSlice)); + assertEquals([0, 1, 2, 3], ToNumbers(lengthTrackingSlice)); + assertEquals([2, 3], ToNumbers(lengthTrackingWithOffsetSlice)); + } +})(); + +(function SliceSpeciesCreateResizes() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 1); + } + + let resizeWhenConstructorCalled = false; + class MyArray extends ctor { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + } + } + }; + + const fixedLength = new MyArray(gsab, 0, 4); + resizeWhenConstructorCalled = true; + const a = fixedLength.slice(); + assertEquals(4, a.length); + assertEquals([1, 1, 1, 1], ToNumbers(a)); + + assertEquals(6 * ctor.BYTES_PER_ELEMENT, gsab.byteLength); + } + + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 1); + } + + let resizeWhenConstructorCalled = false; + class MyArray extends ctor { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + } + } + }; + + const lengthTracking = new MyArray(gsab); + resizeWhenConstructorCalled = true; + const a = lengthTracking.slice(); + assertEquals(6 * ctor.BYTES_PER_ELEMENT, gsab.byteLength); + // The length of the resulting TypedArray is determined before + // TypedArraySpeciesCreate is called, and it doesn't change. + assertEquals(4, a.length); + assertEquals([1, 1, 1, 1], ToNumbers(a)); + } +})(); + +(function CopyWithin() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(gsab, 0, 4); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(gsab, 0); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // Orig. array: [0, 1, 2, 3] + // [0, 1, 2, 3] << fixedLength + // [2, 3] << fixedLengthWithOffset + // [0, 1, 2, 3, ...] << lengthTracking + // [2, 3, ...] << lengthTrackingWithOffset + + fixedLength.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(fixedLength)); + + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + fixedLengthWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(fixedLengthWithOffset)); + + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + lengthTracking.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(lengthTracking)); + + lengthTrackingWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(lengthTrackingWithOffset)); + + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // Orig. array: [0, 1, 2, 3, 4, 5] + // [0, 1, 2, 3] << fixedLength + // [2, 3] << fixedLengthWithOffset + // [0, 1, 2, 3, 4, 5, ...] << lengthTracking + // [2, 3, 4, 5, ...] << lengthTrackingWithOffset + + fixedLength.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(fixedLength)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + fixedLengthWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(fixedLengthWithOffset)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // [0, 1, 2, 3, 4, 5, ...] << lengthTracking + // target ^ ^ start + lengthTracking.copyWithin(0, 2); + assertEquals([2, 3, 4, 5, 4, 5], ToNumbers(lengthTracking)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // [2, 3, 4, 5, ...] << lengthTrackingWithOffset + // target ^ ^ start + lengthTrackingWithOffset.copyWithin(0, 1); + assertEquals([3, 4, 5, 5], ToNumbers(lengthTrackingWithOffset)); + } +})(); + +(function CopyWithinParameterConversionGrows() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const lengthTracking = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(lengthTracking, i, i); + } + + const evil = { valueOf: () => { gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + WriteToTypedArray(lengthTracking, 4, 4); + WriteToTypedArray(lengthTracking, 5, 5); + return 0;} }; + // Orig. array: [0, 1, 2, 3] [4, 5] + // ^ ^ ^ new elements + // target start + lengthTracking.copyWithin(evil, 2); + assertEquals([2, 3, 2, 3, 4, 5], ToNumbers(lengthTracking)); + } +})(); + +(function EntriesKeysValues() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(gsab, 0, 4); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(gsab, 0); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(fixedLength)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(fixedLength)); + assertEquals([0, 1, 2, 3], Keys(fixedLength)); + + assertEquals([4, 6], ToNumbersWithEntries(fixedLengthWithOffset)); + assertEquals([4, 6], ValuesToNumbers(fixedLengthWithOffset)); + assertEquals([0, 1], Keys(fixedLengthWithOffset)); + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(lengthTracking)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(lengthTracking)); + assertEquals([0, 1, 2, 3], Keys(lengthTracking)); + + assertEquals([4, 6], ToNumbersWithEntries(lengthTrackingWithOffset)); + assertEquals([4, 6], ValuesToNumbers(lengthTrackingWithOffset)); + assertEquals([0, 1], Keys(lengthTrackingWithOffset)); + + // Grow. + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6, 8, 10] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, 8, 10, ...] << lengthTracking + // [4, 6, 8, 10, ...] << lengthTrackingWithOffset + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(fixedLength)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(fixedLength)); + assertEquals([0, 1, 2, 3], Keys(fixedLength)); + + assertEquals([4, 6], ToNumbersWithEntries(fixedLengthWithOffset)); + assertEquals([4, 6], ValuesToNumbers(fixedLengthWithOffset)); + assertEquals([0, 1], Keys(fixedLengthWithOffset)); + + assertEquals([0, 2, 4, 6, 8, 10], ToNumbersWithEntries(lengthTracking)); + assertEquals([0, 2, 4, 6, 8, 10], ValuesToNumbers(lengthTracking)); + assertEquals([0, 1, 2, 3, 4, 5], Keys(lengthTracking)); + + assertEquals([4, 6, 8, 10], ToNumbersWithEntries(lengthTrackingWithOffset)); + assertEquals([4, 6, 8, 10], ValuesToNumbers(lengthTrackingWithOffset)); + assertEquals([0, 1, 2, 3], Keys(lengthTrackingWithOffset)); + } +})(); + +(function EntriesKeysValuesGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateGsabForTest(ctor) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return gsab; + } + + // Iterating with entries() (the 4 loops below). + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLength = new ctor(gsab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLength.entries(), + [[0, 0], [1, 2], [2, 4], [3, 6]], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLengthWithOffset.entries(), + [[0, 4], [1, 6]], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTracking = new ctor(gsab, 0); + + TestIterationAndGrow(lengthTracking.entries(), + [[0, 0], [1, 2], [2, 4], [3, 6], [4, 0], [5, 0]], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndGrow(lengthTrackingWithOffset.entries(), + [[0, 4], [1, 6], [2, 0], [3, 0]], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with keys() (the 4 loops below). + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLength = new ctor(gsab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLength.keys(), + [0, 1, 2, 3], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLengthWithOffset.keys(), + [0, 1], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTracking = new ctor(gsab, 0); + + TestIterationAndGrow(lengthTracking.keys(), + [0, 1, 2, 3, 4, 5], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndGrow(lengthTrackingWithOffset.keys(), + [0, 1, 2, 3], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with values() (the 4 loops below). + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLength = new ctor(gsab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLength.values(), + [0, 2, 4, 6], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndGrow(fixedLengthWithOffset.values(), + [4, 6], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTracking = new ctor(gsab, 0); + + TestIterationAndGrow(lengthTracking.values(), + [0, 2, 4, 6, 0, 0], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const gsab = CreateGsabForTest(ctor); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndGrow(lengthTrackingWithOffset.values(), + [4, 6, 0, 0], + gsab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } +})(); + +(function EverySome() { + for (let ctor of ctors) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(gsab, 0, 4); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(gsab, 0); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + + function div3(n) { + return Number(n) % 3 == 0; + } + + function even(n) { + return Number(n) % 2 == 0; + } + + function over10(n) { + return Number(n) > 10; + } + + assertFalse(fixedLength.every(div3)); + assertTrue(fixedLength.every(even)); + assertTrue(fixedLength.some(div3)); + assertFalse(fixedLength.some(over10)); + + assertFalse(fixedLengthWithOffset.every(div3)); + assertTrue(fixedLengthWithOffset.every(even)); + assertTrue(fixedLengthWithOffset.some(div3)); + assertFalse(fixedLengthWithOffset.some(over10)); + + assertFalse(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertFalse(lengthTrackingWithOffset.every(div3)); + assertTrue(lengthTrackingWithOffset.every(even)); + assertTrue(lengthTrackingWithOffset.some(div3)); + assertFalse(lengthTrackingWithOffset.some(over10)); + + // Grow. + gsab.grow(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6, 8, 10] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, 8, 10, ...] << lengthTracking + // [4, 6, 8, 10, ...] << lengthTrackingWithOffset + + assertFalse(fixedLength.every(div3)); + assertTrue(fixedLength.every(even)); + assertTrue(fixedLength.some(div3)); + assertFalse(fixedLength.some(over10)); + + assertFalse(fixedLengthWithOffset.every(div3)); + assertTrue(fixedLengthWithOffset.every(even)); + assertTrue(fixedLengthWithOffset.some(div3)); + assertFalse(fixedLengthWithOffset.some(over10)); + + assertFalse(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertFalse(lengthTrackingWithOffset.every(div3)); + assertTrue(lengthTrackingWithOffset.every(even)); + assertTrue(lengthTrackingWithOffset.some(div3)); + assertFalse(lengthTrackingWithOffset.some(over10)); + } +})(); + +(function EveryGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateGsabForTest(ctor) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return gsab; + } + + let values; + let gsab; + let growAfter; + let growTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == growAfter) { + gsab.grow(growTo); + } + return true; + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const fixedLength = new ctor(gsab, 0, 4); + values = []; + growAfter = 2; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLength.every(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + growAfter = 1; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLengthWithOffset.every(myFunc)); + assertEquals([4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const lengthTracking = new ctor(gsab, 0); + values = []; + growAfter = 2; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTracking.every(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + growAfter = 1; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTrackingWithOffset.every(myFunc)); + assertEquals([4, 6], values); + } +})(); + +(function SomeGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateGsabForTest(ctor) { + const gsab = CreateGrowableSharedArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(gsab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return gsab; + } + + let values; + let gsab; + let growAfter; + let growTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == growAfter) { + gsab.grow(growTo); + } + return false; + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const fixedLength = new ctor(gsab, 0, 4); + values = []; + growAfter = 2; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLength.some(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const fixedLengthWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + gsab = gsab; + growAfter = 1; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLengthWithOffset.some(myFunc)); + assertEquals([4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const lengthTracking = new ctor(gsab, 0); + values = []; + growAfter = 2; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTracking.some(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + gsab = CreateGsabForTest(ctor); + const lengthTrackingWithOffset = new ctor(gsab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + growAfter = 1; + growTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTrackingWithOffset.some(myFunc)); + assertEquals([4, 6], values); + } +})(); diff --git a/deps/v8/test/mjsunit/typedarray-helpers.js b/deps/v8/test/mjsunit/typedarray-helpers.js index e4996456c6..4482d548ba 100644 --- a/deps/v8/test/mjsunit/typedarray-helpers.js +++ b/deps/v8/test/mjsunit/typedarray-helpers.js @@ -20,6 +20,10 @@ const ctors = [ MyBigInt64Array, ]; +function CreateResizableArrayBuffer(byteLength, maxByteLength) { + return new ArrayBuffer(byteLength, {maxByteLength: maxByteLength}); +} + function ReadDataFromBuffer(ab, ctor) { let result = []; const ta = new ctor(ab, 0, ab.byteLength / ctor.BYTES_PER_ELEMENT); @@ -46,10 +50,45 @@ function ToNumbers(array) { return result; } -function FillHelper(ta, n, start, end) { - if (ta instanceof BigInt64Array || ta instanceof BigUint64Array) { - ta.fill(BigInt(n), start, end); +function ToNumbersWithEntries(array) { + let result = []; + let expectedKey = 0; + for (let [key, value] of array.entries()) { + assertEquals(expectedKey, key); + ++expectedKey; + result.push(Number(value)); + } + return result; +} + +function Keys(array) { + let result = []; + for (let key of array.keys()) { + result.push(key); + } + return result; +} + +function ValuesToNumbers(array) { + let result = []; + for (let value of array.values()) { + result.push(Number(value)); + } + return result; +} + +function AtHelper(array, index) { + let result = array.at(index); + if (typeof result == 'bigint') { + return Number(result); + } + return result; +} + +function FillHelper(array, n, start, end) { + if (array instanceof BigInt64Array || array instanceof BigUint64Array) { + array.fill(BigInt(n), start, end); } else { - ta.fill(n, start, end); + array.fill(n, start, end); } } diff --git a/deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js b/deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js index 69ad91e693..f68cad1111 100644 --- a/deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js +++ b/deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js @@ -6,25 +6,7 @@ "use strict"; -class MyUint8Array extends Uint8Array {}; - -const ctors = [ - Uint8Array, - Int8Array, - Uint16Array, - Int16Array, - Int32Array, - Float32Array, - Float64Array, - Uint8ClampedArray, - BigUint64Array, - BigInt64Array, - MyUint8Array -]; - -function CreateResizableArrayBuffer(byteLength, maxByteLength) { - return new ArrayBuffer(byteLength, {maxByteLength: maxByteLength}); -} +d8.file.execute('test/mjsunit/typedarray-helpers.js'); (function ConstructorThrowsIfBufferDetached() { const rab = CreateResizableArrayBuffer(40, 80); @@ -140,3 +122,169 @@ function CreateResizableArrayBuffer(byteLength, maxByteLength) { assertEquals(undefined, i8a[2]); } })(); + +(function FillParameterConversionDetaches() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + + let evil = { valueOf: () => { %ArrayBufferDetach(rab); return 1;}}; + // The length is read after converting the first parameter ('value'), so the + // detaching parameter has to be the 2nd ('start') or 3rd ('end'). + assertThrows(function() { + FillHelper(fixedLength, 1, 0, evil); + }, TypeError); + } +})(); + +(function CopyWithinParameterConversionDetaches() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + + let evil = { valueOf: () => { %ArrayBufferDetach(rab); return 2;}}; + assertThrows(function() { + fixedLength.copyWithin(evil, 0, 1); + }, TypeError); + } +})(); + +(function EveryDetachMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values = []; + let rab; + let detachAfter; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == detachAfter) { + %ArrayBufferDetach(rab); + } + return true; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + detachAfter = 2; + assertTrue(fixedLength.every(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + detachAfter = 1; + assertTrue(fixedLengthWithOffset.every(myFunc)); + assertEquals([4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + detachAfter = 2; + assertTrue(lengthTracking.every(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + detachAfter = 1; + assertTrue(lengthTrackingWithOffset.every(myFunc)); + assertEquals([4, undefined], values); + } +})(); + +(function SomeDetachMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values; + let rab; + let detachAfter; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == detachAfter) { + %ArrayBufferDetach(rab); + } + return false; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + detachAfter = 2; + assertFalse(fixedLength.some(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + detachAfter = 1; + assertFalse(fixedLengthWithOffset.some(myFunc)); + assertEquals([4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + detachAfter = 2; + assertFalse(lengthTracking.some(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + detachAfter = 1; + assertFalse(lengthTrackingWithOffset.some(myFunc)); + assertEquals([4, undefined], values); + } +})(); diff --git a/deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js b/deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js index 9934683b23..8aea26c7b3 100644 --- a/deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js +++ b/deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js @@ -3,15 +3,12 @@ // found in the LICENSE file. // Flags: --harmony-rab-gsab --allow-natives-syntax +// Flags: --harmony-relative-indexing-methods "use strict"; d8.file.execute('test/mjsunit/typedarray-helpers.js'); -function CreateResizableArrayBuffer(byteLength, maxByteLength) { - return new ArrayBuffer(byteLength, {maxByteLength: maxByteLength}); -} - (function TypedArrayPrototype() { const rab = CreateResizableArrayBuffer(40, 80); const ab = new ArrayBuffer(80); @@ -747,7 +744,12 @@ function TestIterationAndResize(ta, expected, rab, resize_after, let values = []; let resized = false; for (const value of ta) { - values.push(Number(value)); + if (value instanceof Array) { + // When iterating via entries(), the values will be arrays [key, value]. + values.push([value[0], Number(value[1])]); + } else { + values.push(Number(value)); + } if (!resized && values.length == resize_after) { rab.resize(new_byte_length); resized = true; @@ -1156,3 +1158,1263 @@ function TestIterationAndResize(ta, expected, rab, resize_after, assertThrows(() => { FillHelper(fixedLength, 3, 1, evil); }, TypeError); } })(); + +(function At() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(rab, 0); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + let ta_write = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(ta_write, i, i); + } + + assertEquals(3, AtHelper(fixedLength, -1)); + assertEquals(3, AtHelper(lengthTracking, -1)); + assertEquals(3, AtHelper(fixedLengthWithOffset, -1)); + assertEquals(3, AtHelper(lengthTrackingWithOffset, -1)); + + // Shrink so that fixed length TAs go out of bounds. + rab.resize(3 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { AtHelper(fixedLength, -1); }); + assertThrows(() => { AtHelper(fixedLengthWithOffset, -1); }); + + assertEquals(2, AtHelper(lengthTracking, -1)); + assertEquals(2, AtHelper(lengthTrackingWithOffset, -1)); + + // Shrink so that the TAs with offset go out of bounds. + rab.resize(1 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { AtHelper(fixedLength, -1); }); + assertThrows(() => { AtHelper(fixedLengthWithOffset, -1); }); + assertEquals(0, AtHelper(lengthTracking, -1)); + assertThrows(() => { AtHelper(lengthTrackingWithOffset, -1); }); + + // Grow so that all TAs are back in-bounds. New memory is zeroed. + rab.resize(6 * ctor.BYTES_PER_ELEMENT); + assertEquals(0, AtHelper(fixedLength, -1)); + assertEquals(0, AtHelper(lengthTracking, -1)); + assertEquals(0, AtHelper(fixedLengthWithOffset, -1)); + assertEquals(0, AtHelper(lengthTrackingWithOffset, -1)); + } +})(); + +(function AtParameterConversionResizes() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + + let evil = { valueOf: () => { rab.resize(2); return 0;}}; + assertEquals(undefined, AtHelper(fixedLength, evil)); + } + + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const lengthTracking = new ctor(rab); + + let evil = { valueOf: () => { rab.resize(2); return -1;}}; + // The TypedArray is *not* out of bounds since it's length-tracking. + assertEquals(undefined, AtHelper(lengthTracking, evil)); + } +})(); + +(function Slice() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(rab, 0); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + const fixedLengthSlice = fixedLength.slice(); + assertEquals([0, 1, 2, 3], ToNumbers(fixedLengthSlice)); + assertFalse(fixedLengthSlice.buffer.resizable); + + const fixedLengthWithOffsetSlice = fixedLengthWithOffset.slice(); + assertEquals([2, 3], ToNumbers(fixedLengthWithOffsetSlice)); + assertFalse(fixedLengthWithOffsetSlice.buffer.resizable); + + const lengthTrackingSlice = lengthTracking.slice(); + assertEquals([0, 1, 2, 3], ToNumbers(lengthTrackingSlice)); + assertFalse(lengthTrackingSlice.buffer.resizable); + + const lengthTrackingWithOffsetSlice = lengthTrackingWithOffset.slice(); + assertEquals([2, 3], ToNumbers(lengthTrackingWithOffsetSlice)); + assertFalse(lengthTrackingWithOffsetSlice.buffer.resizable); + + // Shrink so that fixed length TAs go out of bounds. + rab.resize(3 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { fixedLength.slice(); }); + assertThrows(() => { fixedLengthWithOffset.slice(); }); + assertEquals([0, 1, 2], ToNumbers(lengthTracking.slice())); + assertEquals([2], ToNumbers(lengthTrackingWithOffset.slice())); + + // Shrink so that the TAs with offset go out of bounds. + rab.resize(1 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { fixedLength.slice(); }); + assertThrows(() => { fixedLengthWithOffset.slice(); }); + assertEquals([0], ToNumbers(lengthTracking.slice())); + assertThrows(() => { lengthTrackingWithOffset.slice(); }); + + // Shrink to zero. + rab.resize(0); + + assertThrows(() => { fixedLength.slice(); }); + assertThrows(() => { fixedLengthWithOffset.slice(); }); + assertEquals([], ToNumbers(lengthTracking.slice())); + assertThrows(() => { lengthTrackingWithOffset.slice(); }); + + // Verify that the previously created slices aren't affected by the + // shrinking. + assertEquals([0, 1, 2, 3], ToNumbers(fixedLengthSlice)); + assertEquals([2, 3], ToNumbers(fixedLengthWithOffsetSlice)); + assertEquals([0, 1, 2, 3], ToNumbers(lengthTrackingSlice)); + assertEquals([2, 3], ToNumbers(lengthTrackingWithOffsetSlice)); + + // Grow so that all TAs are back in-bounds. New memory is zeroed. + rab.resize(6 * ctor.BYTES_PER_ELEMENT); + assertEquals([0, 0, 0, 0], ToNumbers(fixedLength.slice())); + assertEquals([0, 0], ToNumbers(fixedLengthWithOffset.slice())); + assertEquals([0, 0, 0, 0, 0, 0], ToNumbers(lengthTracking.slice())); + assertEquals([0, 0, 0, 0], ToNumbers(lengthTrackingWithOffset.slice())); + } +})(); + +(function SliceSpeciesCreateResizes() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + + let resizeWhenConstructorCalled = false; + class MyArray extends ctor { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + rab.resize(2 * ctor.BYTES_PER_ELEMENT); + } + } + }; + + const fixedLength = new MyArray(rab, 0, 4); + resizeWhenConstructorCalled = true; + assertThrows(() => { fixedLength.slice(); }, TypeError); + assertEquals(2 * ctor.BYTES_PER_ELEMENT, rab.byteLength); + } + + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 1); + } + + let resizeWhenConstructorCalled = false; + class MyArray extends ctor { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + rab.resize(2 * ctor.BYTES_PER_ELEMENT); + } + } + }; + + const lengthTracking = new MyArray(rab); + resizeWhenConstructorCalled = true; + const a = lengthTracking.slice(); + assertEquals(2 * ctor.BYTES_PER_ELEMENT, rab.byteLength); + // The length of the resulting TypedArray is determined before + // TypedArraySpeciesCreate is called, and it doesn't change. + assertEquals(4, a.length); + assertEquals([1, 1, 0, 0], ToNumbers(a)); + } + + // Test that the (start, end) parameters are computed based on the original + // length. + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 1); + } + + let resizeWhenConstructorCalled = false; + class MyArray extends ctor { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + rab.resize(2 * ctor.BYTES_PER_ELEMENT); + } + } + }; + + const lengthTracking = new MyArray(rab); + resizeWhenConstructorCalled = true; + const a = lengthTracking.slice(-3, -1); + assertEquals(2 * ctor.BYTES_PER_ELEMENT, rab.byteLength); + // The length of the resulting TypedArray is determined before + // TypedArraySpeciesCreate is called, and it doesn't change. + assertEquals(2, a.length); + assertEquals([1, 0], ToNumbers(a)); + } + + // Test where the buffer gets resized "between elements". + { + const rab = CreateResizableArrayBuffer(8, 16); + + // Fill the buffer with 1-bits. + const taWrite = new Uint8Array(rab); + for (let i = 0; i < 8; ++i) { + WriteToTypedArray(taWrite, i, 255); + } + + let resizeWhenConstructorCalled = false; + class MyArray extends Uint16Array { + constructor(...params) { + super(...params); + if (resizeWhenConstructorCalled) { + // Resize so that the size is not a multiple of the element size. + rab.resize(5); + } + } + }; + + const lengthTracking = new MyArray(rab); + assertEquals([65535, 65535, 65535, 65535], ToNumbers(lengthTracking)); + resizeWhenConstructorCalled = true; + const a = lengthTracking.slice(); + assertEquals(5, rab.byteLength); + assertEquals(4, a.length); // The old length is used. + assertEquals(65535, a[0]); + assertEquals(65535, a[1]); + assertEquals(0, a[2]); + assertEquals(0, a[3]); + } +})(); + +(function CopyWithin() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(rab, 0); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // Orig. array: [0, 1, 2, 3] + // [0, 1, 2, 3] << fixedLength + // [2, 3] << fixedLengthWithOffset + // [0, 1, 2, 3, ...] << lengthTracking + // [2, 3, ...] << lengthTrackingWithOffset + + fixedLength.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(fixedLength)); + + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + fixedLengthWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(fixedLengthWithOffset)); + + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + lengthTracking.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(lengthTracking)); + + lengthTrackingWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(lengthTrackingWithOffset)); + + // Shrink so that fixed length TAs go out of bounds. + rab.resize(3 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 3; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // Orig. array: [0, 1, 2] + // [0, 1, 2, ...] << lengthTracking + // [2, ...] << lengthTrackingWithOffset + + assertThrows(() => { fixedLength.copyWithin(0, 1); }); + assertThrows(() => { fixedLengthWithOffset.copyWithin(0, 1); }); + lengthTracking.copyWithin(0, 1); + assertEquals([1, 2, 2], ToNumbers(lengthTracking)); + lengthTrackingWithOffset.copyWithin(0, 1); + assertEquals([2], ToNumbers(lengthTrackingWithOffset)); + + // Shrink so that the TAs with offset go out of bounds. + rab.resize(1 * ctor.BYTES_PER_ELEMENT); + WriteToTypedArray(taWrite, 0, 0); + + assertThrows(() => { fixedLength.copyWithin(0, 1, 1); }); + assertThrows(() => { fixedLengthWithOffset.copyWithin(0, 1, 1); }); + lengthTracking.copyWithin(0, 0, 1); + assertEquals([0], ToNumbers(lengthTracking)); + assertThrows(() => { lengthTrackingWithOffset.copyWithin(0, 1, 1); }); + + // Shrink to zero. + rab.resize(0); + + assertThrows(() => { fixedLength.copyWithin(0, 1, 1); }); + assertThrows(() => { fixedLengthWithOffset.copyWithin(0, 1, 1); }); + lengthTracking.copyWithin(0, 0, 1); + assertEquals([], ToNumbers(lengthTracking)); + assertThrows(() => { lengthTrackingWithOffset.copyWithin(0, 1, 1); }); + + // Grow so that all TAs are back in-bounds. + rab.resize(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // Orig. array: [0, 1, 2, 3, 4, 5] + // [0, 1, 2, 3] << fixedLength + // [2, 3] << fixedLengthWithOffset + // [0, 1, 2, 3, 4, 5, ...] << lengthTracking + // [2, 3, 4, 5, ...] << lengthTrackingWithOffset + + fixedLength.copyWithin(0, 2); + assertEquals([2, 3, 2, 3], ToNumbers(fixedLength)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + fixedLengthWithOffset.copyWithin(0, 1); + assertEquals([3, 3], ToNumbers(fixedLengthWithOffset)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // [0, 1, 2, 3, 4, 5, ...] << lengthTracking + // target ^ ^ start + lengthTracking.copyWithin(0, 2); + assertEquals([2, 3, 4, 5, 4, 5], ToNumbers(lengthTracking)); + + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, i); + } + + // [2, 3, 4, 5, ...] << lengthTrackingWithOffset + // target ^ ^ start + lengthTrackingWithOffset.copyWithin(0, 1); + assertEquals([3, 4, 5, 5], ToNumbers(lengthTrackingWithOffset)); + } +})(); + +(function CopyWithinParameterConversionShrinks() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + + const evil = { valueOf: () => { rab.resize(2 * ctor.BYTES_PER_ELEMENT); + return 2;}}; + assertThrows(() => { fixedLength.copyWithin(evil, 0, 1); }, TypeError); + rab.resize(4 * ctor.BYTES_PER_ELEMENT); + assertThrows(() => { fixedLength.copyWithin(0, evil, 3); }, TypeError); + rab.resize(4 * ctor.BYTES_PER_ELEMENT); + assertThrows(() => { fixedLength.copyWithin(0, 1, evil); }, TypeError); + } +})(); + +(function CopyWithinParameterConversionGrows() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const lengthTracking = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(lengthTracking, i, i); + } + + const evil = { valueOf: () => { rab.resize(6 * ctor.BYTES_PER_ELEMENT); + WriteToTypedArray(lengthTracking, 4, 4); + WriteToTypedArray(lengthTracking, 5, 5); + return 0;} }; + // Orig. array: [0, 1, 2, 3] [4, 5] + // ^ ^ ^ new elements + // target start + lengthTracking.copyWithin(evil, 2); + assertEquals([2, 3, 2, 3, 4, 5], ToNumbers(lengthTracking)); + + rab.resize(4 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(lengthTracking, i, i); + } + + // Orig. array: [0, 1, 2, 3] [4, 5] + // ^ ^ ^ new elements + // start target + lengthTracking.copyWithin(2, evil); + assertEquals([0, 1, 0, 1, 4, 5], ToNumbers(lengthTracking)); + } +})(); + +(function EntriesKeysValues() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(rab, 0); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(fixedLength)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(fixedLength)); + assertEquals([0, 1, 2, 3], Keys(fixedLength)); + + assertEquals([4, 6], ToNumbersWithEntries(fixedLengthWithOffset)); + assertEquals([4, 6], ValuesToNumbers(fixedLengthWithOffset)); + assertEquals([0, 1], Keys(fixedLengthWithOffset)); + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(lengthTracking)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(lengthTracking)); + assertEquals([0, 1, 2, 3], Keys(lengthTracking)); + + assertEquals([4, 6], ToNumbersWithEntries(lengthTrackingWithOffset)); + assertEquals([4, 6], ValuesToNumbers(lengthTrackingWithOffset)); + assertEquals([0, 1], Keys(lengthTrackingWithOffset)); + + // Shrink so that fixed length TAs go out of bounds. + rab.resize(3 * ctor.BYTES_PER_ELEMENT); + + // Orig. array: [0, 2, 4] + // [0, 2, 4, ...] << lengthTracking + // [4, ...] << lengthTrackingWithOffset + + assertThrows(() => { fixedLength.entries(); }); + assertThrows(() => { fixedLength.values(); }); + assertThrows(() => { fixedLength.keys(); }); + assertThrows(() => { fixedLengthWithOffset.entries(); }); + assertThrows(() => { fixedLengthWithOffset.values(); }); + assertThrows(() => { fixedLengthWithOffset.keys(); }); + + assertEquals([0, 2, 4], ToNumbersWithEntries(lengthTracking)); + assertEquals([0, 2, 4], ValuesToNumbers(lengthTracking)); + assertEquals([0, 1, 2], Keys(lengthTracking)); + + assertEquals([4], ToNumbersWithEntries(lengthTrackingWithOffset)); + assertEquals([4], ValuesToNumbers(lengthTrackingWithOffset)); + assertEquals([0], Keys(lengthTrackingWithOffset)); + + // Shrink so that the TAs with offset go out of bounds. + rab.resize(1 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { fixedLength.entries(); }); + assertThrows(() => { fixedLength.values(); }); + assertThrows(() => { fixedLength.keys(); }); + assertThrows(() => { fixedLengthWithOffset.entries(); }); + assertThrows(() => { fixedLengthWithOffset.values(); }); + assertThrows(() => { fixedLengthWithOffset.keys(); }); + assertThrows(() => { lengthTrackingWithOffset.entries(); }); + assertThrows(() => { lengthTrackingWithOffset.values(); }); + assertThrows(() => { lengthTrackingWithOffset.keys(); }); + + assertEquals([0], ToNumbersWithEntries(lengthTracking)); + assertEquals([0], ValuesToNumbers(lengthTracking)); + assertEquals([0], Keys(lengthTracking)); + + // Shrink to zero. + rab.resize(0); + + assertThrows(() => { fixedLength.entries(); }); + assertThrows(() => { fixedLength.values(); }); + assertThrows(() => { fixedLength.keys(); }); + assertThrows(() => { fixedLengthWithOffset.entries(); }); + assertThrows(() => { fixedLengthWithOffset.values(); }); + assertThrows(() => { fixedLengthWithOffset.keys(); }); + assertThrows(() => { lengthTrackingWithOffset.entries(); }); + assertThrows(() => { lengthTrackingWithOffset.values(); }); + assertThrows(() => { lengthTrackingWithOffset.keys(); }); + + assertEquals([], ToNumbersWithEntries(lengthTracking)); + assertEquals([], ValuesToNumbers(lengthTracking)); + assertEquals([], Keys(lengthTracking)); + + // Grow so that all TAs are back in-bounds. + rab.resize(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6, 8, 10] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, 8, 10, ...] << lengthTracking + // [4, 6, 8, 10, ...] << lengthTrackingWithOffset + + assertEquals([0, 2, 4, 6], ToNumbersWithEntries(fixedLength)); + assertEquals([0, 2, 4, 6], ValuesToNumbers(fixedLength)); + assertEquals([0, 1, 2, 3], Keys(fixedLength)); + + assertEquals([4, 6], ToNumbersWithEntries(fixedLengthWithOffset)); + assertEquals([4, 6], ValuesToNumbers(fixedLengthWithOffset)); + assertEquals([0, 1], Keys(fixedLengthWithOffset)); + + assertEquals([0, 2, 4, 6, 8, 10], ToNumbersWithEntries(lengthTracking)); + assertEquals([0, 2, 4, 6, 8, 10], ValuesToNumbers(lengthTracking)); + assertEquals([0, 1, 2, 3, 4, 5], Keys(lengthTracking)); + + assertEquals([4, 6, 8, 10], ToNumbersWithEntries(lengthTrackingWithOffset)); + assertEquals([4, 6, 8, 10], ValuesToNumbers(lengthTrackingWithOffset)); + assertEquals([0, 1, 2, 3], Keys(lengthTrackingWithOffset)); + } +})(); + +(function EntriesKeysValuesGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + // Iterating with entries() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLength.entries(), + [[0, 0], [1, 2], [2, 4], [3, 6]], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLengthWithOffset.entries(), + [[0, 4], [1, 6]], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.entries(), + [[0, 0], [1, 2], [2, 4], [3, 6], [4, 0], [5, 0]], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.entries(), + [[0, 4], [1, 6], [2, 0], [3, 0]], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with keys() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLength.keys(), + [0, 1, 2, 3], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLengthWithOffset.keys(), + [0, 1], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.keys(), + [0, 1, 2, 3, 4, 5], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.keys(), + [0, 1, 2, 3], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with values() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLength.values(), + [0, 2, 4, 6], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array is not affected by resizing. + TestIterationAndResize(fixedLengthWithOffset.values(), + [4, 6], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.values(), + [0, 2, 4, 6, 0, 0], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.values(), + [4, 6, 0, 0], + rab, 2, 6 * ctor.BYTES_PER_ELEMENT); + } +})(); + +(function EntriesKeysValuesShrinkMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + // Iterating with entries() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLength.entries(), + null, + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLengthWithOffset.entries(), + null, + rab, 1, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.entries(), + [[0, 0], [1, 2], [2, 4]], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.entries(), + [[0, 4], [1, 6]], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with keys() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLength.keys(), + null, + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLengthWithOffset.keys(), + null, + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.keys(), + [0, 1, 2], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.keys(), + [0, 1], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } + + // Iterating with values() (the 4 loops below). + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLength.values(), + null, + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + + // The fixed length array goes out of bounds when the RAB is resized. + assertThrows(() => { TestIterationAndResize( + fixedLengthWithOffset.values(), + null, + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); }); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + + TestIterationAndResize(lengthTracking.values(), + [0, 2, 4], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } + + for (let ctor of ctors) { + const rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + TestIterationAndResize(lengthTrackingWithOffset.values(), + [4, 6], + rab, 2, 3 * ctor.BYTES_PER_ELEMENT); + } +})(); + +(function EverySome() { + for (let ctor of ctors) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + const fixedLength = new ctor(rab, 0, 4); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + const lengthTracking = new ctor(rab, 0); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + + function div3(n) { + return Number(n) % 3 == 0; + } + + function even(n) { + return Number(n) % 2 == 0; + } + + function over10(n) { + return Number(n) > 10; + } + + assertFalse(fixedLength.every(div3)); + assertTrue(fixedLength.every(even)); + assertTrue(fixedLength.some(div3)); + assertFalse(fixedLength.some(over10)); + + assertFalse(fixedLengthWithOffset.every(div3)); + assertTrue(fixedLengthWithOffset.every(even)); + assertTrue(fixedLengthWithOffset.some(div3)); + assertFalse(fixedLengthWithOffset.some(over10)); + + assertFalse(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertFalse(lengthTrackingWithOffset.every(div3)); + assertTrue(lengthTrackingWithOffset.every(even)); + assertTrue(lengthTrackingWithOffset.some(div3)); + assertFalse(lengthTrackingWithOffset.some(over10)); + + // Shrink so that fixed length TAs go out of bounds. + rab.resize(3 * ctor.BYTES_PER_ELEMENT); + + // Orig. array: [0, 2, 4] + // [0, 2, 4, ...] << lengthTracking + // [4, ...] << lengthTrackingWithOffset + + assertThrows(() => { fixedLength.every(div3); }); + assertThrows(() => { fixedLength.some(div3); }); + + assertThrows(() => { fixedLengthWithOffset.every(div3); }); + assertThrows(() => { fixedLengthWithOffset.some(div3); }); + + assertFalse(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertFalse(lengthTrackingWithOffset.every(div3)); + assertTrue(lengthTrackingWithOffset.every(even)); + assertFalse(lengthTrackingWithOffset.some(div3)); + assertFalse(lengthTrackingWithOffset.some(over10)); + + // Shrink so that the TAs with offset go out of bounds. + rab.resize(1 * ctor.BYTES_PER_ELEMENT); + + assertThrows(() => { fixedLength.every(div3); }); + assertThrows(() => { fixedLength.some(div3); }); + + assertThrows(() => { fixedLengthWithOffset.every(div3); }); + assertThrows(() => { fixedLengthWithOffset.some(div3); }); + + assertTrue(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertThrows(() => { lengthTrackingWithOffset.every(div3); }); + assertThrows(() => { lengthTrackingWithOffset.some(div3); }); + + // Shrink to zero. + rab.resize(0); + + assertThrows(() => { fixedLength.every(div3); }); + assertThrows(() => { fixedLength.some(div3); }); + + assertThrows(() => { fixedLengthWithOffset.every(div3); }); + assertThrows(() => { fixedLengthWithOffset.some(div3); }); + + assertTrue(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertFalse(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertThrows(() => { lengthTrackingWithOffset.every(div3); }); + assertThrows(() => { lengthTrackingWithOffset.some(div3); }); + + // Grow so that all TAs are back in-bounds. + rab.resize(6 * ctor.BYTES_PER_ELEMENT); + for (let i = 0; i < 6; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + + // Orig. array: [0, 2, 4, 6, 8, 10] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, 8, 10, ...] << lengthTracking + // [4, 6, 8, 10, ...] << lengthTrackingWithOffset + + assertFalse(fixedLength.every(div3)); + assertTrue(fixedLength.every(even)); + assertTrue(fixedLength.some(div3)); + assertFalse(fixedLength.some(over10)); + + assertFalse(fixedLengthWithOffset.every(div3)); + assertTrue(fixedLengthWithOffset.every(even)); + assertTrue(fixedLengthWithOffset.some(div3)); + assertFalse(fixedLengthWithOffset.some(over10)); + + assertFalse(lengthTracking.every(div3)); + assertTrue(lengthTracking.every(even)); + assertTrue(lengthTracking.some(div3)); + assertFalse(lengthTracking.some(over10)); + + assertFalse(lengthTrackingWithOffset.every(div3)); + assertTrue(lengthTrackingWithOffset.every(even)); + assertTrue(lengthTrackingWithOffset.some(div3)); + assertFalse(lengthTrackingWithOffset.some(over10)); + } +})(); + +(function EveryShrinkMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values; + let rab; + let resizeAfter; + let resizeTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == resizeAfter) { + rab.resize(resizeTo); + } + return true; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + resizeAfter = 2; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLength.every(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + resizeAfter = 1; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLengthWithOffset.every(myFunc)); + assertEquals([4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + resizeAfter = 2; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTracking.every(myFunc)); + assertEquals([0, 2, 4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + resizeAfter = 1; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTrackingWithOffset.every(myFunc)); + assertEquals([4, undefined], values); + } +})(); + +(function EveryGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values; + let rab; + let resizeAfter; + let resizeTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == resizeAfter) { + rab.resize(resizeTo); + } + return true; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + resizeAfter = 2; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLength.every(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + resizeAfter = 1; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(fixedLengthWithOffset.every(myFunc)); + assertEquals([4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + resizeAfter = 2; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTracking.every(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + resizeAfter = 1; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertTrue(lengthTrackingWithOffset.every(myFunc)); + assertEquals([4, 6], values); + } +})(); + +(function SomeShrinkMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values; + let rab; + let resizeAfter; + let resizeTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == resizeAfter) { + rab.resize(resizeTo); + } + return false; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + resizeAfter = 2; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLength.some(myFunc)); + assertEquals([0, 2, undefined, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + resizeAfter = 1; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLengthWithOffset.some(myFunc)); + assertEquals([4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + resizeAfter = 2; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTracking.some(myFunc)); + assertEquals([0, 2, 4, undefined], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + resizeAfter = 1; + resizeTo = 3 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTrackingWithOffset.some(myFunc)); + assertEquals([4, undefined], values); + } +})(); + +(function SomeGrowMidIteration() { + // Orig. array: [0, 2, 4, 6] + // [0, 2, 4, 6] << fixedLength + // [4, 6] << fixedLengthWithOffset + // [0, 2, 4, 6, ...] << lengthTracking + // [4, 6, ...] << lengthTrackingWithOffset + function CreateRabForTest(ctor) { + const rab = CreateResizableArrayBuffer(4 * ctor.BYTES_PER_ELEMENT, + 8 * ctor.BYTES_PER_ELEMENT); + // Write some data into the array. + const taWrite = new ctor(rab); + for (let i = 0; i < 4; ++i) { + WriteToTypedArray(taWrite, i, 2 * i); + } + return rab; + } + + let values = []; + let rab; + let resizeAfter; + let resizeTo; + function myFunc(n) { + if (n == undefined) { + values.push(n); + } else { + values.push(Number(n)); + } + if (values.length == resizeAfter) { + rab.resize(resizeTo); + } + return false; + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLength = new ctor(rab, 0, 4); + values = []; + resizeAfter = 2; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLength.some(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const fixedLengthWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT, 2); + values = []; + resizeAfter = 1; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(fixedLengthWithOffset.some(myFunc)); + assertEquals([4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTracking = new ctor(rab, 0); + values = []; + resizeAfter = 2; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTracking.some(myFunc)); + assertEquals([0, 2, 4, 6], values); + } + + for (let ctor of ctors) { + rab = CreateRabForTest(ctor); + const lengthTrackingWithOffset = new ctor(rab, 2 * ctor.BYTES_PER_ELEMENT); + values = []; + rab = rab; + resizeAfter = 1; + resizeTo = 5 * ctor.BYTES_PER_ELEMENT; + assertFalse(lengthTrackingWithOffset.some(myFunc)); + assertEquals([4, 6], values); + } +})(); diff --git a/deps/v8/test/mjsunit/wasm/array-copy-benchmark.js b/deps/v8/test/mjsunit/wasm/array-copy-benchmark.js index 0018f15659..eec9716b51 100644 --- a/deps/v8/test/mjsunit/wasm/array-copy-benchmark.js +++ b/deps/v8/test/mjsunit/wasm/array-copy-benchmark.js @@ -32,11 +32,11 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); .addBody([ ...wasmI32Const(array_length), kGCPrefix, kExprRttCanon, array_index, - kGCPrefix, kExprArrayNewDefault, array_index, + kGCPrefix, kExprArrayNewDefaultWithRtt, array_index, kExprGlobalSet, from.index, ...wasmI32Const(array_length), kGCPrefix, kExprRttCanon, array_index, - kGCPrefix, kExprArrayNewDefault, array_index, + kGCPrefix, kExprArrayNewDefaultWithRtt, array_index, kExprGlobalSet, to.index ]) .exportFunc(); diff --git a/deps/v8/test/mjsunit/wasm/externref-table.js b/deps/v8/test/mjsunit/wasm/externref-table.js index 0cfb656cb1..4b9463781b 100644 --- a/deps/v8/test/mjsunit/wasm/externref-table.js +++ b/deps/v8/test/mjsunit/wasm/externref-table.js @@ -10,8 +10,8 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); print(arguments.callee.name); let table = new WebAssembly.Table({element: "externref", initial: 10}); - // Table should be initialized with null. - assertEquals(null, table.get(1)); + // Table should be initialized with undefined. + assertEquals(undefined, table.get(1)); let obj = {'hello' : 'world'}; table.set(2, obj); assertSame(obj, table.get(2)); @@ -92,18 +92,19 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); assertEquals(table.get(2), testObject); })(); +function getDummy(val) { + let builder = new WasmModuleBuilder(); + builder.addFunction('dummy', kSig_i_v) + .addBody([kExprI32Const, val]) + .exportAs('dummy'); + return builder.instantiate().exports.dummy; +} + (function TestFuncRefTableConstructorWithDefaultValue() { print(arguments.callee.name); const expected = 6; - let dummy = - (() => { - let builder = new WasmModuleBuilder(); - builder.addFunction('dummy', kSig_i_v) - .addBody([kExprI32Const, expected]) - .exportAs('dummy'); - return builder.instantiate().exports.dummy; - })(); + let dummy = getDummy(expected); const argument = { "element": "anyfunc", "initial": 3 }; const table = new WebAssembly.Table(argument, dummy); @@ -112,3 +113,26 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); assertEquals(table.get(1)(), expected); assertEquals(table.get(2)(), expected); })(); + +(function TestExternFuncTableSetWithoutValue() { + print(arguments.callee.name); + + const expected = 6; + const dummy = getDummy(expected); + const argument = { "element": "anyfunc", "initial": 3 }; + const table = new WebAssembly.Table(argument, dummy); + assertEquals(table.get(1)(), expected); + table.set(1); + assertEquals(table.get(1), null); +})(); + +(function TestExternRefTableSetWithoutValue() { + print(arguments.callee.name); + + const testObject = {}; + const argument = { "element": "externref", "initial": 3 }; + const table = new WebAssembly.Table(argument, testObject); + assertEquals(table.get(1), testObject); + table.set(1); + assertEquals(table.get(1), undefined); +})(); diff --git a/deps/v8/test/mjsunit/wasm/gc-nominal.js b/deps/v8/test/mjsunit/wasm/gc-nominal.js index a58a51d732..8b371fc84f 100644 --- a/deps/v8/test/mjsunit/wasm/gc-nominal.js +++ b/deps/v8/test/mjsunit/wasm/gc-nominal.js @@ -6,26 +6,49 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); -var builder = new WasmModuleBuilder(); -let struct1 = builder.addStruct([makeField(kWasmI32, true)]); -let struct2 = builder.addStructExtending( - [makeField(kWasmI32, true), makeField(kWasmI32, true)], struct1); +(function() { + var builder = new WasmModuleBuilder(); + let struct1 = builder.addStructSubtype([makeField(kWasmI32, true)]); + let struct2 = builder.addStructSubtype( + [makeField(kWasmI32, true), makeField(kWasmI32, true)], struct1); -let array1 = builder.addArray(kWasmI32, true); -let array2 = builder.addArrayExtending(kWasmI32, true, array1); + let array1 = builder.addArraySubtype(kWasmI32, true); + let array2 = builder.addArraySubtype(kWasmI32, true, array1); -builder.addFunction("main", kSig_v_v) - .addLocals(wasmOptRefType(struct1), 1) - .addLocals(wasmOptRefType(array1), 1) - .addBody([ - kGCPrefix, kExprRttCanon, struct2, - kGCPrefix, kExprStructNewDefault, struct2, + builder.addFunction("main", kSig_v_v) + .addLocals(wasmOptRefType(struct1), 1) + .addLocals(wasmOptRefType(array1), 1) + .addBody([ + // Check that we can create a struct with explicit RTT... + kGCPrefix, kExprRttCanon, struct2, kGCPrefix, + kExprStructNewDefaultWithRtt, struct2, + // ...and upcast it. kExprLocalSet, 0, + // Check that we can create a struct with implicit RTT. + kGCPrefix, kExprStructNewDefault, struct2, kExprLocalSet, 0, + // Check that we can create an array with explicit RTT... kExprI32Const, 10, // length - kGCPrefix, kExprRttCanon, array2, - kGCPrefix, kExprArrayNewDefault, array2, - kExprLocalSet, 1 - ]); + kGCPrefix, kExprRttCanon, array2, kGCPrefix, + kExprArrayNewDefaultWithRtt, array2, + // ...and upcast it. + kExprLocalSet, 1, + // Check that we can create an array with implicit RTT. + kExprI32Const, 10, // length + kGCPrefix, kExprArrayNewDefault, array2, kExprLocalSet, 1 + ]) + .exportFunc(); + + // This test is only interested in type checking. + builder.instantiate(); +})(); -// This test is only interested in type checking. -builder.instantiate(); +(function () { + let builder = new WasmModuleBuilder(); + let t0 = builder.addStructSubtype([]); + for (let i = 0; i < 32; i++) { + builder.addStructSubtype([], i); + } + assertThrows( + () => builder.instantiate(), WebAssembly.CompileError, + /subtyping depth is greater than allowed/); +})(); diff --git a/deps/v8/test/mjsunit/wasm/inlining.js b/deps/v8/test/mjsunit/wasm/inlining.js index 3fd5179b32..bf75673ec6 100644 --- a/deps/v8/test/mjsunit/wasm/inlining.js +++ b/deps/v8/test/mjsunit/wasm/inlining.js @@ -2,12 +2,13 @@ // Use of this source code is governed by a BSD-style license that can be // found in the LICENSE file. -// Flags: --wasm-inlining --no-liftoff +// Flags: --wasm-inlining --no-liftoff --experimental-wasm-return-call +// Flags: --experimental-wasm-typed-funcref d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); // TODO(12166): Consider running tests with --trace-wasm and inspecting their -// output. +// output, or implementing testing infrastructure with --allow-natives-syntax. (function SimpleInliningTest() { let builder = new WasmModuleBuilder(); @@ -22,7 +23,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); .exportAs("main"); let instance = builder.instantiate(); - assertEquals(instance.exports.main(10), 14); + assertEquals(14, instance.exports.main(10)); })(); (function MultiReturnTest() { @@ -38,7 +39,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); .exportAs("main"); let instance = builder.instantiate(); - assertEquals(instance.exports.main(10), 9 * 11); + assertEquals(9 * 11, instance.exports.main(10)); })(); (function NoReturnTest() { @@ -55,7 +56,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); .exportAs("main"); let instance = builder.instantiate(); - assertEquals(instance.exports.main(10), 10); + assertEquals(10, instance.exports.main(10)); })(); (function InfiniteLoopTest() { @@ -75,3 +76,280 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); builder.instantiate(); })(); + +(function TailCallInCalleeTest() { + let builder = new WasmModuleBuilder(); + + // f(x) = g(x - 1) + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub, + kExprReturnCall, 1]); + // g(x) = x * 2 + builder.addFunction("inner_callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 2, kExprI32Mul]); + // h(x) = f(x) + 5 + builder.addFunction("main", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprCallFunction, callee.index, + kExprI32Const, 5, kExprI32Add]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(23, instance.exports.main(10)); +})(); + +(function MultipleCallAndReturnSitesTest() { + let builder = new WasmModuleBuilder(); + + // f(x) = x >= 0 ? x - 1 : x + 1 + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 0, kExprI32GeS, + kExprIf, kWasmI32, + kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub, + kExprElse, + kExprLocalGet, 0, kExprI32Const, 1, kExprI32Add, + kExprEnd]); + // g(x) = f(x) * f(-x) + builder.addFunction("main", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprCallFunction, callee.index, + kExprI32Const, 0, kExprLocalGet, 0, kExprI32Sub, + kExprCallFunction, callee.index, + kExprI32Mul]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(-81, instance.exports.main(10)); +})(); + +(function TailCallInCallerTest() { + let builder = new WasmModuleBuilder(); + + // f(x) = x > 0 ? g(x) + 1: g(x - 1); + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 0, kExprI32GeS, + kExprIf, kWasmI32, + kExprLocalGet, 0, kExprCallFunction, 1, kExprI32Const, 1, + kExprI32Add, + kExprElse, + kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub, + kExprReturnCall, 1, + kExprEnd]); + // g(x) = x * 2 + builder.addFunction("inner_callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 2, kExprI32Mul]); + // h(x) = f(x + 5) + builder.addFunction("main", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 5, kExprI32Add, + kExprReturnCall, callee.index]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(31, instance.exports.main(10)); + assertEquals(-12, instance.exports.main(-10)); +})(); + +(function HandledInHandledTest() { + let builder = new WasmModuleBuilder(); + let tag = builder.addTag(kSig_v_i); + + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprTry, kWasmI32, + kExprI32Const, 42, + kExprThrow, tag, + kExprCatchAll, + kExprLocalGet, 0, + kExprEnd]); + + builder.addFunction("main", kSig_i_ii) + .addBody([kExprTry, kWasmI32, + kExprLocalGet, 0, + kExprCallFunction, callee.index, + kExprCatchAll, + kExprLocalGet, 1, + kExprEnd]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(10, instance.exports.main(10, 20)); +})(); + +(function HandledInUnhandledTest() { + let builder = new WasmModuleBuilder(); + let tag = builder.addTag(kSig_v_i); + + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprTry, kWasmI32, + kExprI32Const, 42, + kExprThrow, tag, + kExprCatchAll, + kExprLocalGet, 0, + kExprEnd]); + + builder.addFunction("main", kSig_i_ii) + .addBody([kExprLocalGet, 0, + kExprCallFunction, callee.index,]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(10, instance.exports.main(10, 20)); +})(); + +(function UnhandledInUnhandledTest() { + let builder = new WasmModuleBuilder(); + let tag = builder.addTag(kSig_v_i); + + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprI32Const, 42, kExprThrow, tag]); + + builder.addFunction("main", kSig_i_ii) + .addBody([kExprLocalGet, 0, + kExprCallFunction, callee.index]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertThrows(() => instance.exports.main(10, 20), WebAssembly.Exception); +})(); + +// This is the most interesting of the exception tests, as it requires rewiring +// the unhandled calls in the callee (including the 'throw' builtin) to the +// handler in the caller. +(function UnhandledInHandledTest() { + let builder = new WasmModuleBuilder(); + let tag = builder.addTag(kSig_v_i); + + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([ + kExprLocalGet, 0, + kExprIf, kWasmI32, + kExprLocalGet, 0, kExprThrow, tag, + kExprElse, + kExprCallFunction, 1, + kExprEnd]); + + builder.addFunction("unreachable", kSig_i_v) + .addBody([kExprUnreachable]); + + builder.addFunction("main", kSig_i_ii) + .addBody([kExprTry, kWasmI32, + kExprLocalGet, 0, + kExprCallFunction, callee.index, + kExprCatchAll, + kExprLocalGet, 1, + kExprEnd]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(20, instance.exports.main(10, 20)); +})(); + +(function CallRefSpecSucceededTest() { + let builder = new WasmModuleBuilder(); + + // f(x) = x - 1 + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub]); + + let global = builder.addGlobal(wasmRefType(0), false, + WasmInitExpr.RefFunc(callee.index)); + + // g(x) = f(5) + x + builder.addFunction("main", kSig_i_i) + .addBody([kExprI32Const, 5, kExprGlobalGet, global.index, kExprCallRef, + kExprLocalGet, 0, kExprI32Add]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(14, instance.exports.main(10)); +})(); + +(function CallRefSpecFailedTest() { + let builder = new WasmModuleBuilder(); + + // h(x) = x - 1 + builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub]); + + // f(x) = x - 2 + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 2, kExprI32Sub]); + + let global = builder.addGlobal(wasmRefType(1), false, + WasmInitExpr.RefFunc(callee.index)); + + // g(x) = f(5) + x + builder.addFunction("main", kSig_i_i) + .addBody([kExprI32Const, 5, kExprGlobalGet, global.index, kExprCallRef, + kExprLocalGet, 0, kExprI32Add]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(13, instance.exports.main(10)); +})(); + +(function CallReturnRefSpecSucceededTest() { + let builder = new WasmModuleBuilder(); + + // f(x) = x - 1 + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub]); + + let global = builder.addGlobal(wasmRefType(0), false, + WasmInitExpr.RefFunc(callee.index)); + + // g(x) = f(5 + x) + builder.addFunction("main", kSig_i_i) + .addBody([kExprI32Const, 5, kExprLocalGet, 0, kExprI32Add, + kExprGlobalGet, global.index, kExprReturnCallRef]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(14, instance.exports.main(10)); +})(); + +(function CallReturnRefSpecFailedTest() { + let builder = new WasmModuleBuilder(); + + // h(x) = x - 1 + builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub]); + + // f(x) = x - 2 + let callee = builder.addFunction("callee", kSig_i_i) + .addBody([kExprLocalGet, 0, kExprI32Const, 2, kExprI32Sub]); + + let global = builder.addGlobal(wasmRefType(1), false, + WasmInitExpr.RefFunc(callee.index)); + + // g(x) = f(5 + x) + builder.addFunction("main", kSig_i_i) + .addBody([kExprI32Const, 5, kExprLocalGet, 0, kExprI32Add, + kExprGlobalGet, global.index, kExprReturnCallRef]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(13, instance.exports.main(10)); +})(); + +// Tests that no LoopExits are emitted in the inlined function. +(function LoopUnrollingTest() { + let builder = new WasmModuleBuilder(); + + // f(x, y) = { do { y += 1; x -= 1; } while (x > 0); return y; } + let callee = builder.addFunction("callee", kSig_i_ii) + .addBody([ + kExprLoop, kWasmVoid, + kExprLocalGet, 1, kExprI32Const, 1, kExprI32Add, kExprLocalSet, 1, + kExprLocalGet, 0, kExprI32Const, 1, kExprI32Sub, kExprLocalSet, 0, + kExprLocalGet, 0, kExprI32Const, 0, kExprI32GtS, kExprBrIf, 0, + kExprEnd, + kExprLocalGet, 1 + ]); + // g(x) = f(5, x) + x + builder.addFunction("main", kSig_i_i) + .addBody([kExprI32Const, 5, kExprLocalGet, 0, + kExprCallFunction, callee.index, + kExprLocalGet, 0, kExprI32Add]) + .exportAs("main"); + + let instance = builder.instantiate(); + assertEquals(25, instance.exports.main(10)); +})(); diff --git a/deps/v8/test/mjsunit/wasm/js-api.js b/deps/v8/test/mjsunit/wasm/js-api.js index 64216fffb7..f9b231242c 100644 --- a/deps/v8/test/mjsunit/wasm/js-api.js +++ b/deps/v8/test/mjsunit/wasm/js-api.js @@ -698,8 +698,6 @@ assertThrows( assertThrows( () => set.call({}), TypeError, /Receiver is not a WebAssembly.Table/); assertThrows( - () => set.call(tbl1, 0), TypeError, /must be null or a WebAssembly function/); -assertThrows( () => set.call(tbl1, undefined), TypeError, /must be convertible to a valid number/); assertThrows( @@ -765,7 +763,7 @@ assertThrows( () => tbl.grow(-Infinity), TypeError, /must be convertible to a valid number/); assertEq(tbl.grow(0), 1); assertEq(tbl.length, 1); -assertEq(tbl.grow(1, 4), 1); +assertEq(tbl.grow(1, null, 4), 1); assertEq(tbl.length, 2); assertEq(tbl.length, 2); assertThrows(() => tbl.grow(1), Error, /failed to grow table by \d+/); diff --git a/deps/v8/test/mjsunit/wasm/load-elimination.js b/deps/v8/test/mjsunit/wasm/load-elimination.js index 8ca04ed040..b5ecc2eb40 100644 --- a/deps/v8/test/mjsunit/wasm/load-elimination.js +++ b/deps/v8/test/mjsunit/wasm/load-elimination.js @@ -182,7 +182,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); .addBody([ kExprI32Const, 5, kGCPrefix, kExprRttCanon, array, - kGCPrefix, kExprArrayNewDefault, array, + kGCPrefix, kExprArrayNewDefaultWithRtt, array, kExprLocalSet, 1, kExprLocalGet, 1, // a[i] = i for i = {0..4} @@ -308,7 +308,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); builder.addFunction("main", kSig_i_i) .addBody([ kExprI32Const, 10, kGCPrefix, kExprRttCanon, array, - kGCPrefix, kExprArrayNewDefault, array, + kGCPrefix, kExprArrayNewDefaultWithRtt, array, kExprI32Const, 7, kExprCallFunction, tester.index, ]) diff --git a/deps/v8/test/mjsunit/wasm/module-memory.js b/deps/v8/test/mjsunit/wasm/module-memory.js index 7420a9cd2a..0db0e8bf0d 100644 --- a/deps/v8/test/mjsunit/wasm/module-memory.js +++ b/deps/v8/test/mjsunit/wasm/module-memory.js @@ -166,29 +166,3 @@ function testOOBThrows() { } testOOBThrows(); - -function testAddressSpaceLimit() { - // 1TiB + 4 GiB, see wasm-memory.h - const kMaxAddressSpace = 1 * 1024 * 1024 * 1024 * 1024 - + 4 * 1024 * 1024 * 1024; - const kAddressSpacePerMemory = 10 * 1024 * 1024 * 1024; - - let last_memory; - try { - let memories = []; - let address_space = 0; - while (address_space <= kMaxAddressSpace + 1) { - last_memory = new WebAssembly.Memory({initial: 1}) - memories.push(last_memory); - address_space += kAddressSpacePerMemory; - } - } catch (e) { - assertTrue(e instanceof RangeError); - return; - } - assertUnreachable("should have reached the address space limit"); -} - -if(%IsWasmTrapHandlerEnabled()) { - testAddressSpaceLimit(); -} diff --git a/deps/v8/test/mjsunit/wasm/mutable-globals.js b/deps/v8/test/mjsunit/wasm/mutable-globals.js index e16d318d84..80d3f3515d 100644 --- a/deps/v8/test/mjsunit/wasm/mutable-globals.js +++ b/deps/v8/test/mjsunit/wasm/mutable-globals.js @@ -21,12 +21,8 @@ function assertGlobalIsValid(global) { assertThrows(() => new WebAssembly.Global({}), TypeError); assertThrows(() => new WebAssembly.Global({value: 'foo'}), TypeError); assertThrows(() => new WebAssembly.Global({value: 'i128'}), TypeError); - // Without --experimental-wasm-reftypes, globals of type {externref} and {anyfunc} - // are not allowed. - assertThrows(() => new WebAssembly.Global({value: 'externref'}), TypeError); - assertThrows(() => new WebAssembly.Global({value: 'anyfunc'}), TypeError); - for (let type of ['i32', 'f32', 'f64', 'i64']) { + for (let type of ['i32', 'f32', 'f64', 'i64', 'externref', 'anyfunc']) { assertGlobalIsValid(new WebAssembly.Global({value: type})); } })(); diff --git a/deps/v8/test/mjsunit/wasm/prototype.js b/deps/v8/test/mjsunit/wasm/prototype.js new file mode 100644 index 0000000000..c8f06bff72 --- /dev/null +++ b/deps/v8/test/mjsunit/wasm/prototype.js @@ -0,0 +1,42 @@ +// Copyright 2021 the V8 project authors. All rights reserved. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. + +d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); + +let emptyModuleBinary = new WasmModuleBuilder().toBuffer(); + +(function ModulePrototype() { + class _Module extends WebAssembly.Module {} + let module = new _Module(emptyModuleBinary); + assertInstanceof(module, _Module); + assertInstanceof(module, WebAssembly.Module); +})(); + +(function InstancePrototype() { + class _Instance extends WebAssembly.Instance {} + let instance = new _Instance(new WebAssembly.Module(emptyModuleBinary)); + assertInstanceof(instance, _Instance); + assertInstanceof(instance, WebAssembly.Instance); +})(); + +(function TablePrototype() { + class _Table extends WebAssembly.Table {} + let table = new _Table({initial: 0, element: "anyfunc"}); + assertInstanceof(table, _Table); + assertInstanceof(table, WebAssembly.Table); +})(); + +(function MemoryPrototype() { + class _Memory extends WebAssembly.Memory {} + let memory = new _Memory({initial: 0, maximum: 1}); + assertInstanceof(memory, _Memory); + assertInstanceof(memory, WebAssembly.Memory); +})(); + +(function GlobalPrototype() { + class _Global extends WebAssembly.Global {} + let global = new _Global({value: 'i32', mutable: false}, 0); + assertInstanceof(global, _Global); + assertInstanceof(global, WebAssembly.Global); +})(); diff --git a/deps/v8/test/mjsunit/wasm/reference-globals.js b/deps/v8/test/mjsunit/wasm/reference-globals.js index 76d41f8f97..6ab071f9fa 100644 --- a/deps/v8/test/mjsunit/wasm/reference-globals.js +++ b/deps/v8/test/mjsunit/wasm/reference-globals.js @@ -113,7 +113,7 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); var struct_index = builder.addStruct([{type: kWasmI32, mutability: false}]); var composite_struct_index = builder.addStruct( [{type: kWasmI32, mutability: false}, - {type: wasmRefType(struct_index), mutability: false}, + {type: wasmOptRefType(struct_index), mutability: false}, {type: kWasmI8, mutability: true}]); let field1_value = 432; @@ -136,6 +136,12 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); WasmInitExpr.I32Const(field3_value), WasmInitExpr.RttCanon(composite_struct_index)])); + var global_default = builder.addGlobal( + wasmRefType(composite_struct_index), false, + WasmInitExpr.StructNewDefaultWithRtt( + composite_struct_index, + WasmInitExpr.RttCanon(composite_struct_index))); + builder.addFunction("field_1", kSig_i_v) .addBody([ kExprGlobalGet, global.index, @@ -156,11 +162,33 @@ d8.file.execute("test/mjsunit/wasm/wasm-module-builder.js"); kExprGlobalGet, global.index, kGCPrefix, kExprStructGetS, composite_struct_index, 2]) .exportFunc(); + + builder.addFunction("field_1_default", kSig_i_v) + .addBody([ + kExprGlobalGet, global_default.index, + kGCPrefix, kExprStructGet, composite_struct_index, 0]) + .exportFunc(); + + builder.addFunction("field_2_default", makeSig([], [kWasmAnyRef])) + .addBody([ + kExprGlobalGet, global_default.index, + kGCPrefix, kExprStructGet, composite_struct_index, 1]) + .exportFunc(); + + builder.addFunction("field_3_default", kSig_i_v) + .addBody([ + kExprGlobalGet, global_default.index, + kGCPrefix, kExprStructGetS, composite_struct_index, 2]) + .exportFunc(); + var instance = builder.instantiate({}); assertEquals(field1_value, instance.exports.field_1()); assertEquals(field2_value, instance.exports.field_2()); assertEquals((field3_value << 24) >> 24, instance.exports.field_3()); + assertEquals(0, instance.exports.field_1_default()); + assertEquals(null, instance.exports.field_2_default()); + assertEquals(0, instance.exports.field_3_default()); })(); (function TestArrayInitExprNumeric() { diff --git a/deps/v8/test/mjsunit/wasm/shared-memory-gc-stress.js b/deps/v8/test/mjsunit/wasm/shared-memory-gc-stress.js index 1dbbcb9ff6..e46d226b48 100644 --- a/deps/v8/test/mjsunit/wasm/shared-memory-gc-stress.js +++ b/deps/v8/test/mjsunit/wasm/shared-memory-gc-stress.js @@ -34,4 +34,5 @@ function RunSomeAllocs(total, retained, pages, max = pages) { RunSomeAllocs(10, 1, 1, 1); RunSomeAllocs(100, 3, 1, 1); RunSomeAllocs(1000, 10, 1, 1); -RunSomeAllocs(10000, 20, 1, 1); +// TODO(12278): Make this faster (by collection memories earlier?) and reenable. +// RunSomeAllocs(10000, 20, 1, 1); diff --git a/deps/v8/test/mjsunit/wasm/shared-memory-worker-explicit-gc-stress.js b/deps/v8/test/mjsunit/wasm/shared-memory-worker-explicit-gc-stress.js index d970126f11..0c46b64ee7 100644 --- a/deps/v8/test/mjsunit/wasm/shared-memory-worker-explicit-gc-stress.js +++ b/deps/v8/test/mjsunit/wasm/shared-memory-worker-explicit-gc-stress.js @@ -6,8 +6,6 @@ d8.file.execute("test/mjsunit/worker-ping-test.js"); -let kDisabledAbort = false; // TODO(9380): enable abort for this test - let config = { numThings: 4, // size of circular buffer numWorkers: 4, // number of workers @@ -16,7 +14,7 @@ let config = { traceScript: false, // print the script traceAlloc: true, // print each allocation attempt traceIteration: 10, // print diagnostics every so many iterations - abortOnFail: kDisabledAbort, // kill worker if allocation fails + abortOnFail: true, // kill worker if allocation fails AllocThing: function AllocThing(id) { let pages = 1, max = 1; diff --git a/deps/v8/test/mjsunit/wasm/table-fill.js b/deps/v8/test/mjsunit/wasm/table-fill.js index 78b13f1706..97e874189b 100644 --- a/deps/v8/test/mjsunit/wasm/table-fill.js +++ b/deps/v8/test/mjsunit/wasm/table-fill.js @@ -74,7 +74,7 @@ function checkExternRefTable(getter, start, count, value) { (function testExternRefTableIsUninitialized() { print(arguments.callee.name); - checkExternRefTable(instance.exports[`get${import_ref}`], 0, size, null); + checkExternRefTable(instance.exports[`get${import_ref}`], 0, size, undefined); checkExternRefTable(instance.exports[`get${internal_ref}`], 0, size, null); })(); @@ -102,7 +102,7 @@ function checkExternRefTable(getter, start, count, value) { kTrapTableOutOfBounds, () => instance.exports[`fill${import_ref}`](start, value, count)); checkExternRefTable( - instance.exports[`get${import_ref}`], start, size - start, null); + instance.exports[`get${import_ref}`], start, size - start, undefined); value = 45; assertTraps( diff --git a/deps/v8/test/mjsunit/wasm/table-grow-from-wasm.js b/deps/v8/test/mjsunit/wasm/table-grow-from-wasm.js index fad6825fbc..25ed6eb1c4 100644 --- a/deps/v8/test/mjsunit/wasm/table-grow-from-wasm.js +++ b/deps/v8/test/mjsunit/wasm/table-grow-from-wasm.js @@ -130,7 +130,7 @@ testGrowInternalAnyFuncTable(9); const table = new WebAssembly.Table({element: "externref", initial: size}); const instance = builder.instantiate({imp: {table: table}}); - assertEquals(null, table.get(size - 2)); + assertEquals(undefined, table.get(size - 2)); function growAndCheck(element, grow_by) { assertEquals(size, instance.exports.size()); diff --git a/deps/v8/test/mjsunit/wasm/table.js b/deps/v8/test/mjsunit/wasm/table.js index ef4eddaf9d..0175169f17 100644 --- a/deps/v8/test/mjsunit/wasm/table.js +++ b/deps/v8/test/mjsunit/wasm/table.js @@ -196,7 +196,6 @@ function assertTableIsValid(table, length) { assertThrows(() => table.set(key, f), RangeError); } - assertThrows(() => table.set(0), TypeError); for (let val of [undefined, 0, "", {}, [], () => {}]) { assertThrows(() => table.set(0, val), TypeError); } @@ -285,3 +284,18 @@ function assertTableIsValid(table, length) { table.grow({valueOf: () => {table.grow(2); return 1;}}); assertEquals(3, table.length); })(); + +(function TestGrowWithInit() { + function getDummy(val) { + let builder = new WasmModuleBuilder(); + builder.addFunction('dummy', kSig_i_v) + .addBody([kExprI32Const, val]) + .exportAs('dummy'); + return builder.instantiate().exports.dummy; + } + let table = new WebAssembly.Table({element: "anyfunc", initial: 1}); + table.grow(5, getDummy(24)); + for (let i = 1; i <= 5; ++i) { + assertEquals(24, table.get(i)()); + } +})(); diff --git a/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js b/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js index 8b35c1cd0b..8f1a5a3f7c 100644 --- a/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js +++ b/deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js @@ -8,13 +8,13 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function TestTableType() { let table = new WebAssembly.Table({initial: 1, element: "externref"}); - let type = WebAssembly.Table.type(table); + let type = table.type(); assertEquals(1, type.minimum); assertEquals("externref", type.element); assertEquals(2, Object.getOwnPropertyNames(type).length); table = new WebAssembly.Table({initial: 2, maximum: 15, element: "externref"}); - type = WebAssembly.Table.type(table); + type = table.type(); assertEquals(2, type.minimum); assertEquals(15, type.maximum); assertEquals("externref", type.element); @@ -23,19 +23,19 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function TestGlobalType() { let global = new WebAssembly.Global({value: "externref", mutable: true}); - let type = WebAssembly.Global.type(global); + let type = global.type(); assertEquals("externref", type.value); assertEquals(true, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "externref"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("externref", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "anyfunc"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("anyfunc", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); diff --git a/deps/v8/test/mjsunit/wasm/type-reflection.js b/deps/v8/test/mjsunit/wasm/type-reflection.js index 4f2638ec7f..f88cf15136 100644 --- a/deps/v8/test/mjsunit/wasm/type-reflection.js +++ b/deps/v8/test/mjsunit/wasm/type-reflection.js @@ -6,55 +6,19 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); -(function TestInvalidArgumentToType() { - ["abc", 123, {}, _ => 0].forEach(function(invalidInput) { - assertThrows( - () => WebAssembly.Memory.type(invalidInput), TypeError, - "WebAssembly.Memory.type(): Argument 0 must be a WebAssembly.Memory"); - assertThrows( - () => WebAssembly.Table.type(invalidInput), TypeError, - "WebAssembly.Table.type(): Argument 0 must be a WebAssembly.Table"); - assertThrows( - () => WebAssembly.Global.type(invalidInput), TypeError, - "WebAssembly.Global.type(): Argument 0 must be a WebAssembly.Global"); - assertThrows( - () => WebAssembly.Function.type(invalidInput), TypeError, - "WebAssembly.Function.type(): Argument 0 must be a WebAssembly.Function"); - }); - - assertThrows( - () => WebAssembly.Memory.type( - new WebAssembly.Table({initial:1, element: "anyfunc"})), - TypeError, - "WebAssembly.Memory.type(): Argument 0 must be a WebAssembly.Memory"); - - assertThrows( - () => WebAssembly.Table.type( - new WebAssembly.Memory({initial:1})), TypeError, - "WebAssembly.Table.type(): Argument 0 must be a WebAssembly.Table"); - - assertThrows( - () => WebAssembly.Global.type( - new WebAssembly.Memory({initial:1})), TypeError, - "WebAssembly.Global.type(): Argument 0 must be a WebAssembly.Global"); - - assertThrows( - () => WebAssembly.Function.type( - new WebAssembly.Memory({initial:1})), TypeError, - "WebAssembly.Function.type(): Argument 0 must be a WebAssembly.Function"); -})(); - (function TestMemoryType() { let mem = new WebAssembly.Memory({initial: 1}); - let type = WebAssembly.Memory.type(mem); + let type = mem.type(); assertEquals(1, type.minimum); - assertEquals(1, Object.getOwnPropertyNames(type).length); + assertEquals(false, type.shared); + assertEquals(2, Object.getOwnPropertyNames(type).length); mem = new WebAssembly.Memory({initial: 2, maximum: 15}); - type = WebAssembly.Memory.type(mem); + type = mem.type(); assertEquals(2, type.minimum); assertEquals(15, type.maximum); - assertEquals(2, Object.getOwnPropertyNames(type).length); + assertEquals(false, type.shared); + assertEquals(3, Object.getOwnPropertyNames(type).length); })(); (function TestMemoryExports() { @@ -105,14 +69,14 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function TestTableType() { let table = new WebAssembly.Table({initial: 1, element: "anyfunc"}); - let type = WebAssembly.Table.type(table); + let type = table.type(); assertEquals(1, type.minimum); assertEquals("anyfunc", type.element); assertEquals(undefined, type.maximum); assertEquals(2, Object.getOwnPropertyNames(type).length); table = new WebAssembly.Table({initial: 2, maximum: 15, element: "anyfunc"}); - type = WebAssembly.Table.type(table); + type = table.type(); assertEquals(2, type.minimum); assertEquals(15, type.maximum); assertEquals("anyfunc", type.element); @@ -171,31 +135,31 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function TestGlobalType() { let global = new WebAssembly.Global({value: "i32", mutable: true}); - let type = WebAssembly.Global.type(global); + let type = global.type(); assertEquals("i32", type.value); assertEquals(true, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "i32"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("i32", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "i64"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("i64", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "f32"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("f32", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); global = new WebAssembly.Global({value: "f64"}); - type = WebAssembly.Global.type(global); + type = global.type(); assertEquals("f64", type.value); assertEquals(false, type.mutable); assertEquals(2, Object.getOwnPropertyNames(type).length); @@ -242,62 +206,63 @@ d8.file.execute('test/mjsunit/wasm/wasm-module-builder.js'); (function TestMemoryConstructorWithMinimum() { let mem = new WebAssembly.Memory({minimum: 1}); assertTrue(mem instanceof WebAssembly.Memory); - let type = WebAssembly.Memory.type(mem); + let type = mem.type(); assertEquals(1, type.minimum); - assertEquals(1, Object.getOwnPropertyNames(type).length); + assertEquals(false, type.shared); + assertEquals(2, Object.getOwnPropertyNames(type).length); - mem = new WebAssembly.Memory({minimum: 1, maximum: 5}); + mem = new WebAssembly.Memory({minimum: 1, maximum: 5, shared: false}); assertTrue(mem instanceof WebAssembly.Memory); - type = WebAssembly.Memory.type(mem); + type = mem.type(); assertEquals(1, type.minimum); assertEquals(5, type.maximum); - assertEquals(2, Object.getOwnPropertyNames(type).length); - - mem = new WebAssembly.Memory({minimum: 1, initial: 2}); - assertTrue(mem instanceof WebAssembly.Memory); - type = WebAssembly.Memory.type(mem); - assertEquals(2, type.minimum); - assertEquals(1, Object.getOwnPropertyNames(type).length); + assertEquals(false, type.shared); + assertEquals(3, Object.getOwnPropertyNames(type).length); - mem = new WebAssembly.Memory({minimum: 1, initial: 2, maximum: 5}); + mem = new WebAssembly.Memory({initial: 1, maximum: 5, shared: true}); assertTrue(mem instanceof WebAssembly.Memory); - type = WebAssembly.Memory.type(mem); - assertEquals(2, type.minimum); + type = mem.type(); + assertEquals(1, type.minimum); assertEquals(5, type.maximum); - assertEquals(2, Object.getOwnPropertyNames(type).length); + assertEquals(true, type.shared); + assertEquals(3, Object.getOwnPropertyNames(type).length); + + assertThrows( + () => new WebAssembly.Memory({minimum: 1, initial: 2}), TypeError, + /The properties 'initial' and 'minimum' are not allowed at the same time/); + + assertThrows( + () => new WebAssembly.Memory({minimum: 1, initial: 2, maximum: 5}), + TypeError, + /The properties 'initial' and 'minimum' are not allowed at the same time/); })(); (function TestTableConstructorWithMinimum() { let table = new WebAssembly.Table({minimum: 1, element: 'anyfunc'}); assertTrue(table instanceof WebAssembly.Table); - let type = WebAssembly.Table.type(table); + let type = table.type(); assertEquals(1, type.minimum); assertEquals('anyfunc', type.element); assertEquals(2, Object.getOwnPropertyNames(type).length); table = new WebAssembly.Table({minimum: 1, element: 'anyfunc', maximum: 5}); assertTrue(table instanceof WebAssembly.Table); - type = WebAssembly.Table.type(table); + type = table.type(); assertEquals(1, type.minimum); assertEquals(5, type.maximum); assertEquals('anyfunc', type.element); assertEquals(3, Object.getOwnPropertyNames(type).length); - table = new WebAssembly.Table({minimum: 1, initial: 2, element: 'anyfunc'}); - assertTrue(table instanceof WebAssembly.Table); - type = WebAssembly.Table.type(table); - assertEquals(2, type.minimum); - assertEquals('anyfunc', type.element); - assertEquals(2, Object.getOwnPropertyNames(type).length); + assertThrows( + () => new WebAssembly.Table({minimum: 1, initial: 2, element: 'anyfunc'}), + TypeError, + /The properties 'initial' and 'minimum' are not allowed at the same time/); - table = new WebAssembly.Table({minimum: 1, initial: 2, element: 'anyfunc', - maximum: 5}); - assertTrue(table instanceof WebAssembly.Table); - type = WebAssembly.Table.type(table); - assertEquals(2, type.minimum); - assertEquals(5, type.maximum); - assertEquals('anyfunc', type.element); - assertEquals(3, Object.getOwnPropertyNames(type).length); + assertThrows( + () => new WebAssembly.Table({minimum: 1, initial: 2, element: 'anyfunc', + maximum: 5}), + TypeError, + /The properties 'initial' and 'minimum' are not allowed at the same time/); })(); (function TestFunctionConstructor() { diff --git a/deps/v8/test/mjsunit/wasm/wasm-gc-js-roundtrip.js b/deps/v8/test/mjsunit/wasm/wasm-gc-js-roundtrip.js index 7ed8769d50..4c36fb1ea9 100644 --- a/deps/v8/test/mjsunit/wasm/wasm-gc-js-roundtrip.js +++ b/deps/v8/test/mjsunit/wasm/wasm-gc-js-roundtrip.js @@ -18,15 +18,15 @@ let instance = (() => { builder.addFunction('struct_producer', makeSig([], [kWasmDataRef])) .addBody([ - kGCPrefix, kExprRttCanon, struct, kGCPrefix, kExprStructNewDefault, - struct + kGCPrefix, kExprRttCanon, struct, kGCPrefix, + kExprStructNewDefaultWithRtt, struct ]) .exportFunc(); builder.addFunction('array_producer', makeSig([], [kWasmDataRef])) .addBody([ kExprI32Const, 10, kGCPrefix, kExprRttCanon, array, kGCPrefix, - kExprArrayNewDefault, array + kExprArrayNewDefaultWithRtt, array ]) .exportFunc(); diff --git a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js index 4f0c32fbab..61dbb47e69 100644 --- a/deps/v8/test/mjsunit/wasm/wasm-module-builder.js +++ b/deps/v8/test/mjsunit/wasm/wasm-module-builder.js @@ -77,9 +77,9 @@ let kLocalNamesCode = 2; let kWasmFunctionTypeForm = 0x60; let kWasmStructTypeForm = 0x5f; let kWasmArrayTypeForm = 0x5e; -let kWasmFunctionExtendingTypeForm = 0x5d; -let kWasmStructExtendingTypeForm = 0x5c; -let kWasmArrayExtendingTypeForm = 0x5b; +let kWasmFunctionSubtypeForm = 0x5d; +let kWasmStructSubtypeForm = 0x5c; +let kWasmArraySubtypeForm = 0x5b; let kLimitsNoMaximum = 0x00; let kLimitsWithMaximum = 0x01; @@ -469,13 +469,15 @@ for (let prefix in kPrefixOpcodes) { // GC opcodes let kExprStructNewWithRtt = 0x01; -let kExprStructNewDefault = 0x02; +let kExprStructNewDefaultWithRtt = 0x02; let kExprStructGet = 0x03; let kExprStructGetS = 0x04; let kExprStructGetU = 0x05; let kExprStructSet = 0x06; +let kExprStructNew = 0x07; +let kExprStructNewDefault = 0x08; let kExprArrayNewWithRtt = 0x11; -let kExprArrayNewDefault = 0x12; +let kExprArrayNewDefaultWithRtt = 0x12; let kExprArrayGet = 0x13; let kExprArrayGetS = 0x14; let kExprArrayGetU = 0x15; @@ -483,6 +485,9 @@ let kExprArraySet = 0x16; let kExprArrayLen = 0x17; let kExprArrayCopy = 0x18; let kExprArrayInit = 0x19; +let kExprArrayInitStatic = 0x1a; +let kExprArrayNew = 0x1b; +let kExprArrayNewDefault = 0x1c; let kExprI31New = 0x20; let kExprI31GetS = 0x21; let kExprI31GetU = 0x22; @@ -493,6 +498,10 @@ let kExprRefTest = 0x40; let kExprRefCast = 0x41; let kExprBrOnCast = 0x42; let kExprBrOnCastFail = 0x43; +let kExprRefTestStatic = 0x44; +let kExprRefCastStatic = 0x45; +let kExprBrOnCastStatic = 0x46; +let kExprBrOnCastStaticFail = 0x47; let kExprRefIsFunc = 0x50; let kExprRefIsData = 0x51; let kExprRefIsI31 = 0x52; @@ -974,7 +983,6 @@ class Binary { } } - emit_init_expr_recursive(expr) { switch (expr.kind) { case kExprGlobalGet: @@ -1004,20 +1012,24 @@ class Binary { this.emit_u8(kExprRefNull); this.emit_heap_type(expr.value); break; + case kExprStructNew: case kExprStructNewWithRtt: + case kExprStructNewDefault: + case kExprStructNewDefaultWithRtt: for (let operand of expr.operands) { this.emit_init_expr_recursive(operand); } this.emit_u8(kGCPrefix); - this.emit_u8(kExprStructNewWithRtt); + this.emit_u8(expr.kind); this.emit_u32v(expr.value); break; case kExprArrayInit: + case kExprArrayInitStatic: for (let operand of expr.operands) { this.emit_init_expr_recursive(operand); } this.emit_u8(kGCPrefix); - this.emit_u8(kExprArrayInit); + this.emit_u8(expr.kind); this.emit_u32v(expr.value); this.emit_u32v(expr.operands.length - 1); break; @@ -1170,9 +1182,21 @@ class WasmInitExpr { static StructNewWithRtt(type, args) { return {kind: kExprStructNewWithRtt, value: type, operands: args}; } + static StructNew(type, args) { + return {kind: kExprStructNew, value: type, operands: args}; + } + static StructNewDefaultWithRtt(type, rtt) { + return {kind: kExprStructNewDefaultWithRtt, value: type, operands: [rtt]}; + } + static StructNewDefault(type) { + return {kind: kExprStructNewDefault, value: type, operands: []}; + } static ArrayInit(type, args) { return {kind: kExprArrayInit, value: type, operands: args}; } + static ArrayInitStatic(type, args) { + return {kind: kExprArrayInitStatic, value: type, operands: args}; + } static RttCanon(type) { return {kind: kExprRttCanon, value: type}; } @@ -1256,11 +1280,11 @@ class WasmStruct { } } -class WasmStructExtending extends WasmStruct { +class WasmStructSubtype extends WasmStruct { constructor(fields, supertype_idx) { super(fields); this.supertype = supertype_idx; - this.type_form = kWasmStructExtendingTypeForm; + this.type_form = kWasmStructSubtypeForm; } } @@ -1273,11 +1297,11 @@ class WasmArray { } } -class WasmArrayExtending extends WasmArray { +class WasmArraySubtype extends WasmArray { constructor(type, mutability, supertype_idx) { super(type, mutability); this.supertype = supertype_idx; - this.type_form = kWasmArrayExtendingTypeForm; + this.type_form = kWasmArraySubtypeForm; } } class WasmElemSegment { @@ -1402,8 +1426,9 @@ class WasmModuleBuilder { return this.types.length - 1; } - addStructExtending(fields, supertype_idx) { - this.types.push(new WasmStructExtending(fields, supertype_idx)); + kGenericSuperType = 0xFFFFFFFE; + addStructSubtype(fields, supertype_idx = this.kGenericSuperType) { + this.types.push(new WasmStructSubtype(fields, supertype_idx)); return this.types.length - 1; } @@ -1412,8 +1437,8 @@ class WasmModuleBuilder { return this.types.length - 1; } - addArrayExtending(type, mutability, supertype_idx) { - this.types.push(new WasmArrayExtending(type, mutability, supertype_idx)); + addArraySubtype(type, mutability, supertype_idx = this.kGenericSuperType) { + this.types.push(new WasmArraySubtype(type, mutability, supertype_idx)); return this.types.length - 1; } @@ -1651,15 +1676,23 @@ class WasmModuleBuilder { section.emit_type(field.type); section.emit_u8(field.mutability ? 1 : 0); } - if (type instanceof WasmStructExtending) { - section.emit_u32v(type.supertype); + if (type instanceof WasmStructSubtype) { + if (type.supertype === this.kGenericSuperType) { + section.emit_u8(kDataRefCode); + } else { + section.emit_heap_type(type.supertype); + } } } else if (type instanceof WasmArray) { section.emit_u8(type.type_form); section.emit_type(type.type); section.emit_u8(type.mutability ? 1 : 0); - if (type instanceof WasmArrayExtending) { - section.emit_u32v(type.supertype); + if (type instanceof WasmArraySubtype) { + if (type.supertype === this.kGenericSuperType) { + section.emit_u8(kDataRefCode); + } else { + section.emit_heap_type(type.supertype); + } } } else { section.emit_u8(kWasmFunctionTypeForm); |