128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Copyright 2012 the V8 project authors. All rights reserved.
228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// Redistribution and use in source and binary forms, with or without
328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// modification, are permitted provided that the following conditions are
428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// met:
528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//
628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//     * Redistributions of source code must retain the above copyright
728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       notice, this list of conditions and the following disclaimer.
828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//     * Redistributions in binary form must reproduce the above
928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       copyright notice, this list of conditions and the following
1028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       disclaimer in the documentation and/or other materials provided
1128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       with the distribution.
1228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//     * Neither the name of Google Inc. nor the names of its
1328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       contributors may be used to endorse or promote products derived
1428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//       from this software without specific prior written permission.
1528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org//
1628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
1828faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
1928faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2028faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2328faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2428faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2528faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2628faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2728faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
28ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfunction oneMatch(re) {
29ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  "abcd".replace(re, function() { });
30ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("abcd", RegExp.input);
31ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("a", RegExp.leftContext);
32ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("b", RegExp.lastMatch);
33ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("", RegExp.lastParen);
34ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals(undefined, RegExp.lastIndex);
35ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals(undefined, RegExp.index);
36ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("cd", RegExp.rightContext);
37ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  for (var i = 1; i < 10; i++) {
38ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com    assertEquals("", RegExp['$' + i]);
39ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  }
40ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
4128faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.org
42ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comoneMatch(/b/);
43ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comoneMatch(/b/g);
44ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
45ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com"abcdabcd".replace(/b/g, function() { });
46ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("abcdabcd", RegExp.input);
47ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("abcda", RegExp.leftContext);
48ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("b", RegExp.lastMatch);
49ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("", RegExp.lastParen);
50ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals(undefined, RegExp.lastIndex);
51ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals(undefined, RegExp.index);
5228faa982749c4aa9c090939453dea14bb118f613jkummerow@chromium.orgassertEquals("cd", RegExp.rightContext);
53ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfor (var i = 1; i < 10; i++) {
54ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("", RegExp['$' + i]);
55ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
56ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
57ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfunction captureMatch(re) {
58ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  "abcd".replace(re, function() { });
59ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("abcd", RegExp.input);
60ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("a", RegExp.leftContext);
61ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("bc", RegExp.lastMatch);
62ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("c", RegExp.lastParen);
63ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals(undefined, RegExp.lastIndex);
64ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals(undefined, RegExp.index);
65ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("d", RegExp.rightContext);
66ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals('b', RegExp.$1);
67ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals('c', RegExp.$2);
68ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  for (var i = 3; i < 10; i++) {
69ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com    assertEquals("", RegExp['$' + i]);
70ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  }
71ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
72ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
73ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comcaptureMatch(/(b)(c)/);
74ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comcaptureMatch(/(b)(c)/g);
75ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com
76ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com"abcdabcd".replace(/(b)(c)/g, function() { });
77ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("abcdabcd", RegExp.input);
78ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("abcda", RegExp.leftContext);
79ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("bc", RegExp.lastMatch);
80ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("c", RegExp.lastParen);
81ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals(undefined, RegExp.lastIndex);
82ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals(undefined, RegExp.index);
83ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals("d", RegExp.rightContext);
84ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals('b', RegExp.$1);
85ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comassertEquals('c', RegExp.$2);
86ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.comfor (var i = 3; i < 10; i++) {
87ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com  assertEquals("", RegExp['$' + i]);
88ed49e965b5cafa35395084dbfb79f4e07930f10ferik.corry@gmail.com}
89efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
90efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
91efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgfunction Override() {
92efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // Set the internal lastMatchInfoOverride.  After calling this we do a normal
93efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // match and verify the override was cleared and that we record the new
94efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  // captures.
95efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  "abcdabcd".replace(/(b)(c)/g, function() { });
96efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
97efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
98efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
99efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgfunction TestOverride(input, expect, property, re_src) {
100efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  var re = new RegExp(re_src);
101efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  var re_g = new RegExp(re_src, "g");
102efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
103efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  function OverrideCase(fn) {
104efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    Override();
105efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    fn();
106efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org    assertEquals(expect, RegExp[property]);
107efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  }
108efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
109efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.replace(re, "x"); });
110efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.replace(re_g, "x"); });
111efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.replace(re, ""); });
112efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.replace(re_g, ""); });
113efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.match(re); });
114efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return input.match(re_g); });
115efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return re.test(input); });
116efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  OverrideCase(function() { return re_g.test(input); });
117efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
118efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
119efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar input = "bar.foo baz......";
120efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar re_str = "(ba.).*?f";
121efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgTestOverride(input, "bar", "$1", re_str);
122efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
123efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orginput = "foo bar baz";
124efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar re_str = "bar";
125efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgTestOverride(input, "bar", "$&", re_str);
126efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
127efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
128efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgfunction no_last_match(fn) {
129efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  fn();
130efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org  assertEquals("hestfisk", RegExp.$1);
131efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org}
132efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
133efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org/(hestfisk)/.test("There's no such thing as a hestfisk!");
134efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
135efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgno_last_match(function() { "foo".replace("f", ""); });
136efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgno_last_match(function() { "foo".replace("f", "f"); });
137efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgno_last_match(function() { "foo".split("o"); });
138efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
139efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar base = "In the music.  In the music.  ";
140efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar cons = base + base + base + base;
141efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgno_last_match(function() { cons.replace("x", "y"); });
142efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgno_last_match(function() { cons.replace("e", "E"); });
143efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
144efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
145efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org// Here's one that matches once, then tries to match again, but fails.
146efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org// Verify that the last match info is from the last match, not from the
147efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org// failure that came after.
148efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org"bar.foo baz......".replace(/(ba.).*?f/g, function() { return "x";});
149efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgassertEquals("bar", RegExp.$1);
150efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
151efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
152efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org// A test that initially does a zero width match, but later does a non-zero
153efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org// width match.
154efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgvar a = "foo bar baz".replace(/^|bar/g, "");
155efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgassertEquals("foo  baz", a);
156efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.org
157efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orga = "foo bar baz".replace(/^|bar/g, "*");
158efdb9d70bddd496ceb6a281dadcc065efbce37a1yangguo@chromium.orgassertEquals("*foo * baz", a);
1591044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1601044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// We test FilterASCII using regexps that will backtrack forever.  Since
1611044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// a regexp with a non-ASCII character in it can never match an ASCII
1621044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// string we can test that the relevant node is removed by verifying that
1631044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org// there is no hang.
1641044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgfunction NoHang(re) {
1651044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org  "This is an ASCII string that could take forever".match(re);
1661044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org}
1671044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
16859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(((.*)*)*x)Ā/);  // Continuation after loop is filtered, so is loop.
16959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(((.*)*)*Ā)foo/);  // Body of loop filtered.
17059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/Ā(((.*)*)*x)/);   // Everything after a filtered character is filtered.
17159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(((.*)*)*x)Ā/);   // Everything before a filtered character is filtered.
17259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/[ćăĀ](((.*)*)*x)/);   // Everything after a filtered class is filtered.
17359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(((.*)*)*x)[ćăĀ]/);   // Everything before a filtered class is filtered.
17459297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/[^\x00-\xff](((.*)*)*x)/);   // After negated class.
17559297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(((.*)*)*x)[^\x00-\xff]/);   // Before negated class.
17659297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(?!(((.*)*)*x)Ā)foo/);  // Negative lookahead is filtered.
17759297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(?!(((.*)*)*x))Ā/);  // Continuation branch of negative lookahead.
17859297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(?=(((.*)*)*x)Ā)foo/);  // Positive lookahead is filtered.
17959297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(?=(((.*)*)*x))Ā/);  // Continuation branch of positive lookahead.
18059297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(?=Ā)(((.*)*)*x)/);  // Positive lookahead also prunes continuation.
18159297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(æ|ø|Ā)(((.*)*)*x)/);  // All branches of alternation are filtered.
18259297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(a|b|(((.*)*)*x))Ā/);  // 1 out of 3 branches pruned.
18359297c735ad2a41156ae9c723a39ff259ad061e0jkummerow@chromium.orgNoHang(/(a|(((.*)*)*x)ă|(((.*)*)*x)Ā)/);  // 2 out of 3 branches pruned.
1841044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.org
1851044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgvar s = "Don't prune based on a repetition of length 0";
1861044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals(null, s.match(/å{1,1}prune/));
1871044a4d5f9e933d03cf05a0d7d49d8afccec0879danno@chromium.orgassertEquals("prune", (s.match(/å{0,0}prune/)[0]));
1882c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1892c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org// Some very deep regexps where FilterASCII gives up in order not to make the
1902c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org// stack overflow.
1912c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar regex6 = /a*\u0100*\w/;
1922c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar input0 = "a";
1932c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgregex6.exec(input0);
1942c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1952c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar re = "\u0100*\\w";
1962c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1972c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgfor (var i = 0; i < 200; i++) re = "a*" + re;
1982c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
1992c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar regex7 = new RegExp(re);
2002c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgregex7.exec(input0);
2012c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
2022c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar regex8 = new RegExp(re, "i");
2032c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgregex8.exec(input0);
2042c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
2052c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgre = "[\u0100]*\\w";
2062c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgfor (var i = 0; i < 200; i++) re = "a*" + re;
2072c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
2082c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar regex9 = new RegExp(re);
2092c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgregex9.exec(input0);
2102c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.org
2112c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgvar regex10 = new RegExp(re, "i");
2122c26cb18967944507a81a07ac6f1c921ebb4ab75danno@chromium.orgregex10.exec(input0);
213b10deab7527ad052fa030882ebc5e0eb47236e4cdanno@chromium.org
214b10deab7527ad052fa030882ebc5e0eb47236e4cdanno@chromium.orgvar regex11 = /^(?:[^\u0000-\u0080]|[0-9a-z?,.!&\s#()])+$/i;
215b10deab7527ad052fa030882ebc5e0eb47236e4cdanno@chromium.orgregex11.exec(input0);
216b10deab7527ad052fa030882ebc5e0eb47236e4cdanno@chromium.org
21737141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgvar regex12 = /u(\xf0{8}?\D*?|( ? !)$h??(|)*?(||)+?\6((?:\W\B|--\d-*-|)?$){0, }?|^Y( ? !1)\d+)+a/;
21837141398d9125c021d47ceb91e2b19efd35c89ddverwaest@chromium.orgregex12.exec("");
219