From f7563019c78c480858d195bb555f418e75fd9f46 Mon Sep 17 00:00:00 2001 From: "danno@chromium.org" Date: Thu, 20 Oct 2011 09:38:24 +0000 Subject: [PATCH] Add flag to trace element kind transitions Currently only traces transitions from generated ia32 code. BUG=none TEST=none Review URL: http://codereview.chromium.org/8357004 git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9715 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/code-stubs.cc | 2 +- src/code-stubs.h | 3 +- src/flag-definitions.h | 3 + src/frames.cc | 63 +++++++ src/frames.h | 2 + src/ia32/code-stubs-ia32.cc | 400 +++++++++++++++++++++++--------------------- src/objects-inl.h | 5 + src/objects-printer.cc | 2 +- src/objects.cc | 72 ++++++-- src/objects.h | 8 + src/runtime.cc | 79 +++------ src/runtime.h | 1 + 12 files changed, 374 insertions(+), 266 deletions(-) diff --git a/src/code-stubs.cc b/src/code-stubs.cc index 896ffad..f1b918b 100644 --- a/src/code-stubs.cc +++ b/src/code-stubs.cc @@ -418,7 +418,7 @@ bool ToBooleanStub::Types::CanBeUndetectable() const { void FastElementsConversionStub::Generate(MacroAssembler* masm) { if (to_ == FAST_ELEMENTS) { if (from_ == FAST_SMI_ONLY_ELEMENTS) { - GenerateSmiOnlyToObject(masm); + GenerateSmiOnlyToObject(masm, strict_mode_); } else if (from_ == FAST_DOUBLE_ELEMENTS) { GenerateDoubleToObject(masm, strict_mode_); } else { diff --git a/src/code-stubs.h b/src/code-stubs.h index ab582a2..3777bf3 100644 --- a/src/code-stubs.h +++ b/src/code-stubs.h @@ -1054,7 +1054,8 @@ class FastElementsConversionStub : public CodeStub { } void Generate(MacroAssembler* masm); - static void GenerateSmiOnlyToObject(MacroAssembler* masm); + static void GenerateSmiOnlyToObject(MacroAssembler* masm, + StrictModeFlag strict_mode); static void GenerateSmiOnlyToDouble(MacroAssembler* masm, StrictModeFlag strict_mode); static void GenerateDoubleToObject(MacroAssembler* masm, diff --git a/src/flag-definitions.h b/src/flag-definitions.h index 58fab14..c3c0686 100644 --- a/src/flag-definitions.h +++ b/src/flag-definitions.h @@ -527,6 +527,9 @@ DEFINE_bool(ll_prof, false, "Enable low-level linux profiler.") #define FLAG FLAG_READONLY #endif +// elements.cc +DEFINE_bool(trace_elements_transitions, false, "trace elements transitions") + // code-stubs.cc DEFINE_bool(print_code_stubs, false, "print code stubs") diff --git a/src/frames.cc b/src/frames.cc index 412a59c..7c4c573 100644 --- a/src/frames.cc +++ b/src/frames.cc @@ -711,6 +711,69 @@ void JavaScriptFrame::Summarize(List* functions) { } +void JavaScriptFrame::PrintTop(FILE* file, + bool print_args, + bool print_line_number) { + // constructor calls + HandleScope scope; + AssertNoAllocation no_allocation; + JavaScriptFrameIterator it; + while (!it.done()) { + if (it.frame()->is_java_script()) { + JavaScriptFrame* frame = it.frame(); + if (frame->IsConstructor()) PrintF(file, "new "); + // function name + Object* fun = frame->function(); + if (fun->IsJSFunction()) { + SharedFunctionInfo* shared = JSFunction::cast(fun)->shared(); + shared->DebugName()->ShortPrint(file); + if (print_line_number) { + Address pc = frame->pc(); + Code* code = Code::cast( + v8::internal::Isolate::Current()->heap()->FindCodeObject(pc)); + int source_pos = code->SourcePosition(pc); + Object* maybe_script = shared->script(); + if (maybe_script->IsScript()) { + Handle