summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/ion/recover-newstringiterator.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/ion/recover-newstringiterator.js')
-rw-r--r--js/src/jit-test/tests/ion/recover-newstringiterator.js66
1 files changed, 66 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/ion/recover-newstringiterator.js b/js/src/jit-test/tests/ion/recover-newstringiterator.js
new file mode 100644
index 0000000000..14a7d46b6e
--- /dev/null
+++ b/js/src/jit-test/tests/ion/recover-newstringiterator.js
@@ -0,0 +1,66 @@
+var max = 40;
+setJitCompilerOption("ion.warmup.trigger", max - 10);
+
+// Prevent the GC from cancelling Ion compilations, when we expect them to succeed
+gczeal(0);
+
+function selfhosted() {
+ if (typeof getSelfHostedValue === "undefined")
+ return;
+
+ var NewStringIterator = getSelfHostedValue("NewStringIterator");
+ var iter = NewStringIterator();
+ bailout();
+ // assertRecoveredOnBailout(iter, true);
+}
+
+function iterator(i) {
+ var string = String.fromCharCode(0x41, i);
+ var iter = string[Symbol.iterator]();
+ assertEq(iter.next().value, 'A');
+ bailout();
+ // This sometimes fails
+ // assertRecoveredOnBailout(iter, true);
+ var result = iter.next();
+ assertEq(result.value, String.fromCharCode(i));
+ assertEq(result.done, false);
+ assertEq(iter.next().done, true);
+}
+
+function forof(i) {
+ var string = String.fromCharCode(0x41, i);
+ var first = true;
+
+ for (var x of string) {
+ if (first) {
+ assertEq(x, 'A');
+ bailout();
+ first = false;
+ } else {
+ assertEq(x, String.fromCharCode(i));
+ }
+ }
+}
+
+var data = {
+ a: 'foo',
+ b: {c: 'd'},
+ str: 'ABC'
+};
+
+function fn() {
+ var {a, b:{c:b}, str:[, c]} = data;
+ return c;
+}
+
+function destructuring() {
+ for (var i = 0; i < max; i++)
+ assertEq(fn(), 'B');
+}
+
+for (var i = 0; i < max; i++) {
+ selfhosted();
+ iterator(i);
+ forof(i);
+ destructuring();
+}