d4febb6b46
We fall back from irregexp to the experimental engine if a backtrack limit is exceeded and the experimental engine can handle the regexp. The feature can be turned on with a boolean flag, and an uint-valued flag controls the default backtrack limit. For regexps that are constructed with an explicit backtrack limit (API, %NewRegExpWithBacktrackLimit), we choose the lower of the explicit and default backtrack limits. The default backtrack limit does not apply to regexps that can't be handled by the experimental engine, and for such regexps an explicitly specified backtrack limit is handled as before by returning null if we exceed it. Cq-Include-Trybots: luci.v8.try:v8_linux64_fyi_rel_ng Bug: v8:10765 Change-Id: I580df79bd847520985b6c2c2159bc427315c89d1 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2436341 Commit-Queue: Martin Bidlingmaier <mbid@google.com> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Cr-Commit-Position: refs/heads/master@{#70500}
38 lines
1.6 KiB
JavaScript
38 lines
1.6 KiB
JavaScript
// 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));
|