summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit')
-rw-r--r--deps/v8/test/mjsunit/compiler/bigint-add-no-deopt-loop.js4
-rw-r--r--deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-4.js2
-rw-r--r--deps/v8/test/mjsunit/compiler/call-with-arraylike-or-spread-7.js1
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-crbug-1228407.js24
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-crbug-1234764.js21
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-crbug-1234770.js14
-rw-r--r--deps/v8/test/mjsunit/compiler/regress-crbug-1247763.js30
-rw-r--r--deps/v8/test/mjsunit/es6/map-constructor-entry-side-effect2.js6
-rw-r--r--deps/v8/test/mjsunit/es6/regress/regress-5929-1.js4
-rw-r--r--deps/v8/test/mjsunit/harmony/private-brand-checks.js5
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-emoji-flag-sequence-generated.js270
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-emoji-keycap-sequence-generated.js24
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-emoji-modifier-sequence-generated.js541
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-emoji-tag-sequence-generated.js15
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-emoji-zwj-sequence-generated.js915
-rw-r--r--deps/v8/test/mjsunit/harmony/regexp-property-sequence.js88
-rw-r--r--deps/v8/test/mjsunit/ic-migrated-map-add-when-monomorphic.js3
-rw-r--r--deps/v8/test/mjsunit/json.js5
-rw-r--r--deps/v8/test/mjsunit/mjsunit.status36
-rw-r--r--deps/v8/test/mjsunit/regress/asm/regress-1248677.js24
-rw-r--r--deps/v8/test/mjsunit/regress/asm/regress-1252747.js27
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1016450.js4
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1073440.js4
-rw-r--r--deps/v8/test/mjsunit/regress/regress-12256.js54
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1238033.js6
-rw-r--r--deps/v8/test/mjsunit/regress/regress-1254191.js18
-rw-r--r--deps/v8/test/mjsunit/regress/regress-353004.js17
-rw-r--r--deps/v8/test/mjsunit/regress/regress-9441.js4
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-1248704.js12
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-1249941.js16
-rw-r--r--deps/v8/test/mjsunit/regress/regress-crbug-1254704.js5
-rw-r--r--deps/v8/test/mjsunit/regress/regress-v8-10602.js5
-rw-r--r--deps/v8/test/mjsunit/regress/regress-v8-12194.js74
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1237024.js2
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1239116.js19
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1239116b.js19
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1248024.js20
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1251465.js26
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1254674.js11
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1254675.js30
-rw-r--r--deps/v8/test/mjsunit/regress/wasm/regress-1255354.js26
-rw-r--r--deps/v8/test/mjsunit/resizablearraybuffer-growablesharedarraybuffer.js92
-rw-r--r--deps/v8/test/mjsunit/tools/tickprocessor-test-large.log2
-rw-r--r--deps/v8/test/mjsunit/typedarray-growablesharedarraybuffer.js697
-rw-r--r--deps/v8/test/mjsunit/typedarray-helpers.js47
-rw-r--r--deps/v8/test/mjsunit/typedarray-resizablearraybuffer-detach.js186
-rw-r--r--deps/v8/test/mjsunit/typedarray-resizablearraybuffer.js1272
-rw-r--r--deps/v8/test/mjsunit/wasm/array-copy-benchmark.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/externref-table.js44
-rw-r--r--deps/v8/test/mjsunit/wasm/gc-nominal.js59
-rw-r--r--deps/v8/test/mjsunit/wasm/inlining.js288
-rw-r--r--deps/v8/test/mjsunit/wasm/js-api.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/load-elimination.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/module-memory.js26
-rw-r--r--deps/v8/test/mjsunit/wasm/mutable-globals.js6
-rw-r--r--deps/v8/test/mjsunit/wasm/prototype.js42
-rw-r--r--deps/v8/test/mjsunit/wasm/reference-globals.js30
-rw-r--r--deps/v8/test/mjsunit/wasm/shared-memory-gc-stress.js3
-rw-r--r--deps/v8/test/mjsunit/wasm/shared-memory-worker-explicit-gc-stress.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/table-fill.js4
-rw-r--r--deps/v8/test/mjsunit/wasm/table-grow-from-wasm.js2
-rw-r--r--deps/v8/test/mjsunit/wasm/table.js16
-rw-r--r--deps/v8/test/mjsunit/wasm/type-reflection-with-externref.js10
-rw-r--r--deps/v8/test/mjsunit/wasm/type-reflection.js125
-rw-r--r--deps/v8/test/mjsunit/wasm/wasm-gc-js-roundtrip.js6
-rw-r--r--deps/v8/test/mjsunit/wasm/wasm-module-builder.js73
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);