Reviewers: Sven, Lasse Reichstein, Vyacheslav Egorov, Erik Corry,
Message:
Follow-up to the comments in http://codereview.chromium.org/7741041/
Unfortunately, I have no idea how to create a test case that switches to the
crankshaft profiler while regexp code is executing and invoke the GC so
that the
return address has to be recomputed.
Description:
Fix for a possible bug in RegExp stack guard.
Please review this at http://codereview.chromium.org/7744051/
SVN Base: https://v8.googlecode.com/svn/branches/bleeding_edge
Affected files:
M src/arm/regexp-macro-assembler-arm.cc
M src/ia32/regexp-macro-assembler-ia32.cc
M src/x64/regexp-macro-assembler-x64.cc
Index: src/arm/regexp-macro-assembler-arm.cc
diff --git a/src/arm/regexp-macro-assembler-arm.cc
b/src/arm/regexp-macro-assembler-arm.cc
index
81645c72eac8c32aca1901c014bc578a8724f013..cd76edbf15e7ad2d5a76d2f21397a4eff86067f7
100644
--- a/src/arm/regexp-macro-assembler-arm.cc
+++ b/src/arm/regexp-macro-assembler-arm.cc
@@ -1049,7 +1049,7 @@ int
RegExpMacroAssemblerARM::CheckStackGuardState(Address* return_address,
MaybeObject* result = Execution::HandleStackGuardInterrupt();
if (*code_handle != re_code) { // Return address no longer valid
- int delta = *code_handle - re_code;
+ int delta = code_handle->address() - re_code->address();
// Overwrite the return address on the stack.
*return_address += delta;
}
Index: src/ia32/regexp-macro-assembler-ia32.cc
diff --git a/src/ia32/regexp-macro-assembler-ia32.cc
b/src/ia32/regexp-macro-assembler-ia32.cc
index
7d7de0ef44fb7d61b87080ae968aee9fdbbcaa3e..d175d9e03667514f9ebda73216c12262a3404ea2
100644
--- a/src/ia32/regexp-macro-assembler-ia32.cc
+++ b/src/ia32/regexp-macro-assembler-ia32.cc
@@ -1080,7 +1080,7 @@ int
RegExpMacroAssemblerIA32::CheckStackGuardState(Address* return_address,
MaybeObject* result = Execution::HandleStackGuardInterrupt();
if (*code_handle != re_code) { // Return address no longer valid
- int delta = *code_handle - re_code;
+ int delta = code_handle->address() - re_code->address();
// Overwrite the return address on the stack.
*return_address += delta;
}
Index: src/x64/regexp-macro-assembler-x64.cc
diff --git a/src/x64/regexp-macro-assembler-x64.cc
b/src/x64/regexp-macro-assembler-x64.cc
index
7f804477f3a405609bea79237c806bb0675cf6f2..a782bd7052c0fc866709b58b3fd33b292a028338
100644
--- a/src/x64/regexp-macro-assembler-x64.cc
+++ b/src/x64/regexp-macro-assembler-x64.cc
@@ -1185,7 +1185,7 @@ int
RegExpMacroAssemblerX64::CheckStackGuardState(Address* return_address,
MaybeObject* result = Execution::HandleStackGuardInterrupt();
if (*code_handle != re_code) { // Return address no longer valid
- intptr_t delta = *code_handle - re_code;
+ intptr_t delta = code_handle->address() - re_code->address();
// Overwrite the return address on the stack.
*return_address += delta;
}
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev