Index: src/deoptimizer.cc |
diff --git a/src/deoptimizer.cc b/src/deoptimizer.cc |
index d077fed64a66db4e95d8512c0a81ede434b8542f..f03025cbfbefbc85d1a16e3b951ebb2e2a5c2b69 100644 |
--- a/src/deoptimizer.cc |
+++ b/src/deoptimizer.cc |
@@ -40,36 +40,31 @@ |
namespace v8 { |
namespace internal { |
-DeoptimizerData::DeoptimizerData() { |
- eager_deoptimization_entry_code_entries_ = -1; |
- lazy_deoptimization_entry_code_entries_ = -1; |
- size_t deopt_table_size = Deoptimizer::GetMaxDeoptTableSize(); |
- MemoryAllocator* allocator = Isolate::Current()->memory_allocator(); |
- size_t initial_commit_size = OS::CommitPageSize(); |
- eager_deoptimization_entry_code_ = |
- allocator->AllocateChunk(deopt_table_size, |
- initial_commit_size, |
- EXECUTABLE, |
- NULL); |
- lazy_deoptimization_entry_code_ = |
- allocator->AllocateChunk(deopt_table_size, |
- initial_commit_size, |
- EXECUTABLE, |
- NULL); |
- current_ = NULL; |
- deoptimizing_code_list_ = NULL; |
+static MemoryChunk* AllocateCodeChunk(MemoryAllocator* allocator) { |
+ return allocator->AllocateChunk(Deoptimizer::GetMaxDeoptTableSize(), |
+ OS::CommitPageSize(), |
+ EXECUTABLE, |
+ NULL); |
+} |
+ |
+ |
+DeoptimizerData::DeoptimizerData(MemoryAllocator* allocator) |
+ : allocator_(allocator), |
+ eager_deoptimization_entry_code_entries_(-1), |
+ lazy_deoptimization_entry_code_entries_(-1), |
+ eager_deoptimization_entry_code_(AllocateCodeChunk(allocator)), |
+ lazy_deoptimization_entry_code_(AllocateCodeChunk(allocator)), |
+ current_(NULL), |
#ifdef ENABLE_DEBUGGER_SUPPORT |
- deoptimized_frame_info_ = NULL; |
+ deoptimized_frame_info_(NULL), |
#endif |
-} |
+ deoptimizing_code_list_(NULL) { } |
DeoptimizerData::~DeoptimizerData() { |
- Isolate::Current()->memory_allocator()->Free( |
- eager_deoptimization_entry_code_); |
+ allocator_->Free(eager_deoptimization_entry_code_); |
eager_deoptimization_entry_code_ = NULL; |
- Isolate::Current()->memory_allocator()->Free( |
- lazy_deoptimization_entry_code_); |
+ allocator_->Free(lazy_deoptimization_entry_code_); |
lazy_deoptimization_entry_code_ = NULL; |
DeoptimizingCodeListNode* current = deoptimizing_code_list_; |
@@ -129,7 +124,6 @@ Deoptimizer* Deoptimizer::New(JSFunction* function, |
Address from, |
int fp_to_sp_delta, |
Isolate* isolate) { |
- ASSERT(isolate == Isolate::Current()); |
Deoptimizer* deoptimizer = new Deoptimizer(isolate, |
function, |
type, |
@@ -158,7 +152,6 @@ size_t Deoptimizer::GetMaxDeoptTableSize() { |
Deoptimizer* Deoptimizer::Grab(Isolate* isolate) { |
- ASSERT(isolate == Isolate::Current()); |
Deoptimizer* result = isolate->deoptimizer_data()->current_; |
ASSERT(result != NULL); |
result->DeleteFrameDescriptions(); |
@@ -188,7 +181,6 @@ DeoptimizedFrameInfo* Deoptimizer::DebuggerInspectableFrame( |
JavaScriptFrame* frame, |
int jsframe_index, |
Isolate* isolate) { |
- ASSERT(isolate == Isolate::Current()); |
ASSERT(frame->is_optimized()); |
ASSERT(isolate->deoptimizer_data()->deoptimized_frame_info_ == NULL); |
@@ -274,7 +266,6 @@ DeoptimizedFrameInfo* Deoptimizer::DebuggerInspectableFrame( |
void Deoptimizer::DeleteDebuggerInspectableFrame(DeoptimizedFrameInfo* info, |
Isolate* isolate) { |
- ASSERT(isolate == Isolate::Current()); |
ASSERT(isolate->deoptimizer_data()->deoptimized_frame_info_ == info); |
delete info; |
isolate->deoptimizer_data()->deoptimized_frame_info_ = NULL; |
@@ -319,11 +310,12 @@ void Deoptimizer::VisitAllOptimizedFunctionsForContext( |
void Deoptimizer::VisitAllOptimizedFunctions( |
+ Isolate* isolate, |
OptimizedFunctionVisitor* visitor) { |
AssertNoAllocation no_allocation; |
// Run through the list of all native contexts and deoptimize. |
- Object* context = Isolate::Current()->heap()->native_contexts_list(); |
+ Object* context = isolate->heap()->native_contexts_list(); |
while (!context->IsUndefined()) { |
VisitAllOptimizedFunctionsForContext(Context::cast(context), visitor); |
context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK); |
@@ -394,7 +386,7 @@ class DeoptimizeWithMatchingCodeFilter : public OptimizedFunctionFilter { |
}; |
-void Deoptimizer::DeoptimizeAll() { |
+void Deoptimizer::DeoptimizeAll(Isolate* isolate) { |
AssertNoAllocation no_allocation; |
if (FLAG_trace_deopt) { |
@@ -402,7 +394,7 @@ void Deoptimizer::DeoptimizeAll() { |
} |
DeoptimizeAllFilter filter; |
- DeoptimizeAllFunctionsWith(&filter); |
+ DeoptimizeAllFunctionsWith(isolate, &filter); |
} |
@@ -456,11 +448,12 @@ void Deoptimizer::DeoptimizeAllFunctionsForContext( |
} |
-void Deoptimizer::DeoptimizeAllFunctionsWith(OptimizedFunctionFilter* filter) { |
+void Deoptimizer::DeoptimizeAllFunctionsWith(Isolate* isolate, |
+ OptimizedFunctionFilter* filter) { |
AssertNoAllocation no_allocation; |
// Run through the list of all native contexts and deoptimize. |
- Object* context = Isolate::Current()->heap()->native_contexts_list(); |
+ Object* context = isolate->heap()->native_contexts_list(); |
while (!context->IsUndefined()) { |
DeoptimizeAllFunctionsForContext(Context::cast(context), filter); |
context = Context::cast(context)->get(Context::NEXT_CONTEXT_LINK); |
@@ -640,30 +633,26 @@ Address Deoptimizer::GetDeoptimizationEntry(Isolate* isolate, |
GetEntryMode mode) { |
ASSERT(id >= 0); |
if (id >= kMaxNumberOfEntries) return NULL; |
- MemoryChunk* base = NULL; |
if (mode == ENSURE_ENTRY_CODE) { |
EnsureCodeForDeoptimizationEntry(isolate, type, id); |
} else { |
ASSERT(mode == CALCULATE_ENTRY_ADDRESS); |
} |
DeoptimizerData* data = isolate->deoptimizer_data(); |
- if (type == EAGER) { |
- base = data->eager_deoptimization_entry_code_; |
- } else { |
- base = data->lazy_deoptimization_entry_code_; |
- } |
+ MemoryChunk* base = (type == EAGER) |
+ ? data->eager_deoptimization_entry_code_ |
+ : data->lazy_deoptimization_entry_code_; |
return base->area_start() + (id * table_entry_size_); |
} |
-int Deoptimizer::GetDeoptimizationId(Address addr, BailoutType type) { |
- MemoryChunk* base = NULL; |
- DeoptimizerData* data = Isolate::Current()->deoptimizer_data(); |
- if (type == EAGER) { |
- base = data->eager_deoptimization_entry_code_; |
- } else { |
- base = data->lazy_deoptimization_entry_code_; |
- } |
+int Deoptimizer::GetDeoptimizationId(Isolate* isolate, |
+ Address addr, |
+ BailoutType type) { |
+ DeoptimizerData* data = isolate->deoptimizer_data(); |
+ MemoryChunk* base = (type == EAGER) |
+ ? data->eager_deoptimization_entry_code_ |
+ : data->lazy_deoptimization_entry_code_; |
Address start = base->area_start(); |
if (base == NULL || |
addr < start || |
@@ -2135,7 +2124,7 @@ void Deoptimizer::EnsureCodeForDeoptimizationEntry(Isolate* isolate, |
masm.GetCode(&desc); |
ASSERT(!RelocInfo::RequiresRelocation(desc)); |
- MemoryChunk* chunk = type == EAGER |
+ MemoryChunk* chunk = (type == EAGER) |
? data->eager_deoptimization_entry_code_ |
: data->lazy_deoptimization_entry_code_; |
ASSERT(static_cast<int>(Deoptimizer::GetMaxDeoptTableSize()) >= |
@@ -2155,7 +2144,7 @@ void Deoptimizer::EnsureCodeForDeoptimizationEntry(Isolate* isolate, |
void Deoptimizer::ReplaceCodeForRelatedFunctions(JSFunction* function, |
Code* code) { |
SharedFunctionInfo* shared = function->shared(); |
- Object* undefined = Isolate::Current()->heap()->undefined_value(); |
+ Object* undefined = function->GetHeap()->undefined_value(); |
Object* current = function; |
while (current != undefined) { |
@@ -2281,10 +2270,9 @@ int32_t TranslationIterator::Next() { |
} |
-Handle<ByteArray> TranslationBuffer::CreateByteArray() { |
+Handle<ByteArray> TranslationBuffer::CreateByteArray(Factory* factory) { |
int length = contents_.length(); |
- Handle<ByteArray> result = |
- Isolate::Current()->factory()->NewByteArray(length, TENURED); |
+ Handle<ByteArray> result = factory->NewByteArray(length, TENURED); |
memcpy(result->GetDataStartAddress(), contents_.ToVector().start(), length); |
return result; |
} |
@@ -2479,7 +2467,7 @@ const char* Translation::StringFor(Opcode opcode) { |
DeoptimizingCodeListNode::DeoptimizingCodeListNode(Code* code): next_(NULL) { |
- GlobalHandles* global_handles = Isolate::Current()->global_handles(); |
+ GlobalHandles* global_handles = code->GetIsolate()->global_handles(); |
// Globalize the code object and make it weak. |
code_ = Handle<Code>::cast(global_handles->Create(code)); |
global_handles->MakeWeak(reinterpret_cast<Object**>(code_.location()), |
@@ -2490,7 +2478,7 @@ DeoptimizingCodeListNode::DeoptimizingCodeListNode(Code* code): next_(NULL) { |
DeoptimizingCodeListNode::~DeoptimizingCodeListNode() { |
- GlobalHandles* global_handles = Isolate::Current()->global_handles(); |
+ GlobalHandles* global_handles = code_->GetIsolate()->global_handles(); |
global_handles->Destroy(reinterpret_cast<Object**>(code_.location())); |
} |
@@ -2656,7 +2644,7 @@ DeoptimizedFrameInfo::DeoptimizedFrameInfo(Deoptimizer* deoptimizer, |
expression_stack_ = new Object*[expression_count_]; |
// Get the source position using the unoptimized code. |
Address pc = reinterpret_cast<Address>(output_frame->GetPc()); |
- Code* code = Code::cast(Isolate::Current()->heap()->FindCodeObject(pc)); |
+ Code* code = Code::cast(deoptimizer->isolate()->heap()->FindCodeObject(pc)); |
source_position_ = code->SourcePosition(pc); |
for (int i = 0; i < expression_count_; i++) { |