[regexp] Refactor eager tier-up for global replaces

This CL changes the eager tier-up for global replaces slightly to include a
previously unaccounted for path by moving the logic into the caller so that
it includes this path as well.

Change-Id: Ifc265ddb1183b8bb3ea75ca5d6c83d66e55e2837
Bug: v8:9566
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1829276
Commit-Queue: Ana Pesko <anapesko@google.com>
Reviewed-by: Peter Marshall <petermarshall@chromium.org>
Cr-Commit-Position: refs/heads/master@{#64042}
This commit is contained in:
Ana Peško 2019-09-30 15:09:31 +02:00 committed by Commit Bot
parent 8de672cbe8
commit 95ec4803fd

View File

@ -613,20 +613,6 @@ V8_WARN_UNUSED_RESULT static Object StringReplaceGlobalRegExpWithString(
JSRegExp::Type typeTag = regexp->TypeTag(); JSRegExp::Type typeTag = regexp->TypeTag();
if (typeTag == JSRegExp::IRREGEXP) { if (typeTag == JSRegExp::IRREGEXP) {
// Force tier up to native code for global replaces. The global replace is
// implemented differently for native code and bytecode execution, where the
// native code expects an array to store all the matches, and the bytecode
// matches one at a time, so it's easier to tier-up to native code from the
// start.
if (FLAG_regexp_tier_up) {
regexp->MarkTierUpForNextExec();
if (FLAG_trace_regexp_tier_up) {
PrintF(
"Forcing tier-up of JSRegExp object %p in "
"StringReplaceGlobalRegExpWithString\n",
reinterpret_cast<void*>(regexp->ptr()));
}
}
// Ensure the RegExp is compiled so we can access the capture-name map. // Ensure the RegExp is compiled so we can access the capture-name map.
if (RegExp::IrregexpPrepare(isolate, regexp, subject) == -1) { if (RegExp::IrregexpPrepare(isolate, regexp, subject) == -1) {
DCHECK(isolate->has_pending_exception()); DCHECK(isolate->has_pending_exception());
@ -1349,6 +1335,19 @@ V8_WARN_UNUSED_RESULT MaybeHandle<String> RegExpReplace(
RETURN_ON_EXCEPTION(isolate, RegExpUtils::SetLastIndex(isolate, regexp, 0), RETURN_ON_EXCEPTION(isolate, RegExpUtils::SetLastIndex(isolate, regexp, 0),
String); String);
// Force tier up to native code for global replaces. The global replace is
// implemented differently for native code and bytecode execution, where the
// native code expects an array to store all the matches, and the bytecode
// matches one at a time, so it's easier to tier-up to native code from the
// start.
if (FLAG_regexp_tier_up && regexp->TypeTag() == JSRegExp::IRREGEXP) {
regexp->MarkTierUpForNextExec();
if (FLAG_trace_regexp_tier_up) {
PrintF("Forcing tier-up of JSRegExp object %p in RegExpReplace\n",
reinterpret_cast<void*>(regexp->ptr()));
}
}
if (replace->length() == 0) { if (replace->length() == 0) {
if (string->IsOneByteRepresentation()) { if (string->IsOneByteRepresentation()) {
Object result = Object result =