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

Side by Side Diff: runtime/vm/object.cc

Issue 100103011: Changes to support dprof and Observatory profiler UIs (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 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 unified diff | Download patch | Annotate | Revision Log
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 #include "vm/object.h" 5 #include "vm/object.h"
6 6
7 #include "include/dart_api.h" 7 #include "include/dart_api.h"
8 #include "platform/assert.h" 8 #include "platform/assert.h"
9 #include "vm/assembler.h" 9 #include "vm/assembler.h"
10 #include "vm/cpu.h" 10 #include "vm/cpu.h"
(...skipping 5693 matching lines...) Expand 10 before | Expand all | Expand 10 after
5704 static_str, abstract_str, kind_str, const_str); 5704 static_str, abstract_str, kind_str, const_str);
5705 return chars; 5705 return chars;
5706 } 5706 }
5707 5707
5708 5708
5709 void Function::PrintToJSONStream(JSONStream* stream, bool ref) const { 5709 void Function::PrintToJSONStream(JSONStream* stream, bool ref) const {
5710 const char* internal_function_name = String::Handle(name()).ToCString(); 5710 const char* internal_function_name = String::Handle(name()).ToCString();
5711 const char* function_name = 5711 const char* function_name =
5712 String::Handle(QualifiedUserVisibleName()).ToCString(); 5712 String::Handle(QualifiedUserVisibleName()).ToCString();
5713 Class& cls = Class::Handle(Owner()); 5713 Class& cls = Class::Handle(Owner());
5714 ASSERT(!cls.IsNull());
5714 Error& err = Error::Handle(); 5715 Error& err = Error::Handle();
5715 err ^= cls.EnsureIsFinalized(Isolate::Current()); 5716 err ^= cls.EnsureIsFinalized(Isolate::Current());
5716 ASSERT(err.IsNull()); 5717 ASSERT(err.IsNull());
5717 const Function& func = *this; 5718 const Function& func = *this;
5718 intptr_t id; 5719 intptr_t id;
5719 if (IsNonImplicitClosureFunction()) { 5720 if (IsNonImplicitClosureFunction()) {
5720 id = cls.FindClosureIndex(token_pos()); 5721 id = cls.FindClosureIndex(token_pos());
5721 } else { 5722 } else {
5722 id = cls.FindFunctionIndex(func); 5723 id = cls.FindFunctionIndex(func);
5723 } 5724 }
5725 bool object_ref = id < 0;
Ivan Posva 2013/12/30 23:06:09 Please handle implicit closure functions as discus
5726 if (object_ref) {
5727 // We do not have a stable way of referencing this function,
5728 // generate a temporary id.
5729 ObjectIdRing* ring = Isolate::Current()->object_id_ring();
5730 id = ring->GetIdForObject(raw());
5731 }
5724 ASSERT(id >= 0); 5732 ASSERT(id >= 0);
5725 intptr_t cid = cls.id(); 5733 intptr_t cid = cls.id();
5726 JSONObject jsobj(stream); 5734 JSONObject jsobj(stream);
5727 jsobj.AddProperty("type", JSONType(ref)); 5735 jsobj.AddProperty("type", JSONType(ref));
5728 if (IsNonImplicitClosureFunction()) { 5736 if (object_ref) {
5737 jsobj.AddPropertyF("id", "objects/%" Pd "", id);
5738 } else if (IsNonImplicitClosureFunction()) {
5729 jsobj.AddPropertyF("id", "classes/%" Pd "/closures/%" Pd "", cid, id); 5739 jsobj.AddPropertyF("id", "classes/%" Pd "/closures/%" Pd "", cid, id);
5730 } else { 5740 } else {
5731 jsobj.AddPropertyF("id", "classes/%" Pd "/functions/%" Pd "", cid, id); 5741 jsobj.AddPropertyF("id", "classes/%" Pd "/functions/%" Pd "", cid, id);
5732 } 5742 }
5733 jsobj.AddProperty("name", internal_function_name); 5743 jsobj.AddProperty("name", internal_function_name);
5734 jsobj.AddProperty("user_name", function_name); 5744 jsobj.AddProperty("user_name", function_name);
5735 if (ref) return; 5745 if (ref) return;
5736 jsobj.AddProperty("is_static", is_static()); 5746 jsobj.AddProperty("is_static", is_static());
5737 jsobj.AddProperty("is_const", is_const()); 5747 jsobj.AddProperty("is_const", is_const());
5738 jsobj.AddProperty("is_optimizable", is_optimizable()); 5748 jsobj.AddProperty("is_optimizable", is_optimizable());
(...skipping 3946 matching lines...) Expand 10 before | Expand all | Expand 10 after
9685 ASSERT(i >= 0); 9695 ASSERT(i >= 0);
9686 const Array& array = 9696 const Array& array =
9687 Array::Handle(raw_ptr()->static_calls_target_table_); 9697 Array::Handle(raw_ptr()->static_calls_target_table_);
9688 ASSERT(code.IsNull() || 9698 ASSERT(code.IsNull() ||
9689 (code.function() == array.At(i + kSCallTableFunctionEntry))); 9699 (code.function() == array.At(i + kSCallTableFunctionEntry)));
9690 array.SetAt(i + kSCallTableCodeEntry, code); 9700 array.SetAt(i + kSCallTableCodeEntry, code);
9691 } 9701 }
9692 9702
9693 9703
9694 void Code::Disassemble() const { 9704 void Code::Disassemble() const {
9705 const bool fix_patch = CodePatcher::CodeIsPatchable(*this) &&
9706 CodePatcher::IsEntryPatched(*this);
9707 if (fix_patch) {
9708 // Undo the patch.
9709 CodePatcher::RestoreEntry(*this);
9710 }
srdjan 2013/12/30 17:54:46 Add comment that restore/repatch is necesseary to
Cutch 2013/12/30 21:32:40 Done.
9695 const Instructions& instr = Instructions::Handle(instructions()); 9711 const Instructions& instr = Instructions::Handle(instructions());
9696 uword start = instr.EntryPoint(); 9712 uword start = instr.EntryPoint();
9697 Disassembler::Disassemble(start, start + instr.size(), comments()); 9713 Disassembler::Disassemble(start, start + instr.size(), comments());
9714 if (fix_patch) {
9715 // Redo the patch.
9716 CodePatcher::PatchEntry(*this);
9717 }
9698 } 9718 }
9699 9719
9700 9720
9721 void Code::Disassemble(DisassemblyFormatter* formatter) const {
9722 const bool fix_patch = CodePatcher::CodeIsPatchable(*this) &&
9723 CodePatcher::IsEntryPatched(*this);
9724 if (fix_patch) {
9725 // Undo the patch.
9726 CodePatcher::RestoreEntry(*this);
9727 }
9728 const Instructions& instr = Instructions::Handle(instructions());
9729 uword start = instr.EntryPoint();
9730 Disassembler::Disassemble(start, start + instr.size(), formatter, comments());
9731 if (fix_patch) {
9732 // Redo the patch.
9733 CodePatcher::PatchEntry(*this);
9734 }
9735 }
9736
9737
9701 const Code::Comments& Code::comments() const { 9738 const Code::Comments& Code::comments() const {
9702 Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_)); 9739 Comments* comments = new Code::Comments(Array::Handle(raw_ptr()->comments_));
9703 return *comments; 9740 return *comments;
9704 } 9741 }
9705 9742
9706 9743
9707 void Code::set_comments(const Code::Comments& comments) const { 9744 void Code::set_comments(const Code::Comments& comments) const {
9708 ASSERT(comments.comments_.IsOld()); 9745 ASSERT(comments.comments_.IsOld());
9709 StorePointer(&raw_ptr()->comments_, comments.comments_.raw()); 9746 StorePointer(&raw_ptr()->comments_, comments.comments_.raw());
9710 } 9747 }
(...skipping 158 matching lines...) Expand 10 before | Expand all | Expand 10 after
9869 const char* Code::ToCString() const { 9906 const char* Code::ToCString() const {
9870 const char* kFormat = "Code entry:%p"; 9907 const char* kFormat = "Code entry:%p";
9871 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1; 9908 intptr_t len = OS::SNPrint(NULL, 0, kFormat, EntryPoint()) + 1;
9872 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len); 9909 char* chars = Isolate::Current()->current_zone()->Alloc<char>(len);
9873 OS::SNPrint(chars, len, kFormat, EntryPoint()); 9910 OS::SNPrint(chars, len, kFormat, EntryPoint());
9874 return chars; 9911 return chars;
9875 } 9912 }
9876 9913
9877 9914
9878 void Code::PrintToJSONStream(JSONStream* stream, bool ref) const { 9915 void Code::PrintToJSONStream(JSONStream* stream, bool ref) const {
9879 Isolate* isolate = Isolate::Current();
9880 ObjectIdRing* ring = isolate->object_id_ring();
9881 intptr_t id = ring->GetIdForObject(raw());
9882 JSONObject jsobj(stream); 9916 JSONObject jsobj(stream);
9883 jsobj.AddProperty("type", JSONType(ref)); 9917 jsobj.AddProperty("type", JSONType(ref));
9884 jsobj.AddPropertyF("id", "objects/%" Pd "", id); 9918 jsobj.AddPropertyF("id", "code/%" Px "", EntryPoint());
9919 jsobj.AddPropertyF("start", "%" Px "", EntryPoint());
9920 jsobj.AddPropertyF("end", "%" Px "", EntryPoint() + Size());
9885 Function& func = Function::Handle(); 9921 Function& func = Function::Handle();
9922 func ^= function();
9923 ASSERT(!func.IsNull());
9886 String& name = String::Handle(); 9924 String& name = String::Handle();
9887 func ^= function();
9888 ASSERT(!func.IsNull()); 9925 ASSERT(!func.IsNull());
9889 name ^= func.name(); 9926 name ^= func.name();
9890 const char* internal_function_name = name.ToCString(); 9927 const char* internal_function_name = name.ToCString();
9891 jsobj.AddPropertyF("name", "%s%s", is_optimized() ? "*" : "", 9928 jsobj.AddPropertyF("name", "%s%s", is_optimized() ? "*" : "",
9892 internal_function_name); 9929 internal_function_name);
9893 name ^= func.QualifiedUserVisibleName(); 9930 name ^= func.QualifiedUserVisibleName();
9894 const char* function_name = name.ToCString(); 9931 const char* function_name = name.ToCString();
9895 jsobj.AddPropertyF("user_name", "%s%s", is_optimized() ? "*" : "", 9932 jsobj.AddPropertyF("user_name", "%s%s", is_optimized() ? "*" : "",
9896 function_name); 9933 function_name);
9897 if (ref) { 9934 if (ref) {
9898 return; 9935 return;
9899 } 9936 }
9900 jsobj.AddProperty("is_optimized", is_optimized()); 9937 jsobj.AddProperty("is_optimized", is_optimized());
9901 jsobj.AddProperty("is_alive", is_alive()); 9938 jsobj.AddProperty("is_alive", is_alive());
9902 jsobj.AddProperty("function", Object::Handle(function())); 9939 jsobj.AddProperty("function", Object::Handle(function()));
9903 JSONArray jsarr(&jsobj, "disassembly"); 9940 JSONArray jsarr(&jsobj, "disassembly");
9904 DisassembleToJSONStream formatter(jsarr); 9941 DisassembleToJSONStream formatter(jsarr);
9905 const Instructions& instr = Instructions::Handle(instructions()); 9942 Disassemble(&formatter);
9906 uword start = instr.EntryPoint();
9907 Disassembler::Disassemble(start, start + instr.size(), &formatter,
9908 comments());
9909 } 9943 }
9910 9944
9911 9945
9912 uword Code::GetPatchCodePc() const { 9946 uword Code::GetPatchCodePc() const {
9913 const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors()); 9947 const PcDescriptors& descriptors = PcDescriptors::Handle(pc_descriptors());
9914 return descriptors.GetPcForKind(PcDescriptors::kPatchCode); 9948 return descriptors.GetPcForKind(PcDescriptors::kPatchCode);
9915 } 9949 }
9916 9950
9917 9951
9918 uword Code::GetLazyDeoptPc() const { 9952 uword Code::GetLazyDeoptPc() const {
(...skipping 6863 matching lines...) Expand 10 before | Expand all | Expand 10 after
16782 return "_MirrorReference"; 16816 return "_MirrorReference";
16783 } 16817 }
16784 16818
16785 16819
16786 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { 16820 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const {
16787 Instance::PrintToJSONStream(stream, ref); 16821 Instance::PrintToJSONStream(stream, ref);
16788 } 16822 }
16789 16823
16790 16824
16791 } // namespace dart 16825 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698