Index: runtime/vm/object.cc |
diff --git a/runtime/vm/object.cc b/runtime/vm/object.cc |
index b36a95daa2db715ead740213c1553a7f1f1a79b3..a4aeb27dd1848520371ed11a001b550aff95bfc1 100644 |
--- a/runtime/vm/object.cc |
+++ b/runtime/vm/object.cc |
@@ -213,12 +213,15 @@ static const char* MergeSubStrings(Zone* zone, |
// _MyClass@6328321. -> _MyClass |
// _MyClass@6328321.named -> _MyClass.named |
// |
-RawString* String::IdentifierPrettyName(const String& name) { |
+RawString* String::ScrubName(const String& name) { |
Zone* zone = Thread::Current()->zone(); |
+ |
+NOT_IN_PRODUCT( |
if (name.Equals(Symbols::TopLevel())) { |
// Name of invisible top-level class. |
return Symbols::Empty().raw(); |
} |
+) |
const char* cname = name.ToCString(); |
ASSERT(strlen(cname) == static_cast<size_t>(name.Length())); |
@@ -263,6 +266,7 @@ RawString* String::IdentifierPrettyName(const String& name) { |
unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len); |
} |
+NOT_IN_PRODUCT( |
intptr_t len = sum_segment_len; |
intptr_t start = 0; |
intptr_t dot_pos = -1; // Position of '.' in the name, if any. |
@@ -311,12 +315,14 @@ RawString* String::IdentifierPrettyName(const String& name) { |
} |
unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len); |
+) |
return Symbols::New(unmangled_name); |
} |
-RawString* String::IdentifierPrettyNameRetainPrivate(const String& name) { |
+RawString* String::ScrubNameRetainPrivate(const String& name) { |
+NOT_IN_PRODUCT( |
intptr_t len = name.Length(); |
intptr_t start = 0; |
intptr_t at_pos = -1; // Position of '@' in the name, if any. |
@@ -359,6 +365,8 @@ RawString* String::IdentifierPrettyNameRetainPrivate(const String& name) { |
} |
return result.raw(); |
+) |
+ return name.raw(); // In PRODUCT, return argument unchanged. |
} |
@@ -1094,11 +1102,11 @@ RawError* Object::Init(Isolate* isolate) { |
Thread* thread = Thread::Current(); |
Zone* zone = thread->zone(); |
ASSERT(isolate == thread->isolate()); |
-#ifndef PRODUCT |
+NOT_IN_PRODUCT( |
TimelineDurationScope tds(thread, |
isolate->GetIsolateStream(), |
"Object::Init"); |
-#endif |
+) |
#if defined(DART_NO_SNAPSHOT) |
// Object::Init version when we are running in a version of dart that does |
@@ -1372,7 +1380,8 @@ NOT_IN_PRODUCT( |
ASSERT(lib.raw() == Library::MirrorsLibrary()); |
cls = Class::New<MirrorReference>(); |
- RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib)); |
+ RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib); |
+) |
// Pre-register the collection library so we can place the vm class |
// LinkedHashMap there rather than the core library. |
@@ -1914,18 +1923,17 @@ RawString* Class::Name() const { |
} |
-RawString* Class::PrettyName() const { |
- return GeneratePrettyName(); |
+RawString* Class::ScrubbedName() const { |
+ return String::ScrubName(String::Handle(Name())); |
} |
RawString* Class::UserVisibleName() const { |
-#if defined(PRODUCT) |
- return raw_ptr()->name_; |
-#else // defined(PRODUCT) |
+NOT_IN_PRODUCT( |
ASSERT(raw_ptr()->user_name_ != String::null()); |
return raw_ptr()->user_name_; |
-#endif // defined(PRODUCT) |
+) |
+ return GenerateUserVisibleName(); // No caching in PRODUCT, regenerate. |
} |
@@ -3158,6 +3166,7 @@ RawClass* Class::NewExternalTypedDataClass(intptr_t class_id) { |
void Class::set_name(const String& value) const { |
+ ASSERT(raw_ptr()->name_ == String::null()); |
ASSERT(value.IsSymbol()); |
StorePointer(&raw_ptr()->name_, value.raw()); |
NOT_IN_PRODUCT( |
@@ -3179,16 +3188,11 @@ void Class::set_user_name(const String& value) const { |
) |
-RawString* Class::GeneratePrettyName() const { |
- const String& name = String::Handle(Name()); |
- return String::IdentifierPrettyName(name); |
-} |
- |
- |
RawString* Class::GenerateUserVisibleName() const { |
if (FLAG_show_internal_names) { |
return Name(); |
} |
+NOT_IN_PRODUCT( |
switch (id()) { |
case kNullCid: |
return Symbols::Null().raw(); |
@@ -3320,11 +3324,10 @@ RawString* Class::GenerateUserVisibleName() const { |
case kTypedDataFloat64ArrayCid: |
case kExternalTypedDataFloat64ArrayCid: |
return Symbols::Float64List().raw(); |
- default: |
- const String& name = String::Handle(Name()); |
- return String::IdentifierPrettyName(name); |
} |
- UNREACHABLE(); |
+) |
+ const String& name = String::Handle(Name()); |
+ return String::ScrubName(name); |
} |
@@ -6652,68 +6655,36 @@ bool Function::HasOptimizedCode() const { |
} |
-RawString* Function::PrettyName() const { |
- const String& str = String::Handle(name()); |
- return String::IdentifierPrettyName(str); |
-} |
- |
- |
-const char* Function::QualifiedUserVisibleNameCString() const { |
- const String& str = String::Handle(QualifiedUserVisibleName()); |
- return str.ToCString(); |
-} |
- |
- |
RawString* Function::UserVisibleName() const { |
- return PrettyName(); |
+ if (FLAG_show_internal_names) { |
+ return name(); |
+ } |
+ return String::ScrubName(String::Handle(name())); |
} |
-RawString* Function::QualifiedPrettyName() const { |
- String& tmp = String::Handle(); |
- const Class& cls = Class::Handle(Owner()); |
- |
+RawString* Function::QualifiedName(NameVisibility name_visibility) const { |
+ ASSERT(name_visibility != kInternalName); // We never request it. |
+ // A function's scrubbed name and its user visible name are identical. |
+ String& result = String::Handle(UserVisibleName()); |
if (IsClosureFunction()) { |
- if (IsLocalFunction() && !IsImplicitClosureFunction()) { |
- const Function& parent = Function::Handle(parent_function()); |
- tmp = parent.QualifiedPrettyName(); |
- } else { |
- return PrettyName(); |
- } |
- } else { |
- if (cls.IsTopLevel()) { |
- return PrettyName(); |
- } else { |
- tmp = cls.PrettyName(); |
+ Function& fun = Function::Handle(raw()); |
+ while (fun.IsLocalFunction() && !fun.IsImplicitClosureFunction()) { |
+ fun = fun.parent_function(); |
+ result = String::Concat(Symbols::Dot(), result, Heap::kOld); |
+ result = String::Concat( |
+ String::Handle(fun.UserVisibleName()), result, Heap::kOld); |
} |
} |
- tmp = String::Concat(tmp, Symbols::Dot(), Heap::kOld); |
- const String& suffix = String::Handle(PrettyName()); |
- return String::Concat(tmp, suffix, Heap::kOld); |
-} |
- |
- |
-RawString* Function::QualifiedUserVisibleName() const { |
- String& tmp = String::Handle(); |
const Class& cls = Class::Handle(Owner()); |
- |
- if (IsClosureFunction()) { |
- if (IsLocalFunction() && !IsImplicitClosureFunction()) { |
- const Function& parent = Function::Handle(parent_function()); |
- tmp = parent.QualifiedUserVisibleName(); |
- } else { |
- return UserVisibleName(); |
- } |
- } else { |
- if (cls.IsTopLevel()) { |
- return UserVisibleName(); |
- } else { |
- tmp = cls.UserVisibleName(); |
- } |
+ if (!cls.IsTopLevel()) { |
+ result = String::Concat(Symbols::Dot(), result, Heap::kOld); |
+ const String& cls_name = String::Handle( |
+ name_visibility == kScrubbedName ? cls.ScrubbedName() |
+ : cls.UserVisibleName()); |
+ result = String::Concat(cls_name, result, Heap::kOld); |
} |
- tmp = String::Concat(tmp, Symbols::Dot()); |
- const String& suffix = String::Handle(UserVisibleName()); |
- return String::Concat(tmp, suffix); |
+ return result.raw(); |
} |
@@ -7205,14 +7176,11 @@ RawField* Field::Clone(const Class& new_owner) const { |
} |
-RawString* Field::PrettyName() const { |
- const String& str = String::Handle(name()); |
- return String::IdentifierPrettyName(str); |
-} |
- |
- |
RawString* Field::UserVisibleName() const { |
- return PrettyName(); |
+ if (FLAG_show_internal_names) { |
+ return name(); |
+ } |
+ return String::ScrubName(String::Handle(name())); |
} |
@@ -8969,7 +8937,7 @@ static RawString* MakeFunctionMetaName(const Function& func) { |
GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
pieces.Add(cname); |
pieces.Add(Symbols::At()); |
- pieces.Add(String::Handle(func.QualifiedPrettyName())); |
+ pieces.Add(String::Handle(func.QualifiedScrubbedName())); |
return Symbols::FromConcatAll(pieces); |
} |
@@ -13029,7 +12997,6 @@ const char* Code::ToCString() const { |
} |
-// Called by disassembler. |
RawString* Code::Name() const { |
const Object& obj = Object::Handle(owner()); |
if (obj.IsNull()) { |
@@ -13041,36 +13008,23 @@ RawString* Code::Name() const { |
} else if (obj.IsClass()) { |
// Allocation stub. |
const Class& cls = Class::Cast(obj); |
- String& cls_name = String::Handle(cls.Name()); |
+ String& cls_name = String::Handle(cls.ScrubbedName()); |
ASSERT(!cls_name.IsNull()); |
return Symbols::FromConcat(Symbols::AllocationStubFor(), cls_name); |
} else { |
ASSERT(obj.IsFunction()); |
// Dart function. |
- return Function::Cast(obj).name(); |
+ return Function::Cast(obj).UserVisibleName(); // Same as scrubbed name. |
} |
} |
-RawString* Code::PrettyName() const { |
+RawString* Code::QualifiedName() const { |
const Object& obj = Object::Handle(owner()); |
- if (obj.IsNull()) { |
- // Regular stub. |
- const char* name = StubCode::NameOfStub(EntryPoint()); |
- ASSERT(name != NULL); |
- const String& stub_name = String::Handle(String::New(name)); |
- return String::Concat(Symbols::StubPrefix(), stub_name); |
- } else if (obj.IsClass()) { |
- // Allocation stub. |
- const Class& cls = Class::Cast(obj); |
- String& cls_name = String::Handle(cls.Name()); |
- ASSERT(!cls_name.IsNull()); |
- return String::Concat(Symbols::AllocationStubFor(), cls_name); |
- } else { |
- ASSERT(obj.IsFunction()); |
- // Dart function. |
- return Function::Cast(obj).QualifiedPrettyName(); |
+ if (obj.IsFunction()) { |
+ return Function::Cast(obj).QualifiedScrubbedName(); |
} |
+ return Name(); |
} |
@@ -14782,13 +14736,12 @@ bool AbstractType::TestAndAddBuddyToTrail(TrailPtr* trail, |
RawString* AbstractType::BuildName(NameVisibility name_visibility) const { |
+ ASSERT(name_visibility != kScrubbedName); |
Zone* zone = Thread::Current()->zone(); |
if (IsBoundedType()) { |
const AbstractType& type = AbstractType::Handle( |
BoundedType::Cast(*this).type()); |
- if (name_visibility == kPrettyName) { |
- return type.BuildName(kPrettyName); |
- } else if (name_visibility == kUserVisibleName) { |
+ if (name_visibility == kUserVisibleName) { |
return type.BuildName(kUserVisibleName); |
} |
GrowableHandlePtrArray<const String> pieces(zone, 5); |
@@ -14858,8 +14811,6 @@ RawString* AbstractType::BuildName(NameVisibility name_visibility) const { |
} |
if (name_visibility == kInternalName) { |
class_name = cls.Name(); |
- } else if (name_visibility == kPrettyName) { |
- class_name = cls.PrettyName(); |
} else { |
ASSERT(name_visibility == kUserVisibleName); |
// Map internal types to their corresponding public interfaces. |