Index: src/isolate.cc |
diff --git a/src/isolate.cc b/src/isolate.cc |
old mode 100644 |
new mode 100755 |
index 6c797b252280a75680aa1f1c0f23cf58557d9f7e..176c1554e5bde7b49b52547b26f9ca7056c83193 |
--- a/src/isolate.cc |
+++ b/src/isolate.cc |
@@ -1754,8 +1754,10 @@ Isolate::Isolate() |
date_cache_(NULL), |
code_stub_interface_descriptors_(NULL), |
context_exit_happened_(false), |
+ initialized_from_snapshot_(false), |
cpu_profiler_(NULL), |
heap_profiler_(NULL), |
+ function_entry_hook_(NullFunctionEntryHook), |
deferred_handles_head_(NULL), |
optimizing_compiler_thread_(this), |
marking_thread_(NULL), |
@@ -1932,6 +1934,13 @@ void Isolate::SetIsolateThreadLocals(Isolate* isolate, |
} |
+void Isolate::NullFunctionEntryHook(uintptr_t function, |
+ uintptr_t return_addr_location) { |
+ // Ignore callbacks. |
+} |
+ |
+ |
+ |
Isolate::~Isolate() { |
TRACE_ISOLATE(destructor); |
@@ -2081,6 +2090,14 @@ bool Isolate::Init(Deserializer* des) { |
ASSERT(Isolate::Current() == this); |
TRACE_ISOLATE(init); |
+ // When function entry hooking is in effect, we have to create the |
+ // code stubs from scratch to get entry hooks, rather than loading the |
+ // previously generated stubs from disk. There need to be guards on |
+ // isolate creation to |
+ if (HasFunctionEntryHook()) { |
+ ASSERT(des == NULL); |
+ } |
+ |
// The initialization process does not handle memory exhaustion. |
DisallowAllocationFailure disallow_allocation_failure; |
@@ -2151,6 +2168,7 @@ bool Isolate::Init(Deserializer* des) { |
deoptimizer_data_ = new DeoptimizerData(memory_allocator_); |
const bool create_heap_objects = (des == NULL); |
+ |
danno
2013/06/13 15:33:44
Stray whitespace change?
Sigurður Ásgeirsson
2013/06/19 20:51:51
Done.
|
if (create_heap_objects && !heap_.CreateHeapObjects()) { |
V8::FatalProcessOutOfMemory("heap object creation"); |
return false; |
@@ -2300,6 +2318,9 @@ bool Isolate::Init(Deserializer* des) { |
SystemThreadManager::PARALLEL_RECOMPILATION) == 0) { |
FLAG_parallel_recompilation = false; |
} |
+ |
+ initialized_from_snapshot_ = (des != NULL); |
+ |
return true; |
} |
@@ -2425,6 +2446,26 @@ HTracer* Isolate::GetHTracer() { |
} |
+FunctionEntryHook Isolate::GetFunctionEntryHook() { |
+ if (function_entry_hook_ == NullFunctionEntryHook) |
+ return NULL; |
+ |
+ return function_entry_hook_; |
+} |
+ |
+ |
+void Isolate::SetFunctionEntryHook(FunctionEntryHook function_entry_hook) { |
+ if (function_entry_hook == NULL && function_entry_hook_ != NULL) { |
danno
2013/06/13 15:33:44
Might it be a little clearer if you can never pass
Sigurður Ásgeirsson
2013/06/19 20:51:51
I made this one-way as we'd discussed. It makes ev
|
+ // After an entry hook has once been set on an isolate, the injected entry |
+ // hooking code can't be revoked, and we don't want it calling NULL. |
+ // So instead of NULLing the function, we divert it to a no-op. |
+ function_entry_hook_ = NullFunctionEntryHook; |
+ } else { |
+ function_entry_hook_ = function_entry_hook; |
+ } |
+} |
+ |
+ |
Map* Isolate::get_initial_js_array_map(ElementsKind kind) { |
Context* native_context = context()->native_context(); |
Object* maybe_map_array = native_context->js_array_maps(); |