summaryrefslogtreecommitdiff
path: root/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/test/mjsunit/regexp-tier-up-multiple.js')
-rw-r--r--deps/v8/test/mjsunit/regexp-tier-up-multiple.js101
1 files changed, 101 insertions, 0 deletions
diff --git a/deps/v8/test/mjsunit/regexp-tier-up-multiple.js b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
new file mode 100644
index 0000000000..7325b341d0
--- /dev/null
+++ b/deps/v8/test/mjsunit/regexp-tier-up-multiple.js
@@ -0,0 +1,101 @@
+// 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.
+
+// Tier-up behavior differs between slow and fast paths in
+// RegExp.prototype.replace with a function as an argument.
+// Flags: --regexp-tier-up --regexp-tier-up-ticks=5
+// Flags: --allow-natives-syntax --no-force-slow-path --no-regexp-interpret-all
+
+const kLatin1 = true;
+const kUnicode = false;
+
+function CheckRegexpNotYetCompiled(regexp) {
+ assertFalse(%RegexpHasBytecode(regexp, kLatin1) &&
+ %RegexpHasNativeCode(regexp, kLatin1));
+ assertFalse(%RegexpHasBytecode(regexp, kUnicode) &&
+ %RegexpHasNativeCode(regexp, kUnicode));
+}
+
+// Testing RegExp.test method which calls into Runtime_RegExpExec.
+let re = new RegExp('^.$');
+CheckRegexpNotYetCompiled(re);
+
+// Testing first five executions of regexp with one-byte string subject.
+for (var i = 0; i < 5; i++) {
+ re.test("a");
+ assertTrue(%RegexpHasBytecode(re, kLatin1));
+ assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ !%RegexpHasNativeCode(re, kUnicode));
+}
+// Testing the tier-up to native code.
+re.test("a");
+assertTrue(!%RegexpHasBytecode(re, kLatin1) &&
+ %RegexpHasNativeCode(re,kLatin1));
+assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ !%RegexpHasNativeCode(re,kUnicode));
+re.test("a");
+assertTrue(!%RegexpHasBytecode(re, kLatin1) &&
+ %RegexpHasNativeCode(re,kLatin1));
+assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ !%RegexpHasNativeCode(re,kUnicode));
+// Testing that the regexp will compile to native code for two-byte string
+// subject as well, because we have a single tick counter for both string
+// representations.
+re.test("π");
+assertTrue(!%RegexpHasBytecode(re, kLatin1) &&
+ %RegexpHasNativeCode(re,kLatin1));
+assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ %RegexpHasNativeCode(re,kUnicode));
+
+// Testing String.replace method for non-global regexps.
+var subject = "a1111";
+re = /\w1/;
+CheckRegexpNotYetCompiled(re);
+
+for (var i = 0; i < 5; i++) {
+ subject.replace(re, "x");
+ assertTrue(%RegexpHasBytecode(re, kLatin1));
+ assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ !%RegexpHasNativeCode(re, kUnicode));
+}
+
+subject.replace(re, "x");
+assertTrue(!%RegexpHasBytecode(re, kLatin1) &&
+ %RegexpHasNativeCode(re, kLatin1));
+assertTrue(!%RegexpHasBytecode(re, kUnicode) &&
+ !%RegexpHasNativeCode(re, kUnicode));
+
+// Testing String.replace method for global regexps.
+let re_g = /\w11111/g;
+CheckRegexpNotYetCompiled(re_g);
+// This regexp will not match, so it will only execute the bytecode once,
+// each time the replace method is invoked, without tiering-up and
+// recompiling to native code.
+for (var i = 0; i < 5; i++) {
+ subject.replace(re_g, "x");
+ assertTrue(%RegexpHasBytecode(re_g, kLatin1));
+ assertTrue(!%RegexpHasBytecode(re_g, kUnicode) &&
+ !%RegexpHasNativeCode(re_g, kUnicode));
+}
+
+// This regexp will match, so it will execute five times, and tier-up.
+re_g = /\w/g;
+CheckRegexpNotYetCompiled(re_g);
+subject.replace(re_g, "x");
+assertTrue(!%RegexpHasBytecode(re_g, kLatin1) &&
+ %RegexpHasNativeCode(re_g, kLatin1));
+assertTrue(!%RegexpHasBytecode(re_g, kUnicode) &&
+ !%RegexpHasNativeCode(re_g, kUnicode));
+
+// Testing String.replace method for global regexps with a function as a
+// parameter. This will tier-up eagerly and compile to native code right
+// away, even though the regexp is only executed once.
+function f() { return "x"; }
+re_g = /\w2/g;
+CheckRegexpNotYetCompiled(re_g);
+subject.replace(re_g, f);
+assertTrue(!%RegexpHasBytecode(re_g, kLatin1) &&
+ %RegexpHasNativeCode(re_g, kLatin1));
+assertTrue(!%RegexpHasBytecode(re_g, kUnicode) &&
+ !%RegexpHasNativeCode(re_g, kUnicode));