Index: src/assembler.h |
=================================================================== |
--- src/assembler.h (revision 2053) |
+++ src/assembler.h (working copy) |
@@ -352,10 +352,15 @@ |
class Debug_Address; |
#endif |
-// An ExternalReference represents a C++ address called from the generated |
-// code. All references to C++ functions and must be encapsulated in an |
-// ExternalReference instance. This is done in order to track the origin of |
-// all external references in the code. |
+ |
+typedef void* ExternalReferenceRedirector(void* original, bool fp_return); |
+ |
+ |
+// An ExternalReference represents a C++ address used in the generated |
+// code. All references to C++ functions and variables must be encapsulated in |
+// an ExternalReference instance. This is done in order to track the origin of |
+// all external references in the code so that they can be bound to the correct |
+// addresses when deserializing a heap. |
class ExternalReference BASE_EMBEDDED { |
public: |
explicit ExternalReference(Builtins::CFunctionId id); |
@@ -382,6 +387,8 @@ |
// pattern. This means that they have to be added to the |
// ExternalReferenceTable in serialize.cc manually. |
+ static ExternalReference perform_gc_function(); |
+ |
static ExternalReference builtin_passed_function(); |
// Static variable Factory::the_hole_value.location() |
@@ -403,7 +410,7 @@ |
static ExternalReference double_fp_operation(Token::Value operation); |
- Address address() const {return address_;} |
+ Address address() const {return reinterpret_cast<Address>(address_);} |
#ifdef ENABLE_DEBUGGER_SUPPORT |
// Function Debug::Break() |
@@ -413,11 +420,30 @@ |
static ExternalReference debug_step_in_fp_address(); |
#endif |
+ // 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; |
+ } |
+ |
private: |
explicit ExternalReference(void* address) |
- : address_(reinterpret_cast<Address>(address)) {} |
+ : address_(address) {} |
- Address address_; |
+ static ExternalReferenceRedirector* redirector_; |
+ |
+ static void* Redirect(void* address, bool fp_return = false) { |
+ 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); |
+ return redirector_ == NULL ? address : (*redirector_)(address, fp_return); |
+ } |
+ |
+ void* address_; |
}; |