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

Unified Diff: runtime/vm/object.cc

Issue 51653006: Track live instance and allocation counts for classes (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 side-by-side diff with in-line comments
Download patch
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/pages.h » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: runtime/vm/object.cc
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc
index 8d80c1d9e1450c9a94061711bb5dc84c9aa7459b..1e8aa672fc43d3f92cfbe4dd795fddc12f0c340d 100644
--- a/runtime/vm/object.cc
+++ b/runtime/vm/object.cc
@@ -285,15 +285,26 @@ RawString* String::IdentifierPrettyName(const String& name) {
intptr_t start = 0;
intptr_t dot_pos = -1; // Position of '.' in the name, if any.
bool is_setter = false;
-
for (intptr_t i = start; i < len; i++) {
if (unmangled_name.CharAt(i) == ':') {
+ if (start != 0) {
+ // Reset and break.
+ start = 0;
+ dot_pos = -1;
+ break;
+ }
ASSERT(start == 0); // Only one : is possible in getters or setters.
if (unmangled_name.CharAt(0) == 's') {
is_setter = true;
}
start = i + 1;
} else if (unmangled_name.CharAt(i) == '.') {
+ if (dot_pos != -1) {
+ // Reset and break.
+ start = 0;
+ dot_pos = -1;
+ break;
+ }
ASSERT(dot_pos == -1); // Only one dot is supported.
dot_pos = i;
}
@@ -1472,6 +1483,11 @@ RawObject* Object::Allocate(intptr_t cls_id,
Exceptions::Throw(exception);
UNREACHABLE();
}
+ if (space == Heap::kNew) {
+ isolate->class_table()->UpdateAllocatedNew(cls_id, size);
+ } else {
+ isolate->class_table()->UpdateAllocatedOld(cls_id, size);
+ }
NoGCScope no_gc;
InitializeObject(address, cls_id, size);
RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag);
@@ -1540,75 +1556,8 @@ RawString* Class::Name() const {
RawString* Class::UserVisibleName() const {
- if (FLAG_show_internal_names) {
- return Name();
- }
- switch (id()) {
- case kIntegerCid:
- case kSmiCid:
- case kMintCid:
- case kBigintCid:
- return Symbols::Int().raw();
- case kDoubleCid:
- return Symbols::Double().raw();
- case kOneByteStringCid:
- case kTwoByteStringCid:
- case kExternalOneByteStringCid:
- case kExternalTwoByteStringCid:
- return Symbols::New("String");
- case kArrayCid:
- case kImmutableArrayCid:
- case kGrowableObjectArrayCid:
- return Symbols::List().raw();
- case kFloat32x4Cid:
- return Symbols::Float32x4().raw();
- case kInt32x4Cid:
- return Symbols::Int32x4().raw();
- case kTypedDataInt8ArrayCid:
- case kExternalTypedDataInt8ArrayCid:
- return Symbols::Int8List().raw();
- case kTypedDataUint8ArrayCid:
- case kExternalTypedDataUint8ArrayCid:
- return Symbols::Uint8List().raw();
- case kTypedDataUint8ClampedArrayCid:
- case kExternalTypedDataUint8ClampedArrayCid:
- return Symbols::Uint8ClampedList().raw();
- case kTypedDataInt16ArrayCid:
- case kExternalTypedDataInt16ArrayCid:
- return Symbols::Int16List().raw();
- case kTypedDataUint16ArrayCid:
- case kExternalTypedDataUint16ArrayCid:
- return Symbols::Uint16List().raw();
- case kTypedDataInt32ArrayCid:
- case kExternalTypedDataInt32ArrayCid:
- return Symbols::Int32List().raw();
- case kTypedDataUint32ArrayCid:
- case kExternalTypedDataUint32ArrayCid:
- return Symbols::Uint32List().raw();
- case kTypedDataInt64ArrayCid:
- case kExternalTypedDataInt64ArrayCid:
- return Symbols::Int64List().raw();
- case kTypedDataUint64ArrayCid:
- case kExternalTypedDataUint64ArrayCid:
- return Symbols::Uint64List().raw();
- case kTypedDataFloat32x4ArrayCid:
- case kExternalTypedDataFloat32x4ArrayCid:
- return Symbols::Float32x4List().raw();
- case kTypedDataFloat32ArrayCid:
- case kExternalTypedDataFloat32ArrayCid:
- return Symbols::Float32List().raw();
- case kTypedDataFloat64ArrayCid:
- case kExternalTypedDataFloat64ArrayCid:
- return Symbols::Float64List().raw();
- default:
- if (!IsCanonicalSignatureClass()) {
- const String& name = String::Handle(Name());
- return String::IdentifierPrettyName(name);
- } else {
- return Name();
- }
- }
- UNREACHABLE();
+ ASSERT(raw_ptr()->user_name_ != String::null());
+ return raw_ptr()->user_name_;
}
@@ -2792,6 +2741,159 @@ RawClass* Class::NewExternalTypedDataClass(intptr_t class_id) {
void Class::set_name(const String& value) const {
ASSERT(value.IsSymbol());
StorePointer(&raw_ptr()->name_, value.raw());
+ if (raw_ptr()->user_name_ == String::null()) {
+ // TODO(johnmccutchan): Eagerly set user name for VM isolate classes,
+ // lazily set user name for the other classes.
+ // Generate and set user_name.
+ const String& user_name = String::Handle(GenerateUserVisibleName());
+ set_user_name(user_name);
+ }
+}
+
+
+void Class::set_user_name(const String& value) const {
+ StorePointer(&raw_ptr()->user_name_, value.raw());
+}
+
+
+RawString* Class::GenerateUserVisibleName() const {
+ if (FLAG_show_internal_names) {
+ return Name();
+ }
+ switch (id()) {
+ case kNullCid:
+ return Symbols::Null().raw();
+ case kDynamicCid:
+ return Symbols::Dynamic().raw();
+ case kVoidCid:
+ return Symbols::Void().raw();
+ case kClassCid:
+ return Symbols::Class().raw();
+ case kUnresolvedClassCid:
+ return Symbols::UnresolvedClass().raw();
+ case kTypeArgumentsCid:
+ return Symbols::TypeArguments().raw();
+ case kInstantiatedTypeArgumentsCid:
+ return Symbols::InstantiatedTypeArguments().raw();
+ case kPatchClassCid:
+ return Symbols::PatchClass().raw();
+ case kFunctionCid:
+ return Symbols::Function().raw();
+ case kClosureDataCid:
+ return Symbols::ClosureData().raw();
+ case kRedirectionDataCid:
+ return Symbols::RedirectionData().raw();
+ case kFieldCid:
+ return Symbols::Field().raw();
+ case kLiteralTokenCid:
+ return Symbols::LiteralToken().raw();
+ case kTokenStreamCid:
+ return Symbols::TokenStream().raw();
+ case kScriptCid:
+ return Symbols::Script().raw();
+ case kLibraryCid:
+ return Symbols::Library().raw();
+ case kLibraryPrefixCid:
+ return Symbols::LibraryPrefix().raw();
+ case kNamespaceCid:
+ return Symbols::Namespace().raw();
+ case kCodeCid:
+ return Symbols::Code().raw();
+ case kInstructionsCid:
+ return Symbols::Instructions().raw();
+ case kPcDescriptorsCid:
+ return Symbols::PcDescriptors().raw();
+ case kStackmapCid:
+ return Symbols::Stackmap().raw();
+ case kLocalVarDescriptorsCid:
+ return Symbols::LocalVarDescriptors().raw();
+ case kExceptionHandlersCid:
+ return Symbols::ExceptionHandlers().raw();
+ case kDeoptInfoCid:
+ return Symbols::DeoptInfo().raw();
+ case kContextCid:
+ return Symbols::Context().raw();
+ case kContextScopeCid:
+ return Symbols::ContextScope().raw();
+ case kICDataCid:
+ return Symbols::ICData().raw();
+ case kMegamorphicCacheCid:
+ return Symbols::MegamorphicCache().raw();
+ case kSubtypeTestCacheCid:
+ return Symbols::SubtypeTestCache().raw();
+ case kApiErrorCid:
+ return Symbols::ApiError().raw();
+ case kLanguageErrorCid:
+ return Symbols::LanguageError().raw();
+ case kUnhandledExceptionCid:
+ return Symbols::UnhandledException().raw();
+ case kUnwindErrorCid:
+ return Symbols::UnwindError().raw();
+ case kIntegerCid:
+ case kSmiCid:
+ case kMintCid:
+ case kBigintCid:
+ return Symbols::Int().raw();
+ case kDoubleCid:
+ return Symbols::Double().raw();
+ case kOneByteStringCid:
+ case kTwoByteStringCid:
+ case kExternalOneByteStringCid:
+ case kExternalTwoByteStringCid:
+ return Symbols::_String().raw();
+ case kArrayCid:
+ case kImmutableArrayCid:
+ case kGrowableObjectArrayCid:
+ return Symbols::List().raw();
+ case kFloat32x4Cid:
+ return Symbols::Float32x4().raw();
+ case kInt32x4Cid:
+ return Symbols::Int32x4().raw();
+ case kTypedDataInt8ArrayCid:
+ case kExternalTypedDataInt8ArrayCid:
+ return Symbols::Int8List().raw();
+ case kTypedDataUint8ArrayCid:
+ case kExternalTypedDataUint8ArrayCid:
+ return Symbols::Uint8List().raw();
+ case kTypedDataUint8ClampedArrayCid:
+ case kExternalTypedDataUint8ClampedArrayCid:
+ return Symbols::Uint8ClampedList().raw();
+ case kTypedDataInt16ArrayCid:
+ case kExternalTypedDataInt16ArrayCid:
+ return Symbols::Int16List().raw();
+ case kTypedDataUint16ArrayCid:
+ case kExternalTypedDataUint16ArrayCid:
+ return Symbols::Uint16List().raw();
+ case kTypedDataInt32ArrayCid:
+ case kExternalTypedDataInt32ArrayCid:
+ return Symbols::Int32List().raw();
+ case kTypedDataUint32ArrayCid:
+ case kExternalTypedDataUint32ArrayCid:
+ return Symbols::Uint32List().raw();
+ case kTypedDataInt64ArrayCid:
+ case kExternalTypedDataInt64ArrayCid:
+ return Symbols::Int64List().raw();
+ case kTypedDataUint64ArrayCid:
+ case kExternalTypedDataUint64ArrayCid:
+ return Symbols::Uint64List().raw();
+ case kTypedDataFloat32x4ArrayCid:
+ case kExternalTypedDataFloat32x4ArrayCid:
+ return Symbols::Float32x4List().raw();
+ case kTypedDataFloat32ArrayCid:
+ case kExternalTypedDataFloat32ArrayCid:
+ return Symbols::Float32List().raw();
+ case kTypedDataFloat64ArrayCid:
+ case kExternalTypedDataFloat64ArrayCid:
+ return Symbols::Float64List().raw();
+ default:
+ if (!IsCanonicalSignatureClass()) {
+ const String& name = String::Handle(Name());
+ return String::IdentifierPrettyName(name);
+ } else {
+ return Name();
+ }
+ }
+ UNREACHABLE();
}
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/pages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698