diff options
Diffstat (limited to 'deps/v8/src/frames.cc')
-rw-r--r-- | deps/v8/src/frames.cc | 66 |
1 files changed, 19 insertions, 47 deletions
diff --git a/deps/v8/src/frames.cc b/deps/v8/src/frames.cc index 0c47de910d..e7c2a149ea 100644 --- a/deps/v8/src/frames.cc +++ b/deps/v8/src/frames.cc @@ -1,29 +1,6 @@ // Copyright 2012 the V8 project authors. All rights reserved. -// Redistribution and use in source and binary forms, with or without -// modification, are permitted provided that the following conditions are -// met: -// -// * Redistributions of source code must retain the above copyright -// notice, this list of conditions and the following disclaimer. -// * Redistributions in binary form must reproduce the above -// copyright notice, this list of conditions and the following -// disclaimer in the documentation and/or other materials provided -// with the distribution. -// * Neither the name of Google Inc. nor the names of its -// contributors may be used to endorse or promote products derived -// from this software without specific prior written permission. -// -// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS -// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT -// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR -// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT -// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, -// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT -// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, -// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY -// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE -// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +// Use of this source code is governed by a BSD-style license that can be +// found in the LICENSE file. #include "v8.h" @@ -663,7 +640,7 @@ void StandardFrame::IterateCompiledFrame(ObjectVisitor* v) const { // Skip saved double registers. if (safepoint_entry.has_doubles()) { // Number of doubles not known at snapshot time. - ASSERT(!Serializer::enabled()); + ASSERT(!Serializer::enabled(isolate())); parameters_base += DoubleRegister::NumAllocatableRegisters() * kDoubleSize / kPointerSize; } @@ -806,7 +783,6 @@ void JavaScriptFrame::PrintTop(Isolate* isolate, bool print_args, bool print_line_number) { // constructor calls - HandleScope scope(isolate); DisallowHeapAllocation no_allocation; JavaScriptFrameIterator it(isolate); while (!it.done()) { @@ -827,8 +803,8 @@ void JavaScriptFrame::PrintTop(Isolate* isolate, int source_pos = code->SourcePosition(pc); Object* maybe_script = shared->script(); if (maybe_script->IsScript()) { - Handle<Script> script(Script::cast(maybe_script)); - int line = GetScriptLineNumberSafe(script, source_pos) + 1; + Script* script = Script::cast(maybe_script); + int line = script->GetLineNumber(source_pos) + 1; Object* script_name_raw = script->name(); if (script_name_raw->IsString()) { String* script_name = String::cast(script->name()); @@ -991,13 +967,10 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { it.Next(); // Skip height. // The translation commands are ordered and the receiver is always - // at the first position. Since we are always at a call when we need - // to construct a stack trace, the receiver is always in a stack slot. + // at the first position. + // If we are at a call, the receiver is always in a stack slot. + // Otherwise we are not guaranteed to get the receiver value. opcode = static_cast<Translation::Opcode>(it.Next()); - ASSERT(opcode == Translation::STACK_SLOT || - opcode == Translation::LITERAL || - opcode == Translation::CAPTURED_OBJECT || - opcode == Translation::DUPLICATED_OBJECT); int index = it.Next(); // Get the correct receiver in the optimized frame. @@ -1021,6 +994,7 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) { : this->GetParameter(parameter_index); } } else { + // The receiver is not in a stack slot nor in a literal. We give up. // TODO(3029): Materializing a captured object (or duplicated // object) is hard, we return undefined for now. This breaks the // produced stack trace, as constructor frames aren't marked as @@ -1171,7 +1145,7 @@ void StackFrame::PrintIndex(StringStream* accumulator, void JavaScriptFrame::Print(StringStream* accumulator, PrintMode mode, int index) const { - HandleScope scope(isolate()); + DisallowHeapAllocation no_gc; Object* receiver = this->receiver(); JSFunction* function = this->function(); @@ -1185,13 +1159,11 @@ void JavaScriptFrame::Print(StringStream* accumulator, // doesn't contain scope info, scope_info will return 0 for the number of // parameters, stack local variables, context local variables, stack slots, // or context slots. - Handle<ScopeInfo> scope_info(ScopeInfo::Empty(isolate())); - - Handle<SharedFunctionInfo> shared(function->shared()); - scope_info = Handle<ScopeInfo>(shared->scope_info()); + SharedFunctionInfo* shared = function->shared(); + ScopeInfo* scope_info = shared->scope_info(); Object* script_obj = shared->script(); if (script_obj->IsScript()) { - Handle<Script> script(Script::cast(script_obj)); + Script* script = Script::cast(script_obj); accumulator->Add(" ["); accumulator->PrintName(script->name()); @@ -1199,11 +1171,11 @@ void JavaScriptFrame::Print(StringStream* accumulator, if (code != NULL && code->kind() == Code::FUNCTION && pc >= code->instruction_start() && pc < code->instruction_end()) { int source_pos = code->SourcePosition(pc); - int line = GetScriptLineNumberSafe(script, source_pos) + 1; + int line = script->GetLineNumber(source_pos) + 1; accumulator->Add(":%d", line); } else { int function_start_pos = shared->start_position(); - int line = GetScriptLineNumberSafe(script, function_start_pos) + 1; + int line = script->GetLineNumber(function_start_pos) + 1; accumulator->Add(":~%d", line); } @@ -1406,14 +1378,14 @@ Address StubFailureTrampolineFrame::GetCallerStackPointer() const { Code* StubFailureTrampolineFrame::unchecked_code() const { Code* trampoline; - StubFailureTrampolineStub(NOT_JS_FUNCTION_STUB_MODE). - FindCodeInCache(&trampoline, isolate()); + StubFailureTrampolineStub(isolate(), NOT_JS_FUNCTION_STUB_MODE). + FindCodeInCache(&trampoline); if (trampoline->contains(pc())) { return trampoline; } - StubFailureTrampolineStub(JS_FUNCTION_STUB_MODE). - FindCodeInCache(&trampoline, isolate()); + StubFailureTrampolineStub(isolate(), JS_FUNCTION_STUB_MODE). + FindCodeInCache(&trampoline); if (trampoline->contains(pc())) { return trampoline; } |