diff options
| author | Ben Murdoch <benm@google.com> | 2012-04-11 10:23:59 +0100 |
|---|---|---|
| committer | Ben Murdoch <benm@google.com> | 2012-04-11 15:40:41 +0100 |
| commit | 5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b (patch) | |
| tree | 7b717e53b80c4a64bf9b723aabcf7c909ae3c243 /src/frames.cc | |
| parent | c7cc028aaeedbbfa11c11d0b7b243b3d9e837ed9 (diff) | |
| download | android_external_v8-5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b.tar.gz android_external_v8-5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b.tar.bz2 android_external_v8-5d4cdbf7a67d3662fa0bee4efdb7edd8daec9b0b.zip | |
Merge V8 3.9 at 3.9.24.9
http://v8.googlecode.com/svn/branches/3.9@11260
Bug: 5688872
Change-Id: Iddd944e82189d92df3fc427dc5f0d3f1b2f0c6c8
Diffstat (limited to 'src/frames.cc')
| -rw-r--r-- | src/frames.cc | 60 |
1 files changed, 45 insertions, 15 deletions
diff --git a/src/frames.cc b/src/frames.cc index 4402496f..0571a813 100644 --- a/src/frames.cc +++ b/src/frames.cc @@ -31,6 +31,7 @@ #include "deoptimizer.h" #include "frames-inl.h" #include "full-codegen.h" +#include "lazy-instance.h" #include "mark-compact.h" #include "safepoint-table.h" #include "scopeinfo.h" @@ -41,6 +42,22 @@ namespace v8 { namespace internal { + +static ReturnAddressLocationResolver return_address_location_resolver = NULL; + + +// Resolves pc_address through the resolution address function if one is set. +static inline Address* ResolveReturnAddressLocation(Address* pc_address) { + if (return_address_location_resolver == NULL) { + return pc_address; + } else { + return reinterpret_cast<Address*>( + return_address_location_resolver( + reinterpret_cast<uintptr_t>(pc_address))); + } +} + + // Iterator that supports traversing the stack handlers of a // particular frame. Needs to know the top of the handler chain. class StackHandlerIterator BASE_EMBEDDED { @@ -155,8 +172,8 @@ void StackFrameIterator::Reset() { ASSERT(fp_ != NULL); state.fp = fp_; state.sp = sp_; - state.pc_address = - reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp_)); + state.pc_address = ResolveReturnAddressLocation( + reinterpret_cast<Address*>(StandardFrame::ComputePCAddress(fp_))); type = StackFrame::ComputeType(isolate(), &state); } if (SingletonFor(type) == NULL) return; @@ -414,6 +431,13 @@ void StackFrame::IteratePc(ObjectVisitor* v, } +void StackFrame::SetReturnAddressLocationResolver( + ReturnAddressLocationResolver resolver) { + ASSERT(return_address_location_resolver == NULL); + return_address_location_resolver = resolver; +} + + StackFrame::Type StackFrame::ComputeType(Isolate* isolate, State* state) { ASSERT(state->fp != NULL); if (StandardFrame::IsArgumentsAdaptorFrame(state->fp)) { @@ -488,8 +512,8 @@ void ExitFrame::ComputeCallerState(State* state) const { // Set up the caller state. state->sp = caller_sp(); state->fp = Memory::Address_at(fp() + ExitFrameConstants::kCallerFPOffset); - state->pc_address - = reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset); + state->pc_address = ResolveReturnAddressLocation( + reinterpret_cast<Address*>(fp() + ExitFrameConstants::kCallerPCOffset)); } @@ -523,7 +547,8 @@ StackFrame::Type ExitFrame::GetStateForFramePointer(Address fp, State* state) { void ExitFrame::FillState(Address fp, Address sp, State* state) { state->sp = sp; state->fp = fp; - state->pc_address = reinterpret_cast<Address*>(sp - 1 * kPointerSize); + state->pc_address = ResolveReturnAddressLocation( + reinterpret_cast<Address*>(sp - 1 * kPointerSize)); } @@ -558,7 +583,8 @@ int StandardFrame::ComputeExpressionsCount() const { void StandardFrame::ComputeCallerState(State* state) const { state->sp = caller_sp(); state->fp = caller_fp(); - state->pc_address = reinterpret_cast<Address*>(ComputePCAddress(fp())); + state->pc_address = ResolveReturnAddressLocation( + reinterpret_cast<Address*>(ComputePCAddress(fp()))); } @@ -818,14 +844,11 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { // We create the summary in reverse order because the frames // in the deoptimization translation are ordered bottom-to-top. + bool is_constructor = IsConstructor(); int i = jsframe_count; while (i > 0) { opcode = static_cast<Translation::Opcode>(it.Next()); if (opcode == Translation::JS_FRAME) { - // We don't inline constructor calls, so only the first, outermost - // frame can be a constructor frame in case of inlining. - bool is_constructor = (i == jsframe_count) && IsConstructor(); - i--; int ast_id = it.Next(); int function_id = it.Next(); @@ -875,11 +898,18 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { FrameSummary summary(receiver, function, code, pc_offset, is_constructor); frames->Add(summary); + is_constructor = false; + } else if (opcode == Translation::CONSTRUCT_STUB_FRAME) { + // The next encountered JS_FRAME will be marked as a constructor call. + it.Skip(Translation::NumberOfOperandsFor(opcode)); + ASSERT(!is_constructor); + is_constructor = true; } else { // Skip over operands to advance to the next opcode. it.Skip(Translation::NumberOfOperandsFor(opcode)); } } + ASSERT(!is_constructor); } @@ -1174,7 +1204,7 @@ void EntryFrame::Iterate(ObjectVisitor* v) const { StackHandlerIterator it(this, top_handler()); ASSERT(!it.done()); StackHandler* handler = it.handler(); - ASSERT(handler->is_entry()); + ASSERT(handler->is_js_entry()); handler->Iterate(v, LookupCode()); #ifdef DEBUG // Make sure that the entry frame does not contain more than one @@ -1272,7 +1302,7 @@ Code* InnerPointerToCodeCache::GcSafeFindCodeForInnerPointer( Address inner_pointer) { Heap* heap = isolate_->heap(); // Check if the inner pointer points into a large object chunk. - LargePage* large_page = heap->lo_space()->FindPageContainingPc(inner_pointer); + LargePage* large_page = heap->lo_space()->FindPage(inner_pointer); if (large_page != NULL) { return GcSafeCastToCode(large_page->GetObject(), inner_pointer); } @@ -1351,12 +1381,12 @@ struct JSCallerSavedCodeData { }; -static const JSCallerSavedCodeData kCallerSavedCodeData; - +static LazyInstance<JSCallerSavedCodeData>::type caller_saved_code_data = + LAZY_INSTANCE_INITIALIZER; int JSCallerSavedCode(int n) { ASSERT(0 <= n && n < kNumJSCallerSaved); - return kCallerSavedCodeData.reg_code[n]; + return caller_saved_code_data.Get().reg_code[n]; } |
