[regexp] Skip interrupt handling if none exist
During regexp execution we usually do not expect any interrupts to exist. This optimization doubles Octane/RegExp scores with --regexp-interpret-all. Drive-by: Do the same for irregexp stack checks (only applicable when called through the runtime). Drive-by: Slightly more specific AllowHeapAllocation scopes. Bug: v8:7777, v8:9328, v8:9330 Change-Id: I502d54d49a1267dee4b8a086dc6c2dca318a2d97 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1645313 Commit-Queue: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Yang Guo <yangguo@chromium.org> Cr-Commit-Position: refs/heads/master@{#62000}
This commit is contained in:
parent
ce23fd6400
commit
3416e1c11d
@ -165,28 +165,30 @@ IrregexpInterpreter::Result HandleInterrupts(Isolate* isolate,
|
||||
|
||||
StackLimitCheck check(isolate);
|
||||
if (check.JsHasOverflowed()) {
|
||||
// A real stack overflow.
|
||||
return StackOverflow(isolate);
|
||||
return StackOverflow(isolate); // A real stack overflow.
|
||||
}
|
||||
|
||||
const bool was_one_byte =
|
||||
String::IsOneByteRepresentationUnderneath(*subject_string);
|
||||
// Handle interrupts if any exist.
|
||||
if (check.InterruptRequested()) {
|
||||
const bool was_one_byte =
|
||||
String::IsOneByteRepresentationUnderneath(*subject_string);
|
||||
|
||||
Object result;
|
||||
{
|
||||
AllowHeapAllocation yes_gc;
|
||||
result = isolate->stack_guard()->HandleInterrupts();
|
||||
}
|
||||
Object result;
|
||||
{
|
||||
AllowHeapAllocation yes_gc;
|
||||
result = isolate->stack_guard()->HandleInterrupts();
|
||||
}
|
||||
|
||||
if (result.IsException(isolate)) {
|
||||
return IrregexpInterpreter::EXCEPTION;
|
||||
}
|
||||
if (result.IsException(isolate)) {
|
||||
return IrregexpInterpreter::EXCEPTION;
|
||||
}
|
||||
|
||||
// If we changed between a LATIN1 and a UC16 string, we need to restart
|
||||
// regexp matching with the appropriate template instantiation of RawMatch.
|
||||
if (String::IsOneByteRepresentationUnderneath(*subject_string) !=
|
||||
was_one_byte) {
|
||||
return IrregexpInterpreter::RETRY;
|
||||
// If we changed between a LATIN1 and a UC16 string, we need to restart
|
||||
// regexp matching with the appropriate template instantiation of RawMatch.
|
||||
if (String::IsOneByteRepresentationUnderneath(*subject_string) !=
|
||||
was_one_byte) {
|
||||
return IrregexpInterpreter::RETRY;
|
||||
}
|
||||
}
|
||||
|
||||
return IrregexpInterpreter::SUCCESS;
|
||||
|
@ -133,7 +133,8 @@ int NativeRegExpMacroAssembler::CheckStackGuardState(
|
||||
Isolate* isolate, int start_index, bool is_direct_call,
|
||||
Address* return_address, Code re_code, Address* subject,
|
||||
const byte** input_start, const byte** input_end) {
|
||||
AllowHeapAllocation allow_allocation;
|
||||
DisallowHeapAllocation no_gc;
|
||||
|
||||
DCHECK(re_code.raw_instruction_start() <= *return_address);
|
||||
DCHECK(*return_address <= re_code.raw_instruction_end());
|
||||
int return_value = 0;
|
||||
@ -154,15 +155,15 @@ int NativeRegExpMacroAssembler::CheckStackGuardState(
|
||||
// forcing the call through the runtime system.
|
||||
return_value = js_has_overflowed ? EXCEPTION : RETRY;
|
||||
} else if (js_has_overflowed) {
|
||||
AllowHeapAllocation yes_gc;
|
||||
isolate->StackOverflow();
|
||||
return_value = EXCEPTION;
|
||||
} else {
|
||||
} else if (check.InterruptRequested()) {
|
||||
AllowHeapAllocation yes_gc;
|
||||
Object result = isolate->stack_guard()->HandleInterrupts();
|
||||
if (result.IsException(isolate)) return_value = EXCEPTION;
|
||||
}
|
||||
|
||||
DisallowHeapAllocation no_gc;
|
||||
|
||||
if (*code_handle != re_code) { // Return address no longer valid
|
||||
intptr_t delta = code_handle->address() - re_code.address();
|
||||
// Overwrite the return address on the stack.
|
||||
|
Loading…
Reference in New Issue
Block a user