Index: src/frames.cc |
=================================================================== |
--- src/frames.cc (revision 7267) |
+++ src/frames.cc (working copy) |
@@ -35,13 +35,10 @@ |
#include "safepoint-table.h" |
#include "scopeinfo.h" |
#include "string-stream.h" |
-#include "top.h" |
namespace v8 { |
namespace internal { |
-PcToCodeCache::PcToCodeCacheEntry |
- PcToCodeCache::cache_[PcToCodeCache::kPcToCodeCacheSize]; |
int SafeStackFrameIterator::active_count_ = 0; |
@@ -77,7 +74,8 @@ |
#define INITIALIZE_SINGLETON(type, field) field##_(this), |
StackFrameIterator::StackFrameIterator() |
: STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
- frame_(NULL), handler_(NULL), thread_(Top::GetCurrentThread()), |
+ frame_(NULL), handler_(NULL), |
+ thread_(Isolate::Current()->thread_local_top()), |
fp_(NULL), sp_(NULL), advance_(&StackFrameIterator::AdvanceWithHandler) { |
Reset(); |
} |
@@ -87,10 +85,11 @@ |
fp_(NULL), sp_(NULL), advance_(&StackFrameIterator::AdvanceWithHandler) { |
Reset(); |
} |
-StackFrameIterator::StackFrameIterator(bool use_top, Address fp, Address sp) |
+StackFrameIterator::StackFrameIterator(Isolate* isolate, |
+ bool use_top, Address fp, Address sp) |
: STACK_FRAME_TYPE_LIST(INITIALIZE_SINGLETON) |
frame_(NULL), handler_(NULL), |
- thread_(use_top ? Top::GetCurrentThread() : NULL), |
+ thread_(use_top ? isolate->thread_local_top() : NULL), |
fp_(use_top ? NULL : fp), sp_(sp), |
advance_(use_top ? &StackFrameIterator::AdvanceWithHandler : |
&StackFrameIterator::AdvanceWithoutHandler) { |
@@ -138,8 +137,10 @@ |
StackFrame::State state; |
StackFrame::Type type; |
if (thread_ != NULL) { |
- type = ExitFrame::GetStateForFramePointer(Top::c_entry_fp(thread_), &state); |
- handler_ = StackHandler::FromAddress(Top::handler(thread_)); |
+ type = ExitFrame::GetStateForFramePointer( |
+ Isolate::c_entry_fp(thread_), &state); |
+ handler_ = StackHandler::FromAddress( |
+ Isolate::handler(thread_)); |
} else { |
ASSERT(fp_ != NULL); |
state.fp = fp_; |
@@ -221,22 +222,25 @@ |
SafeStackFrameIterator::SafeStackFrameIterator( |
+ Isolate* isolate, |
Address fp, Address sp, Address low_bound, Address high_bound) : |
maintainer_(), |
stack_validator_(low_bound, high_bound), |
- is_valid_top_(IsValidTop(low_bound, high_bound)), |
+ is_valid_top_(IsValidTop(isolate, low_bound, high_bound)), |
is_valid_fp_(IsWithinBounds(low_bound, high_bound, fp)), |
is_working_iterator_(is_valid_top_ || is_valid_fp_), |
iteration_done_(!is_working_iterator_), |
- iterator_(is_valid_top_, is_valid_fp_ ? fp : NULL, sp) { |
+ iterator_(isolate, is_valid_top_, is_valid_fp_ ? fp : NULL, sp) { |
} |
-bool SafeStackFrameIterator::IsValidTop(Address low_bound, Address high_bound) { |
- Address fp = Top::c_entry_fp(Top::GetCurrentThread()); |
+bool SafeStackFrameIterator::IsValidTop(Isolate* isolate, |
+ Address low_bound, Address high_bound) { |
+ ThreadLocalTop* top = isolate->thread_local_top(); |
+ Address fp = Isolate::c_entry_fp(top); |
ExitFrameValidator validator(low_bound, high_bound); |
if (!validator.IsValidFP(fp)) return false; |
- return Top::handler(Top::GetCurrentThread()) != NULL; |
+ return Isolate::handler(top) != NULL; |
} |
@@ -312,8 +316,9 @@ |
#ifdef ENABLE_LOGGING_AND_PROFILING |
SafeStackTraceFrameIterator::SafeStackTraceFrameIterator( |
+ Isolate* isolate, |
Address fp, Address sp, Address low_bound, Address high_bound) : |
- SafeJavaScriptFrameIterator(fp, sp, low_bound, high_bound) { |
+ SafeJavaScriptFrameIterator(isolate, fp, sp, low_bound, high_bound) { |
if (!done() && !frame()->is_java_script()) Advance(); |
} |
@@ -331,7 +336,9 @@ |
Code* StackFrame::GetSafepointData(Address pc, |
SafepointEntry* safepoint_entry, |
unsigned* stack_slots) { |
- PcToCodeCache::PcToCodeCacheEntry* entry = PcToCodeCache::GetCacheEntry(pc); |
+ Isolate* isolate = Isolate::Current(); |
+ PcToCodeCache::PcToCodeCacheEntry* entry = |
+ isolate->pc_to_code_cache()->GetCacheEntry(pc); |
SafepointEntry cached_safepoint_entry = entry->safepoint_entry; |
if (!entry->safepoint_entry.is_valid()) { |
entry->safepoint_entry = entry->code->GetSafepointEntry(pc); |
@@ -386,7 +393,8 @@ |
// into the heap to determine the state. This is safe as long |
// as nobody tries to GC... |
if (SafeStackFrameIterator::is_active()) return JAVA_SCRIPT; |
- Code::Kind kind = GetContainingCode(*(state->pc_address))->kind(); |
+ Code::Kind kind = GetContainingCode(Isolate::Current(), |
+ *(state->pc_address))->kind(); |
ASSERT(kind == Code::FUNCTION || kind == Code::OPTIMIZED_FUNCTION); |
return (kind == Code::OPTIMIZED_FUNCTION) ? OPTIMIZED : JAVA_SCRIPT; |
} |
@@ -402,7 +410,7 @@ |
Code* EntryFrame::unchecked_code() const { |
- return Heap::raw_unchecked_js_entry_code(); |
+ return HEAP->raw_unchecked_js_entry_code(); |
} |
@@ -425,7 +433,7 @@ |
Code* EntryConstructFrame::unchecked_code() const { |
- return Heap::raw_unchecked_js_construct_entry_code(); |
+ return HEAP->raw_unchecked_js_construct_entry_code(); |
} |
@@ -457,7 +465,7 @@ |
void ExitFrame::Iterate(ObjectVisitor* v) const { |
// The arguments are traversed as part of the expression stack of |
// the calling frame. |
- IteratePc(v, pc_address(), code()); |
+ IteratePc(v, pc_address(), LookupCode(Isolate::Current())); |
v->VisitPointer(&code_slot()); |
} |
@@ -632,8 +640,8 @@ |
Address JavaScriptFrame::GetCallerStackPointer() const { |
int arguments; |
- if (Heap::gc_state() != Heap::NOT_IN_GC || |
- SafeStackFrameIterator::is_active()) { |
+ if (SafeStackFrameIterator::is_active() || |
+ HEAP->gc_state() != Heap::NOT_IN_GC) { |
// If the we are currently iterating the safe stack the |
// arguments for frames are traversed as if they were |
// expression stack elements of the calling frame. The reason for |
@@ -662,7 +670,7 @@ |
void JavaScriptFrame::Summarize(List<FrameSummary>* functions) { |
ASSERT(functions->length() == 0); |
- Code* code_pointer = code(); |
+ Code* code_pointer = LookupCode(Isolate::Current()); |
int offset = static_cast<int>(pc() - code_pointer->address()); |
FrameSummary summary(receiver(), |
JSFunction::cast(function()), |
@@ -781,7 +789,7 @@ |
// back to a slow search in this case to find the original optimized |
// code object. |
if (!code->contains(pc())) { |
- code = PcToCodeCache::GcSafeFindCodeForPc(pc()); |
+ code = Isolate::Current()->pc_to_code_cache()->GcSafeFindCodeForPc(pc()); |
} |
ASSERT(code != NULL); |
ASSERT(code->kind() == Code::OPTIMIZED_FUNCTION); |
@@ -842,7 +850,8 @@ |
Code* ArgumentsAdaptorFrame::unchecked_code() const { |
- return Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline); |
+ return Isolate::Current()->builtins()->builtin( |
+ Builtins::ArgumentsAdaptorTrampoline); |
} |
@@ -1036,14 +1045,14 @@ |
ASSERT(!it.done()); |
StackHandler* handler = it.handler(); |
ASSERT(handler->is_entry()); |
- handler->Iterate(v, code()); |
+ handler->Iterate(v, LookupCode(Isolate::Current())); |
#ifdef DEBUG |
// Make sure that the entry frame does not contain more than one |
// stack handler. |
it.Advance(); |
ASSERT(it.done()); |
#endif |
- IteratePc(v, pc_address(), code()); |
+ IteratePc(v, pc_address(), LookupCode(Isolate::Current())); |
} |
@@ -1060,7 +1069,7 @@ |
v->VisitPointers(base, reinterpret_cast<Object**>(address)); |
base = reinterpret_cast<Object**>(address + StackHandlerConstants::kSize); |
// Traverse the pointers in the handler itself. |
- handler->Iterate(v, code()); |
+ handler->Iterate(v, LookupCode(Isolate::Current())); |
} |
v->VisitPointers(base, limit); |
} |
@@ -1068,7 +1077,7 @@ |
void JavaScriptFrame::Iterate(ObjectVisitor* v) const { |
IterateExpressions(v); |
- IteratePc(v, pc_address(), code()); |
+ IteratePc(v, pc_address(), LookupCode(Isolate::Current())); |
IterateArguments(v); |
} |
@@ -1087,7 +1096,7 @@ |
// Internal frames only have object pointers on the expression stack |
// as they never have any arguments. |
IterateExpressions(v); |
- IteratePc(v, pc_address(), code()); |
+ IteratePc(v, pc_address(), LookupCode(Isolate::Current())); |
} |
@@ -1117,14 +1126,15 @@ |
Code* PcToCodeCache::GcSafeFindCodeForPc(Address pc) { |
+ Heap* heap = isolate_->heap(); |
// Check if the pc points into a large object chunk. |
- LargeObjectChunk* chunk = Heap::lo_space()->FindChunkContainingPc(pc); |
+ LargeObjectChunk* chunk = heap->lo_space()->FindChunkContainingPc(pc); |
if (chunk != NULL) return GcSafeCastToCode(chunk->GetObject(), pc); |
// Iterate through the 8K page until we reach the end or find an |
// object starting after the pc. |
Page* page = Page::FromAddress(pc); |
- HeapObjectIterator iterator(page, Heap::GcSafeSizeOfOldObjectFunction()); |
+ HeapObjectIterator iterator(page, heap->GcSafeSizeOfOldObjectFunction()); |
HeapObject* previous = NULL; |
while (true) { |
HeapObject* next = iterator.next(); |
@@ -1137,14 +1147,14 @@ |
PcToCodeCache::PcToCodeCacheEntry* PcToCodeCache::GetCacheEntry(Address pc) { |
- Counters::pc_to_code.Increment(); |
+ COUNTERS->pc_to_code()->Increment(); |
ASSERT(IsPowerOf2(kPcToCodeCacheSize)); |
uint32_t hash = ComputeIntegerHash( |
static_cast<uint32_t>(reinterpret_cast<uintptr_t>(pc))); |
uint32_t index = hash & (kPcToCodeCacheSize - 1); |
PcToCodeCacheEntry* entry = cache(index); |
if (entry->pc == pc) { |
- Counters::pc_to_code_cached.Increment(); |
+ COUNTERS->pc_to_code_cached()->Increment(); |
ASSERT(entry->code == GcSafeFindCodeForPc(pc)); |
} else { |
// Because this code may be interrupted by a profiling signal that |
@@ -1171,11 +1181,8 @@ |
} |
-int JSCallerSavedCode(int n) { |
- static int reg_code[kNumJSCallerSaved]; |
- static bool initialized = false; |
- if (!initialized) { |
- initialized = true; |
+struct JSCallerSavedCodeData { |
+ JSCallerSavedCodeData() { |
int i = 0; |
for (int r = 0; r < kNumRegs; r++) |
if ((kJSCallerSaved & (1 << r)) != 0) |
@@ -1183,8 +1190,16 @@ |
ASSERT(i == kNumJSCallerSaved); |
} |
+ int reg_code[kNumJSCallerSaved]; |
+}; |
+ |
+ |
+static const JSCallerSavedCodeData kCallerSavedCodeData; |
+ |
+ |
+int JSCallerSavedCode(int n) { |
ASSERT(0 <= n && n < kNumJSCallerSaved); |
- return reg_code[n]; |
+ return kCallerSavedCodeData.reg_code[n]; |
} |