diff options
Diffstat (limited to 'src/frames.cc')
-rw-r--r-- | src/frames.cc | 98 |
1 files changed, 54 insertions, 44 deletions
diff --git a/src/frames.cc b/src/frames.cc index 24ea8dde..79aa2507 100644 --- a/src/frames.cc +++ b/src/frames.cc @@ -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 @@ class StackHandlerIterator BASE_EMBEDDED { #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 @@ StackFrameIterator::StackFrameIterator(ThreadLocalTop* t) 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 @@ void StackFrameIterator::Reset() { 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 @@ bool SafeStackFrameIterator::ExitFrameValidator::IsValidFP(Address fp) { 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 @@ void SafeStackFrameIterator::Reset() { #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 @@ void SafeStackTraceFrameIterator::Advance() { 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 @@ StackFrame::Type StackFrame::ComputeType(State* state) { // 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 @@ StackFrame::Type StackFrame::GetCallerState(State* state) const { Code* EntryFrame::unchecked_code() const { - return Heap::raw_unchecked_js_entry_code(); + return HEAP->raw_unchecked_js_entry_code(); } @@ -425,7 +433,7 @@ StackFrame::Type EntryFrame::GetCallerState(State* state) const { 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::SetCallerFp(Address caller_fp) { 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()); } @@ -630,15 +638,10 @@ Code* JavaScriptFrame::unchecked_code() const { } -int JavaScriptFrame::GetProvidedParametersCount() const { - return ComputeParametersCount(); -} - - 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 @@ -667,7 +670,7 @@ void JavaScriptFrame::GetFunctions(List<JSFunction*>* functions) { 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()), @@ -786,7 +789,7 @@ DeoptimizationInputData* OptimizedFrame::GetDeoptimizationData( // 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); @@ -847,7 +850,8 @@ Address InternalFrame::GetCallerStackPointer() const { Code* ArgumentsAdaptorFrame::unchecked_code() const { - return Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline); + return Isolate::Current()->builtins()->builtin( + Builtins::kArgumentsAdaptorTrampoline); } @@ -1041,14 +1045,14 @@ void EntryFrame::Iterate(ObjectVisitor* v) const { 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())); } @@ -1065,7 +1069,7 @@ void StandardFrame::IterateExpressions(ObjectVisitor* v) const { 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); } @@ -1073,7 +1077,7 @@ void StandardFrame::IterateExpressions(ObjectVisitor* v) const { void JavaScriptFrame::Iterate(ObjectVisitor* v) const { IterateExpressions(v); - IteratePc(v, pc_address(), code()); + IteratePc(v, pc_address(), LookupCode(Isolate::Current())); IterateArguments(v); } @@ -1092,7 +1096,7 @@ void InternalFrame::Iterate(ObjectVisitor* v) const { // 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())); } @@ -1122,14 +1126,15 @@ Code* PcToCodeCache::GcSafeCastToCode(HeapObject* object, Address pc) { 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(); @@ -1142,14 +1147,14 @@ Code* PcToCodeCache::GcSafeFindCodeForPc(Address pc) { PcToCodeCache::PcToCodeCacheEntry* PcToCodeCache::GetCacheEntry(Address pc) { - Counters::pc_to_code.Increment(); + isolate_->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(); + isolate_->counters()->pc_to_code_cached()->Increment(); ASSERT(entry->code == GcSafeFindCodeForPc(pc)); } else { // Because this code may be interrupted by a profiling signal that @@ -1176,11 +1181,8 @@ int NumRegs(RegList reglist) { } -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) @@ -1188,8 +1190,16 @@ int JSCallerSavedCode(int n) { 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]; } |