| // 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. |
| |
| // Flags: --allow-natives-syntax |
| // Flags: --no-enable-experimental-regexp-engine |
| // Flags: --enable-experimental-regexp-engine-on-excessive-backtracks |
| // Flags: --regexp-tier-up --regexp-tier-up-ticks 1 |
| |
| // We should report accurate results on patterns for which irregexp suffers |
| // from catastrophic backtracking. |
| let regexp = new RegExp("a+".repeat(100) + "x"); |
| let match = "a".repeat(100) + "x"; |
| let subject = match.repeat(3); |
| |
| // First for the irregexp interpreter: |
| assertArrayEquals([match], regexp.exec(subject)); |
| // Now for native irregexp: |
| assertArrayEquals([match], regexp.exec(subject)); |
| |
| // Now the same again with String.replace and a replacement function to |
| // exercise the RegExpGlobalCache. |
| regexp = new RegExp(regexp.source, "g"); |
| assertEquals("", subject.replace(regexp, function () { return ""; })); |
| assertEquals("", subject.replace(regexp, function () { return ""; })); |
| |
| // If an explicit backtrack limit is larger than the default, then we should |
| // take the default limit. |
| regexp = %NewRegExpWithBacktrackLimit(regexp.source, "", 1000000000) |
| assertArrayEquals([match], regexp.exec(subject)); |
| assertArrayEquals([match], regexp.exec(subject)); |
| |
| // If the experimental engine can't handle a regexp with an explicit backtrack |
| // limit, we should abort and return null on excessive backtracking. |
| regexp = %NewRegExpWithBacktrackLimit(regexp.source + "(?=a)", "", 100) |
| assertEquals(null, regexp.exec(subject)); |
| assertEquals(null, regexp.exec(subject)); |