Fix non-simulated ARM calling of RegExp code.

Review URL: http://codereview.chromium.org/6526043

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@6805 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
This commit is contained in:
lrn@chromium.org 2011-02-16 09:18:19 +00:00
parent 7de60ef84d
commit abbcadf221
4 changed files with 23 additions and 14 deletions

View File

@ -48,10 +48,16 @@ namespace internal {
#define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \ #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \
(entry(p0, p1, p2, p3, p4)) (entry(p0, p1, p2, p3, p4))
// Call the generated regexp code directly. The entry function pointer should typedef int (*arm_regexp_matcher)(String*, int, const byte*, const byte*,
// expect seven int/pointer sized arguments and return an int. void*, int*, Address, int);
// Call the generated regexp code directly. The code at the entry address
// should act as a function matching the type arm_regexp_matcher.
// The fifth argument is a dummy that reserves the space used for
// the return address added by the ExitFrame in native calls.
#define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \ #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \
(entry(p0, p1, p2, p3, NULL, p4, p5, p6)) (FUNCTION_CAST<arm_regexp_matcher>(entry)(p0, p1, p2, p3, NULL, p4, p5, p6))
#define TRY_CATCH_FROM_ADDRESS(try_catch_address) \ #define TRY_CATCH_FROM_ADDRESS(try_catch_address) \
(reinterpret_cast<TryCatch*>(try_catch_address)) (reinterpret_cast<TryCatch*>(try_catch_address))
@ -362,8 +368,7 @@ class Simulator {
FUNCTION_ADDR(entry), 5, p0, p1, p2, p3, p4)) FUNCTION_ADDR(entry), 5, p0, p1, p2, p3, p4))
#define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \ #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \
Simulator::current()->Call( \ Simulator::current()->Call(entry, 8, p0, p1, p2, p3, NULL, p4, p5, p6)
FUNCTION_ADDR(entry), 8, p0, p1, p2, p3, NULL, p4, p5, p6)
#define TRY_CATCH_FROM_ADDRESS(try_catch_address) \ #define TRY_CATCH_FROM_ADDRESS(try_catch_address) \
try_catch_address == \ try_catch_address == \

View File

@ -38,10 +38,15 @@ namespace internal {
#define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \ #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \
(entry(p0, p1, p2, p3, p4)) (entry(p0, p1, p2, p3, p4))
// Call the generated regexp code directly. The entry function pointer should
typedef int (*regexp_matcher)(String*, int, const byte*,
const byte*, int*, Address, int);
// Call the generated regexp code directly. The code at the entry address should
// expect seven int/pointer sized arguments and return an int. // expect seven int/pointer sized arguments and return an int.
#define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \ #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \
(entry(p0, p1, p2, p3, p4, p5, p6)) (FUNCTION_CAST<regexp_matcher>(entry)(p0, p1, p2, p3, p4, p5, p6))
#define TRY_CATCH_FROM_ADDRESS(try_catch_address) \ #define TRY_CATCH_FROM_ADDRESS(try_catch_address) \
(reinterpret_cast<TryCatch*>(try_catch_address)) (reinterpret_cast<TryCatch*>(try_catch_address))

View File

@ -154,16 +154,12 @@ NativeRegExpMacroAssembler::Result NativeRegExpMacroAssembler::Execute(
const byte* input_start, const byte* input_start,
const byte* input_end, const byte* input_end,
int* output) { int* output) {
typedef int (*matcher)(String*, int, const byte*,
const byte*, int*, Address, int);
matcher matcher_func = FUNCTION_CAST<matcher>(code->entry());
// Ensure that the minimum stack has been allocated. // Ensure that the minimum stack has been allocated.
RegExpStack stack; RegExpStack stack;
Address stack_base = RegExpStack::stack_base(); Address stack_base = RegExpStack::stack_base();
int direct_call = 0; int direct_call = 0;
int result = CALL_GENERATED_REGEXP_CODE(matcher_func, int result = CALL_GENERATED_REGEXP_CODE(code->entry(),
input, input,
start_offset, start_offset,
input_start, input_start,

View File

@ -39,10 +39,13 @@ namespace internal {
#define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \ #define CALL_GENERATED_CODE(entry, p0, p1, p2, p3, p4) \
(entry(p0, p1, p2, p3, p4)) (entry(p0, p1, p2, p3, p4))
// Call the generated regexp code directly. The entry function pointer should typedef int (*regexp_matcher)(String*, int, const byte*,
const byte*, int*, Address, int);
// Call the generated regexp code directly. The code at the entry address should
// expect seven int/pointer sized arguments and return an int. // expect seven int/pointer sized arguments and return an int.
#define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \ #define CALL_GENERATED_REGEXP_CODE(entry, p0, p1, p2, p3, p4, p5, p6) \
(entry(p0, p1, p2, p3, p4, p5, p6)) (FUNCTION_CAST<regexp_matcher>(entry)(p0, p1, p2, p3, p4, p5, p6))
#define TRY_CATCH_FROM_ADDRESS(try_catch_address) \ #define TRY_CATCH_FROM_ADDRESS(try_catch_address) \
(reinterpret_cast<TryCatch*>(try_catch_address)) (reinterpret_cast<TryCatch*>(try_catch_address))