summaryrefslogtreecommitdiffstats
path: root/js/src/jit-test/tests/regexp/lastIndex-non-writable.js
diff options
context:
space:
mode:
Diffstat (limited to 'js/src/jit-test/tests/regexp/lastIndex-non-writable.js')
-rw-r--r--js/src/jit-test/tests/regexp/lastIndex-non-writable.js71
1 files changed, 71 insertions, 0 deletions
diff --git a/js/src/jit-test/tests/regexp/lastIndex-non-writable.js b/js/src/jit-test/tests/regexp/lastIndex-non-writable.js
new file mode 100644
index 0000000000..74839762f5
--- /dev/null
+++ b/js/src/jit-test/tests/regexp/lastIndex-non-writable.js
@@ -0,0 +1,71 @@
+function testGlobalExec() {
+ var re = /abc.+de/g;
+ var c = 0;
+ for (var i = 0; i < 100; i++) {
+ re.lastIndex = 0;
+ if (i === 60) {
+ Object.freeze(re);
+ }
+ try {
+ re.exec("abcXdef");
+ } catch (e) {
+ assertEq(e.toString().includes("lastIndex"), true);
+ c++;
+ }
+ assertEq(re.lastIndex, i >= 60 ? 0 : 6);
+ }
+ assertEq(c, 40);
+}
+testGlobalExec();
+
+function testStickyTest() {
+ var re = /abc.+de/y;
+ var c = 0;
+ for (var i = 0; i < 100; i++) {
+ re.lastIndex = 0;
+ if (i === 60) {
+ Object.freeze(re);
+ }
+ try {
+ re.test("abcXdef");
+ } catch (e) {
+ assertEq(e.toString().includes("lastIndex"), true);
+ c++;
+ }
+ assertEq(re.lastIndex, i >= 60 ? 0 : 6);
+ }
+ assertEq(c, 40);
+}
+testStickyTest();
+
+// Must not reset too-large .lastIndex to 0 if non-writable.
+function testLastIndexOutOfRange() {
+ var re = /abc.+de/g;
+ re.lastIndex = 123;
+ Object.freeze(re);
+ for (var i = 0; i < 100; i++) {
+ var ex = null;
+ try {
+ re.exec("abcXdef");
+ } catch (e) {
+ ex = e;
+ }
+ assertEq(ex.toString().includes("lastIndex"), true);
+ assertEq(re.lastIndex, 123);
+ }
+}
+testLastIndexOutOfRange();
+
+// .lastIndex is ignored for non-global/non-sticky regexps.
+function testPlainExec() {
+ var re = /abc.+de/;
+ re.lastIndex = 1234;
+ for (var i = 0; i < 100; i++) {
+ if (i === 60) {
+ Object.freeze(re);
+ }
+ assertEq(re.exec("abcXdef")[0], "abcXde");
+ assertEq(re.lastIndex, 1234);
+ }
+}
+testPlainExec();