Index: src/assembler.h |
=================================================================== |
--- src/assembler.h (revision 3427) |
+++ src/assembler.h (working copy) |
@@ -363,6 +363,13 @@ |
typedef void* ExternalReferenceRedirector(void* original, bool fp_return); |
+class BasicAssemblerData { |
+ public: |
+ ExternalReferenceRedirector* redirector_; |
+ protected: |
+ BasicAssemblerData() |
+ :redirector_(NULL) {} |
+}; |
// An ExternalReference represents a C++ address used in the generated |
// code. All references to C++ functions and variables must be encapsulated in |
@@ -459,28 +466,32 @@ |
// This lets you register a function that rewrites all external references. |
// Used by the ARM simulator to catch calls to external references. |
static void set_redirector(ExternalReferenceRedirector* redirector) { |
- ASSERT(redirector_ == NULL); // We can't stack them. |
- redirector_ = redirector; |
+ ExternalReferenceRedirector* & current_redirector = |
+ reinterpret_cast<BasicAssemblerData*>(v8_context()->assembler_data_)-> |
+ redirector_; |
+ ASSERT(current_redirector == NULL); // We can't stack them. |
+ current_redirector = redirector; |
} |
private: |
explicit ExternalReference(void* address) |
: address_(address) {} |
- static ExternalReferenceRedirector* redirector_; |
static void* Redirect(void* address, bool fp_return = false) { |
- if (redirector_ == NULL) return address; |
- void* answer = (*redirector_)(address, fp_return); |
- return answer; |
+ ExternalReferenceRedirector* redirector = |
+ reinterpret_cast<BasicAssemblerData*>(v8_context()->assembler_data_)-> |
+ redirector_; |
+ if (redirector == NULL) return address; |
+ return (*redirector)(address, fp_return); |
} |
static void* Redirect(Address address_arg, bool fp_return = false) { |
void* address = reinterpret_cast<void*>(address_arg); |
- void* answer = (redirector_ == NULL) ? |
- address : |
- (*redirector_)(address, fp_return); |
- return answer; |
+ ExternalReferenceRedirector* redirector = |
+ reinterpret_cast<BasicAssemblerData*>(v8_context()->assembler_data_)-> |
+ redirector_; |
+ return redirector == NULL ? address : (*redirector)(address, fp_return); |
} |
void* address_; |