Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(205)

Unified Diff: src/frames.cc

Issue 1618343002: [interpreter, debugger] abstraction for source position calculation. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: remove bogus assertion Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/frames.h ('k') | src/heap/heap.cc » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/frames.cc
diff --git a/src/frames.cc b/src/frames.cc
index 1b503065245c981807dd8f160d2fd6e09dbc0493..4e499455f7eabb15295ba0c5f4e7e0bc19f5c900 100644
--- a/src/frames.cc
+++ b/src/frames.cc
@@ -801,12 +801,10 @@ void JavaScriptFrame::GetFunctions(List<JSFunction*>* functions) const {
void JavaScriptFrame::Summarize(List<FrameSummary>* functions) {
DCHECK(functions->length() == 0);
- Code* code_pointer = LookupCode();
- int offset = static_cast<int>(pc() - code_pointer->address());
- FrameSummary summary(receiver(),
- function(),
- code_pointer,
- offset,
+ Code* code = LookupCode();
+ int offset = static_cast<int>(pc() - code->instruction_start());
+ AbstractCode* abstract_code = AbstractCode::cast(code);
+ FrameSummary summary(receiver(), function(), abstract_code, offset,
IsConstructor());
functions->Add(summary);
}
@@ -831,7 +829,7 @@ void JavaScriptFrame::PrintFunctionAndOffset(JSFunction* function, Code* code,
PrintF(file, "+%d", code_offset);
if (print_line_number) {
SharedFunctionInfo* shared = function->shared();
- int source_pos = code->SourcePosition(pc);
+ int source_pos = code->SourcePosition(code_offset);
Object* maybe_script = shared->script();
if (maybe_script->IsScript()) {
Script* script = Script::cast(maybe_script);
@@ -901,26 +899,30 @@ void JavaScriptFrame::RestoreOperandStack(FixedArray* store) {
}
}
-
-FrameSummary::FrameSummary(Object* receiver, JSFunction* function, Code* code,
- int offset, bool is_constructor)
+FrameSummary::FrameSummary(Object* receiver, JSFunction* function,
+ AbstractCode* abstract_code, int code_offset,
+ bool is_constructor)
: receiver_(receiver, function->GetIsolate()),
function_(function),
- code_(code),
- offset_(offset),
+ abstract_code_(abstract_code),
+ code_offset_(code_offset),
is_constructor_(is_constructor) {}
-
void FrameSummary::Print() {
PrintF("receiver: ");
receiver_->ShortPrint();
PrintF("\nfunction: ");
function_->shared()->DebugName()->ShortPrint();
PrintF("\ncode: ");
- code_->ShortPrint();
- if (code_->kind() == Code::FUNCTION) PrintF(" NON-OPT");
- if (code_->kind() == Code::OPTIMIZED_FUNCTION) PrintF(" OPT");
- PrintF("\npc: %d\n", offset_);
+ abstract_code_->ShortPrint();
+ if (abstract_code_->IsCode()) {
+ Code* code = abstract_code_->GetCode();
+ if (code->kind() == Code::FUNCTION) PrintF(" UNOPT ");
+ if (code->kind() == Code::OPTIMIZED_FUNCTION) PrintF(" OPT ");
+ } else {
+ PrintF(" BYTECODE ");
+ }
+ PrintF("\npc: %d\n", code_offset_);
}
@@ -999,24 +1001,26 @@ void OptimizedFrame::Summarize(List<FrameSummary>* frames) {
receiver = isolate()->heap()->undefined_value();
}
- Code* const code = shared_info->code();
+ AbstractCode* abstract_code;
- unsigned pc_offset;
+ unsigned code_offset;
if (frame_opcode == Translation::JS_FRAME) {
+ Code* code = shared_info->code();
DeoptimizationOutputData* const output_data =
DeoptimizationOutputData::cast(code->deoptimization_data());
unsigned const entry =
Deoptimizer::GetOutputInfo(output_data, ast_id, shared_info);
- pc_offset =
- FullCodeGenerator::PcField::decode(entry) + Code::kHeaderSize;
- DCHECK_NE(0U, pc_offset);
+ code_offset = FullCodeGenerator::PcField::decode(entry);
+ abstract_code = AbstractCode::cast(code);
} else {
// TODO(rmcilroy): Modify FrameSummary to enable us to summarize
// based on the BytecodeArray and bytecode offset.
DCHECK_EQ(frame_opcode, Translation::INTERPRETED_FRAME);
- pc_offset = 0;
+ code_offset = 0;
+ abstract_code = AbstractCode::cast(shared_info->bytecode_array());
}
- FrameSummary summary(receiver, function, code, pc_offset, is_constructor);
+ FrameSummary summary(receiver, function, abstract_code, code_offset,
+ is_constructor);
frames->Add(summary);
is_constructor = false;
} else if (frame_opcode == Translation::CONSTRUCT_STUB_FRAME) {
@@ -1159,6 +1163,14 @@ void InterpretedFrame::PatchBytecodeOffset(int new_offset) {
SetExpression(index, Smi::FromInt(raw_offset));
}
+void InterpretedFrame::Summarize(List<FrameSummary>* functions) {
+ DCHECK(functions->length() == 0);
+ AbstractCode* abstract_code =
+ AbstractCode::cast(function()->shared()->bytecode_array());
+ FrameSummary summary(receiver(), function(), abstract_code,
+ GetBytecodeOffset(), IsConstructor());
+ functions->Add(summary);
+}
int ArgumentsAdaptorFrame::GetNumberOfIncomingArguments() const {
return Smi::cast(GetExpression(0))->value();
@@ -1244,7 +1256,8 @@ void JavaScriptFrame::Print(StringStream* accumulator,
Address pc = this->pc();
if (code != NULL && code->kind() == Code::FUNCTION &&
pc >= code->instruction_start() && pc < code->instruction_end()) {
- int source_pos = code->SourcePosition(pc);
+ int offset = static_cast<int>(pc - code->instruction_start());
+ int source_pos = code->SourcePosition(offset);
int line = script->GetLineNumber(source_pos) + 1;
accumulator->Add(":%d", line);
} else {
« no previous file with comments | « src/frames.h ('k') | src/heap/heap.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698