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:
parent
7de60ef84d
commit
abbcadf221
@ -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 == \
|
||||||
|
@ -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))
|
||||||
|
@ -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,
|
||||||
|
@ -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))
|
||||||
|
Loading…
Reference in New Issue
Block a user