| OLD | NEW |
| 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 195 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 206 // The trailing . on the default constructor name is dropped: | 206 // The trailing . on the default constructor name is dropped: |
| 207 // | 207 // |
| 208 // List. -> List | 208 // List. -> List |
| 209 // | 209 // |
| 210 // And so forth: | 210 // And so forth: |
| 211 // | 211 // |
| 212 // get:foo@6328321 -> foo | 212 // get:foo@6328321 -> foo |
| 213 // _MyClass@6328321. -> _MyClass | 213 // _MyClass@6328321. -> _MyClass |
| 214 // _MyClass@6328321.named -> _MyClass.named | 214 // _MyClass@6328321.named -> _MyClass.named |
| 215 // | 215 // |
| 216 RawString* String::IdentifierPrettyName(const String& name) { | 216 RawString* String::ScrubName(const String& name) { |
| 217 Zone* zone = Thread::Current()->zone(); | 217 Zone* zone = Thread::Current()->zone(); |
| 218 |
| 219 NOT_IN_PRODUCT( |
| 218 if (name.Equals(Symbols::TopLevel())) { | 220 if (name.Equals(Symbols::TopLevel())) { |
| 219 // Name of invisible top-level class. | 221 // Name of invisible top-level class. |
| 220 return Symbols::Empty().raw(); | 222 return Symbols::Empty().raw(); |
| 221 } | 223 } |
| 224 ) |
| 222 | 225 |
| 223 const char* cname = name.ToCString(); | 226 const char* cname = name.ToCString(); |
| 224 ASSERT(strlen(cname) == static_cast<size_t>(name.Length())); | 227 ASSERT(strlen(cname) == static_cast<size_t>(name.Length())); |
| 225 const intptr_t name_len = name.Length(); | 228 const intptr_t name_len = name.Length(); |
| 226 // First remove all private name mangling. | 229 // First remove all private name mangling. |
| 227 intptr_t start_pos = 0; | 230 intptr_t start_pos = 0; |
| 228 GrowableArray<const char*> unmangled_segments; | 231 GrowableArray<const char*> unmangled_segments; |
| 229 intptr_t sum_segment_len = 0; | 232 intptr_t sum_segment_len = 0; |
| 230 for (intptr_t i = 0; i < name_len; i++) { | 233 for (intptr_t i = 0; i < name_len; i++) { |
| 231 if ((cname[i] == '@') && ((i + 1) < name_len) && | 234 if ((cname[i] == '@') && ((i + 1) < name_len) && |
| (...skipping 24 matching lines...) Expand all Loading... |
| 256 // Append the last segment. | 259 // Append the last segment. |
| 257 const intptr_t segment_len = name.Length() - start_pos; | 260 const intptr_t segment_len = name.Length() - start_pos; |
| 258 sum_segment_len += segment_len; | 261 sum_segment_len += segment_len; |
| 259 AppendSubString(zone, &unmangled_segments, cname, start_pos, segment_len); | 262 AppendSubString(zone, &unmangled_segments, cname, start_pos, segment_len); |
| 260 } | 263 } |
| 261 if (unmangled_name == NULL) { | 264 if (unmangled_name == NULL) { |
| 262 // Merge unmangled_segments. | 265 // Merge unmangled_segments. |
| 263 unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len); | 266 unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len); |
| 264 } | 267 } |
| 265 | 268 |
| 269 NOT_IN_PRODUCT( |
| 266 intptr_t len = sum_segment_len; | 270 intptr_t len = sum_segment_len; |
| 267 intptr_t start = 0; | 271 intptr_t start = 0; |
| 268 intptr_t dot_pos = -1; // Position of '.' in the name, if any. | 272 intptr_t dot_pos = -1; // Position of '.' in the name, if any. |
| 269 bool is_setter = false; | 273 bool is_setter = false; |
| 270 for (intptr_t i = start; i < len; i++) { | 274 for (intptr_t i = start; i < len; i++) { |
| 271 if (unmangled_name[i] == ':') { | 275 if (unmangled_name[i] == ':') { |
| 272 if (start != 0) { | 276 if (start != 0) { |
| 273 // Reset and break. | 277 // Reset and break. |
| 274 start = 0; | 278 start = 0; |
| 275 dot_pos = -1; | 279 dot_pos = -1; |
| (...skipping 28 matching lines...) Expand all Loading... |
| 304 intptr_t final_len = end - start; | 308 intptr_t final_len = end - start; |
| 305 AppendSubString(zone, &unmangled_segments, unmangled_name, start, final_len); | 309 AppendSubString(zone, &unmangled_segments, unmangled_name, start, final_len); |
| 306 if (is_setter) { | 310 if (is_setter) { |
| 307 const char* equals = Symbols::Equals().ToCString(); | 311 const char* equals = Symbols::Equals().ToCString(); |
| 308 const intptr_t equals_len = strlen(equals); | 312 const intptr_t equals_len = strlen(equals); |
| 309 AppendSubString(zone, &unmangled_segments, equals, 0, equals_len); | 313 AppendSubString(zone, &unmangled_segments, equals, 0, equals_len); |
| 310 final_len += equals_len; | 314 final_len += equals_len; |
| 311 } | 315 } |
| 312 | 316 |
| 313 unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len); | 317 unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len); |
| 318 ) |
| 314 | 319 |
| 315 return Symbols::New(unmangled_name); | 320 return Symbols::New(unmangled_name); |
| 316 } | 321 } |
| 317 | 322 |
| 318 | 323 |
| 319 RawString* String::IdentifierPrettyNameRetainPrivate(const String& name) { | 324 RawString* String::ScrubNameRetainPrivate(const String& name) { |
| 325 NOT_IN_PRODUCT( |
| 320 intptr_t len = name.Length(); | 326 intptr_t len = name.Length(); |
| 321 intptr_t start = 0; | 327 intptr_t start = 0; |
| 322 intptr_t at_pos = -1; // Position of '@' in the name, if any. | 328 intptr_t at_pos = -1; // Position of '@' in the name, if any. |
| 323 bool is_setter = false; | 329 bool is_setter = false; |
| 324 | 330 |
| 325 for (intptr_t i = start; i < len; i++) { | 331 for (intptr_t i = start; i < len; i++) { |
| 326 if (name.CharAt(i) == ':') { | 332 if (name.CharAt(i) == ':') { |
| 327 ASSERT(start == 0); // Only one : is possible in getters or setters. | 333 ASSERT(start == 0); // Only one : is possible in getters or setters. |
| 328 if (name.CharAt(0) == 's') { | 334 if (name.CharAt(0) == 's') { |
| 329 is_setter = true; | 335 is_setter = true; |
| (...skipping 22 matching lines...) Expand all Loading... |
| 352 const String& pre_at = | 358 const String& pre_at = |
| 353 String::Handle(String::SubString(result, 0, at_pos - 4)); | 359 String::Handle(String::SubString(result, 0, at_pos - 4)); |
| 354 const String& post_at = | 360 const String& post_at = |
| 355 String::Handle(String::SubString(name, at_pos, len - at_pos)); | 361 String::Handle(String::SubString(name, at_pos, len - at_pos)); |
| 356 result = String::Concat(pre_at, Symbols::Equals()); | 362 result = String::Concat(pre_at, Symbols::Equals()); |
| 357 result = String::Concat(result, post_at); | 363 result = String::Concat(result, post_at); |
| 358 } | 364 } |
| 359 } | 365 } |
| 360 | 366 |
| 361 return result.raw(); | 367 return result.raw(); |
| 368 ) |
| 369 return name.raw(); // In PRODUCT, return argument unchanged. |
| 362 } | 370 } |
| 363 | 371 |
| 364 | 372 |
| 365 template<typename type> | 373 template<typename type> |
| 366 static bool IsSpecialCharacter(type value) { | 374 static bool IsSpecialCharacter(type value) { |
| 367 return ((value == '"') || | 375 return ((value == '"') || |
| 368 (value == '\n') || | 376 (value == '\n') || |
| 369 (value == '\f') || | 377 (value == '\f') || |
| 370 (value == '\b') || | 378 (value == '\b') || |
| 371 (value == '\t') || | 379 (value == '\t') || |
| (...skipping 715 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1087 str = lib.PrivateName(public_class_name); | 1095 str = lib.PrivateName(public_class_name); |
| 1088 cls.set_name(str); | 1096 cls.set_name(str); |
| 1089 lib.AddClass(cls); | 1097 lib.AddClass(cls); |
| 1090 } | 1098 } |
| 1091 | 1099 |
| 1092 | 1100 |
| 1093 RawError* Object::Init(Isolate* isolate) { | 1101 RawError* Object::Init(Isolate* isolate) { |
| 1094 Thread* thread = Thread::Current(); | 1102 Thread* thread = Thread::Current(); |
| 1095 Zone* zone = thread->zone(); | 1103 Zone* zone = thread->zone(); |
| 1096 ASSERT(isolate == thread->isolate()); | 1104 ASSERT(isolate == thread->isolate()); |
| 1097 #ifndef PRODUCT | 1105 NOT_IN_PRODUCT( |
| 1098 TimelineDurationScope tds(thread, | 1106 TimelineDurationScope tds(thread, |
| 1099 isolate->GetIsolateStream(), | 1107 isolate->GetIsolateStream(), |
| 1100 "Object::Init"); | 1108 "Object::Init"); |
| 1101 #endif | 1109 ) |
| 1102 | 1110 |
| 1103 #if defined(DART_NO_SNAPSHOT) | 1111 #if defined(DART_NO_SNAPSHOT) |
| 1104 // Object::Init version when we are running in a version of dart that does | 1112 // Object::Init version when we are running in a version of dart that does |
| 1105 // not have a full snapshot linked in. | 1113 // not have a full snapshot linked in. |
| 1106 ObjectStore* object_store = isolate->object_store(); | 1114 ObjectStore* object_store = isolate->object_store(); |
| 1107 | 1115 |
| 1108 Class& cls = Class::Handle(zone); | 1116 Class& cls = Class::Handle(zone); |
| 1109 Type& type = Type::Handle(zone); | 1117 Type& type = Type::Handle(zone); |
| 1110 Array& array = Array::Handle(zone); | 1118 Array& array = Array::Handle(zone); |
| 1111 Library& lib = Library::Handle(zone); | 1119 Library& lib = Library::Handle(zone); |
| (...skipping 253 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1365 if (lib.IsNull()) { | 1373 if (lib.IsNull()) { |
| 1366 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); | 1374 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); |
| 1367 lib.SetLoadRequested(); | 1375 lib.SetLoadRequested(); |
| 1368 lib.Register(); | 1376 lib.Register(); |
| 1369 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); | 1377 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); |
| 1370 } | 1378 } |
| 1371 ASSERT(!lib.IsNull()); | 1379 ASSERT(!lib.IsNull()); |
| 1372 ASSERT(lib.raw() == Library::MirrorsLibrary()); | 1380 ASSERT(lib.raw() == Library::MirrorsLibrary()); |
| 1373 | 1381 |
| 1374 cls = Class::New<MirrorReference>(); | 1382 cls = Class::New<MirrorReference>(); |
| 1375 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib)); | 1383 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib); |
| 1384 ) |
| 1376 | 1385 |
| 1377 // Pre-register the collection library so we can place the vm class | 1386 // Pre-register the collection library so we can place the vm class |
| 1378 // LinkedHashMap there rather than the core library. | 1387 // LinkedHashMap there rather than the core library. |
| 1379 lib = Library::LookupLibrary(Symbols::DartCollection()); | 1388 lib = Library::LookupLibrary(Symbols::DartCollection()); |
| 1380 if (lib.IsNull()) { | 1389 if (lib.IsNull()) { |
| 1381 lib = Library::NewLibraryHelper(Symbols::DartCollection(), true); | 1390 lib = Library::NewLibraryHelper(Symbols::DartCollection(), true); |
| 1382 lib.SetLoadRequested(); | 1391 lib.SetLoadRequested(); |
| 1383 lib.Register(); | 1392 lib.Register(); |
| 1384 object_store->set_bootstrap_library(ObjectStore::kCollection, lib); | 1393 object_store->set_bootstrap_library(ObjectStore::kCollection, lib); |
| 1385 } | 1394 } |
| (...skipping 521 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1907 | 1916 |
| 1908 | 1917 |
| 1909 RawString* Class::Name() const { | 1918 RawString* Class::Name() const { |
| 1910 // TODO(turnidge): This assert fails for the fake kFreeListElement class. | 1919 // TODO(turnidge): This assert fails for the fake kFreeListElement class. |
| 1911 // Fix this. | 1920 // Fix this. |
| 1912 ASSERT(raw_ptr()->name_ != String::null()); | 1921 ASSERT(raw_ptr()->name_ != String::null()); |
| 1913 return raw_ptr()->name_; | 1922 return raw_ptr()->name_; |
| 1914 } | 1923 } |
| 1915 | 1924 |
| 1916 | 1925 |
| 1917 RawString* Class::PrettyName() const { | 1926 RawString* Class::ScrubbedName() const { |
| 1918 return GeneratePrettyName(); | 1927 return String::ScrubName(String::Handle(Name())); |
| 1919 } | 1928 } |
| 1920 | 1929 |
| 1921 | 1930 |
| 1922 RawString* Class::UserVisibleName() const { | 1931 RawString* Class::UserVisibleName() const { |
| 1923 #if defined(PRODUCT) | 1932 NOT_IN_PRODUCT( |
| 1924 return raw_ptr()->name_; | |
| 1925 #else // defined(PRODUCT) | |
| 1926 ASSERT(raw_ptr()->user_name_ != String::null()); | 1933 ASSERT(raw_ptr()->user_name_ != String::null()); |
| 1927 return raw_ptr()->user_name_; | 1934 return raw_ptr()->user_name_; |
| 1928 #endif // defined(PRODUCT) | 1935 ) |
| 1936 return GenerateUserVisibleName(); // No caching in PRODUCT, regenerate. |
| 1929 } | 1937 } |
| 1930 | 1938 |
| 1931 | 1939 |
| 1932 bool Class::IsInFullSnapshot() const { | 1940 bool Class::IsInFullSnapshot() const { |
| 1933 NoSafepointScope no_safepoint; | 1941 NoSafepointScope no_safepoint; |
| 1934 return raw_ptr()->library_->ptr()->is_in_fullsnapshot_; | 1942 return raw_ptr()->library_->ptr()->is_in_fullsnapshot_; |
| 1935 } | 1943 } |
| 1936 | 1944 |
| 1937 | 1945 |
| 1938 RawAbstractType* Class::RareType() const { | 1946 RawAbstractType* Class::RareType() const { |
| (...skipping 1212 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3151 intptr_t instance_size = ExternalTypedData::InstanceSize(); | 3159 intptr_t instance_size = ExternalTypedData::InstanceSize(); |
| 3152 Class& result = Class::Handle(New<ExternalTypedData>(class_id)); | 3160 Class& result = Class::Handle(New<ExternalTypedData>(class_id)); |
| 3153 result.set_instance_size(instance_size); | 3161 result.set_instance_size(instance_size); |
| 3154 result.set_next_field_offset(ExternalTypedData::NextFieldOffset()); | 3162 result.set_next_field_offset(ExternalTypedData::NextFieldOffset()); |
| 3155 result.set_is_prefinalized(); | 3163 result.set_is_prefinalized(); |
| 3156 return result.raw(); | 3164 return result.raw(); |
| 3157 } | 3165 } |
| 3158 | 3166 |
| 3159 | 3167 |
| 3160 void Class::set_name(const String& value) const { | 3168 void Class::set_name(const String& value) const { |
| 3169 ASSERT(raw_ptr()->name_ == String::null()); |
| 3161 ASSERT(value.IsSymbol()); | 3170 ASSERT(value.IsSymbol()); |
| 3162 StorePointer(&raw_ptr()->name_, value.raw()); | 3171 StorePointer(&raw_ptr()->name_, value.raw()); |
| 3163 NOT_IN_PRODUCT( | 3172 NOT_IN_PRODUCT( |
| 3164 if (raw_ptr()->user_name_ == String::null()) { | 3173 if (raw_ptr()->user_name_ == String::null()) { |
| 3165 // TODO(johnmccutchan): Eagerly set user name for VM isolate classes, | 3174 // TODO(johnmccutchan): Eagerly set user name for VM isolate classes, |
| 3166 // lazily set user name for the other classes. | 3175 // lazily set user name for the other classes. |
| 3167 // Generate and set user_name. | 3176 // Generate and set user_name. |
| 3168 const String& user_name = String::Handle(GenerateUserVisibleName()); | 3177 const String& user_name = String::Handle(GenerateUserVisibleName()); |
| 3169 set_user_name(user_name); | 3178 set_user_name(user_name); |
| 3170 } | 3179 } |
| 3171 ) | 3180 ) |
| 3172 } | 3181 } |
| 3173 | 3182 |
| 3174 | 3183 |
| 3175 NOT_IN_PRODUCT( | 3184 NOT_IN_PRODUCT( |
| 3176 void Class::set_user_name(const String& value) const { | 3185 void Class::set_user_name(const String& value) const { |
| 3177 StorePointer(&raw_ptr()->user_name_, value.raw()); | 3186 StorePointer(&raw_ptr()->user_name_, value.raw()); |
| 3178 } | 3187 } |
| 3179 ) | 3188 ) |
| 3180 | 3189 |
| 3181 | 3190 |
| 3182 RawString* Class::GeneratePrettyName() const { | |
| 3183 const String& name = String::Handle(Name()); | |
| 3184 return String::IdentifierPrettyName(name); | |
| 3185 } | |
| 3186 | |
| 3187 | |
| 3188 RawString* Class::GenerateUserVisibleName() const { | 3191 RawString* Class::GenerateUserVisibleName() const { |
| 3189 if (FLAG_show_internal_names) { | 3192 if (FLAG_show_internal_names) { |
| 3190 return Name(); | 3193 return Name(); |
| 3191 } | 3194 } |
| 3195 NOT_IN_PRODUCT( |
| 3192 switch (id()) { | 3196 switch (id()) { |
| 3193 case kNullCid: | 3197 case kNullCid: |
| 3194 return Symbols::Null().raw(); | 3198 return Symbols::Null().raw(); |
| 3195 case kDynamicCid: | 3199 case kDynamicCid: |
| 3196 return Symbols::Dynamic().raw(); | 3200 return Symbols::Dynamic().raw(); |
| 3197 case kVoidCid: | 3201 case kVoidCid: |
| 3198 return Symbols::Void().raw(); | 3202 return Symbols::Void().raw(); |
| 3199 case kClassCid: | 3203 case kClassCid: |
| 3200 return Symbols::Class().raw(); | 3204 return Symbols::Class().raw(); |
| 3201 case kUnresolvedClassCid: | 3205 case kUnresolvedClassCid: |
| (...skipping 111 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 3313 return Symbols::Float32x4List().raw(); | 3317 return Symbols::Float32x4List().raw(); |
| 3314 case kTypedDataFloat64x2ArrayCid: | 3318 case kTypedDataFloat64x2ArrayCid: |
| 3315 case kExternalTypedDataFloat64x2ArrayCid: | 3319 case kExternalTypedDataFloat64x2ArrayCid: |
| 3316 return Symbols::Float64x2List().raw(); | 3320 return Symbols::Float64x2List().raw(); |
| 3317 case kTypedDataFloat32ArrayCid: | 3321 case kTypedDataFloat32ArrayCid: |
| 3318 case kExternalTypedDataFloat32ArrayCid: | 3322 case kExternalTypedDataFloat32ArrayCid: |
| 3319 return Symbols::Float32List().raw(); | 3323 return Symbols::Float32List().raw(); |
| 3320 case kTypedDataFloat64ArrayCid: | 3324 case kTypedDataFloat64ArrayCid: |
| 3321 case kExternalTypedDataFloat64ArrayCid: | 3325 case kExternalTypedDataFloat64ArrayCid: |
| 3322 return Symbols::Float64List().raw(); | 3326 return Symbols::Float64List().raw(); |
| 3323 default: | |
| 3324 const String& name = String::Handle(Name()); | |
| 3325 return String::IdentifierPrettyName(name); | |
| 3326 } | 3327 } |
| 3327 UNREACHABLE(); | 3328 ) |
| 3329 const String& name = String::Handle(Name()); |
| 3330 return String::ScrubName(name); |
| 3328 } | 3331 } |
| 3329 | 3332 |
| 3330 | 3333 |
| 3331 void Class::set_script(const Script& value) const { | 3334 void Class::set_script(const Script& value) const { |
| 3332 StorePointer(&raw_ptr()->script_, value.raw()); | 3335 StorePointer(&raw_ptr()->script_, value.raw()); |
| 3333 } | 3336 } |
| 3334 | 3337 |
| 3335 | 3338 |
| 3336 void Class::set_token_pos(TokenPosition token_pos) const { | 3339 void Class::set_token_pos(TokenPosition token_pos) const { |
| 3337 ASSERT(!token_pos.IsClassifying()); | 3340 ASSERT(!token_pos.IsClassifying()); |
| (...skipping 3307 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6645 ASSERT(obj.IsPatchClass()); | 6648 ASSERT(obj.IsPatchClass()); |
| 6646 return PatchClass::Cast(obj).script(); | 6649 return PatchClass::Cast(obj).script(); |
| 6647 } | 6650 } |
| 6648 | 6651 |
| 6649 | 6652 |
| 6650 bool Function::HasOptimizedCode() const { | 6653 bool Function::HasOptimizedCode() const { |
| 6651 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); | 6654 return HasCode() && Code::Handle(CurrentCode()).is_optimized(); |
| 6652 } | 6655 } |
| 6653 | 6656 |
| 6654 | 6657 |
| 6655 RawString* Function::PrettyName() const { | |
| 6656 const String& str = String::Handle(name()); | |
| 6657 return String::IdentifierPrettyName(str); | |
| 6658 } | |
| 6659 | |
| 6660 | |
| 6661 const char* Function::QualifiedUserVisibleNameCString() const { | |
| 6662 const String& str = String::Handle(QualifiedUserVisibleName()); | |
| 6663 return str.ToCString(); | |
| 6664 } | |
| 6665 | |
| 6666 | |
| 6667 RawString* Function::UserVisibleName() const { | 6658 RawString* Function::UserVisibleName() const { |
| 6668 return PrettyName(); | 6659 if (FLAG_show_internal_names) { |
| 6660 return name(); |
| 6661 } |
| 6662 return String::ScrubName(String::Handle(name())); |
| 6669 } | 6663 } |
| 6670 | 6664 |
| 6671 | 6665 |
| 6672 RawString* Function::QualifiedPrettyName() const { | 6666 RawString* Function::QualifiedName(NameVisibility name_visibility) const { |
| 6673 String& tmp = String::Handle(); | 6667 ASSERT(name_visibility != kInternalName); // We never request it. |
| 6674 const Class& cls = Class::Handle(Owner()); | 6668 // A function's scrubbed name and its user visible name are identical. |
| 6675 | 6669 String& result = String::Handle(UserVisibleName()); |
| 6676 if (IsClosureFunction()) { | 6670 if (IsClosureFunction()) { |
| 6677 if (IsLocalFunction() && !IsImplicitClosureFunction()) { | 6671 Function& fun = Function::Handle(raw()); |
| 6678 const Function& parent = Function::Handle(parent_function()); | 6672 while (fun.IsLocalFunction() && !fun.IsImplicitClosureFunction()) { |
| 6679 tmp = parent.QualifiedPrettyName(); | 6673 fun = fun.parent_function(); |
| 6680 } else { | 6674 result = String::Concat(Symbols::Dot(), result, Heap::kOld); |
| 6681 return PrettyName(); | 6675 result = String::Concat( |
| 6682 } | 6676 String::Handle(fun.UserVisibleName()), result, Heap::kOld); |
| 6683 } else { | |
| 6684 if (cls.IsTopLevel()) { | |
| 6685 return PrettyName(); | |
| 6686 } else { | |
| 6687 tmp = cls.PrettyName(); | |
| 6688 } | 6677 } |
| 6689 } | 6678 } |
| 6690 tmp = String::Concat(tmp, Symbols::Dot(), Heap::kOld); | 6679 const Class& cls = Class::Handle(Owner()); |
| 6691 const String& suffix = String::Handle(PrettyName()); | 6680 if (!cls.IsTopLevel()) { |
| 6692 return String::Concat(tmp, suffix, Heap::kOld); | 6681 result = String::Concat(Symbols::Dot(), result, Heap::kOld); |
| 6682 const String& cls_name = String::Handle( |
| 6683 name_visibility == kScrubbedName ? cls.ScrubbedName() |
| 6684 : cls.UserVisibleName()); |
| 6685 result = String::Concat(cls_name, result, Heap::kOld); |
| 6686 } |
| 6687 return result.raw(); |
| 6693 } | 6688 } |
| 6694 | 6689 |
| 6695 | 6690 |
| 6696 RawString* Function::QualifiedUserVisibleName() const { | |
| 6697 String& tmp = String::Handle(); | |
| 6698 const Class& cls = Class::Handle(Owner()); | |
| 6699 | |
| 6700 if (IsClosureFunction()) { | |
| 6701 if (IsLocalFunction() && !IsImplicitClosureFunction()) { | |
| 6702 const Function& parent = Function::Handle(parent_function()); | |
| 6703 tmp = parent.QualifiedUserVisibleName(); | |
| 6704 } else { | |
| 6705 return UserVisibleName(); | |
| 6706 } | |
| 6707 } else { | |
| 6708 if (cls.IsTopLevel()) { | |
| 6709 return UserVisibleName(); | |
| 6710 } else { | |
| 6711 tmp = cls.UserVisibleName(); | |
| 6712 } | |
| 6713 } | |
| 6714 tmp = String::Concat(tmp, Symbols::Dot()); | |
| 6715 const String& suffix = String::Handle(UserVisibleName()); | |
| 6716 return String::Concat(tmp, suffix); | |
| 6717 } | |
| 6718 | |
| 6719 | |
| 6720 RawString* Function::GetSource() const { | 6691 RawString* Function::GetSource() const { |
| 6721 if (IsImplicitConstructor() || IsSignatureFunction()) { | 6692 if (IsImplicitConstructor() || IsSignatureFunction()) { |
| 6722 // We may need to handle more cases when the restrictions on mixins are | 6693 // We may need to handle more cases when the restrictions on mixins are |
| 6723 // relaxed. In particular we might start associating some source with the | 6694 // relaxed. In particular we might start associating some source with the |
| 6724 // forwarding constructors when it becomes possible to specify a particular | 6695 // forwarding constructors when it becomes possible to specify a particular |
| 6725 // constructor from the mixin to use. | 6696 // constructor from the mixin to use. |
| 6726 return String::null(); | 6697 return String::null(); |
| 6727 } | 6698 } |
| 6728 const Script& func_script = Script::Handle(script()); | 6699 const Script& func_script = Script::Handle(script()); |
| 6729 const TokenStream& stream = TokenStream::Handle(func_script.tokens()); | 6700 const TokenStream& stream = TokenStream::Handle(func_script.tokens()); |
| (...skipping 468 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7198 if (new_owner.NumTypeParameters() > 0) { | 7169 if (new_owner.NumTypeParameters() > 0) { |
| 7199 // Adjust the field type to refer to type parameters of the new owner. | 7170 // Adjust the field type to refer to type parameters of the new owner. |
| 7200 AbstractType& type = AbstractType::Handle(clone.type()); | 7171 AbstractType& type = AbstractType::Handle(clone.type()); |
| 7201 type ^= type.CloneUninstantiated(new_owner); | 7172 type ^= type.CloneUninstantiated(new_owner); |
| 7202 clone.SetFieldType(type); | 7173 clone.SetFieldType(type); |
| 7203 } | 7174 } |
| 7204 return clone.raw(); | 7175 return clone.raw(); |
| 7205 } | 7176 } |
| 7206 | 7177 |
| 7207 | 7178 |
| 7208 RawString* Field::PrettyName() const { | |
| 7209 const String& str = String::Handle(name()); | |
| 7210 return String::IdentifierPrettyName(str); | |
| 7211 } | |
| 7212 | |
| 7213 | |
| 7214 RawString* Field::UserVisibleName() const { | 7179 RawString* Field::UserVisibleName() const { |
| 7215 return PrettyName(); | 7180 if (FLAG_show_internal_names) { |
| 7181 return name(); |
| 7182 } |
| 7183 return String::ScrubName(String::Handle(name())); |
| 7216 } | 7184 } |
| 7217 | 7185 |
| 7218 | 7186 |
| 7219 intptr_t Field::guarded_list_length() const { | 7187 intptr_t Field::guarded_list_length() const { |
| 7220 return Smi::Value(raw_ptr()->guarded_list_length_); | 7188 return Smi::Value(raw_ptr()->guarded_list_length_); |
| 7221 } | 7189 } |
| 7222 | 7190 |
| 7223 | 7191 |
| 7224 void Field::set_guarded_list_length(intptr_t list_length) const { | 7192 void Field::set_guarded_list_length(intptr_t list_length) const { |
| 7225 ASSERT(Thread::Current()->IsMutatorThread()); | 7193 ASSERT(Thread::Current()->IsMutatorThread()); |
| (...skipping 1736 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 8962 return Symbols::FromConcatAll(pieces); | 8930 return Symbols::FromConcatAll(pieces); |
| 8963 } | 8931 } |
| 8964 | 8932 |
| 8965 | 8933 |
| 8966 static RawString* MakeFunctionMetaName(const Function& func) { | 8934 static RawString* MakeFunctionMetaName(const Function& func) { |
| 8967 const String& cname = | 8935 const String& cname = |
| 8968 String::Handle(MakeClassMetaName(Class::Handle(func.origin()))); | 8936 String::Handle(MakeClassMetaName(Class::Handle(func.origin()))); |
| 8969 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 8937 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
| 8970 pieces.Add(cname); | 8938 pieces.Add(cname); |
| 8971 pieces.Add(Symbols::At()); | 8939 pieces.Add(Symbols::At()); |
| 8972 pieces.Add(String::Handle(func.QualifiedPrettyName())); | 8940 pieces.Add(String::Handle(func.QualifiedScrubbedName())); |
| 8973 return Symbols::FromConcatAll(pieces); | 8941 return Symbols::FromConcatAll(pieces); |
| 8974 } | 8942 } |
| 8975 | 8943 |
| 8976 | 8944 |
| 8977 static RawString* MakeTypeParameterMetaName(const TypeParameter& param) { | 8945 static RawString* MakeTypeParameterMetaName(const TypeParameter& param) { |
| 8978 const String& cname = String::Handle( | 8946 const String& cname = String::Handle( |
| 8979 MakeClassMetaName(Class::Handle(param.parameterized_class()))); | 8947 MakeClassMetaName(Class::Handle(param.parameterized_class()))); |
| 8980 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); | 8948 GrowableHandlePtrArray<const String> pieces(Thread::Current()->zone(), 3); |
| 8981 pieces.Add(cname); | 8949 pieces.Add(cname); |
| 8982 pieces.Add(Symbols::At()); | 8950 pieces.Add(Symbols::At()); |
| (...skipping 4039 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 13022 Zone* zone = Thread::Current()->zone(); | 12990 Zone* zone = Thread::Current()->zone(); |
| 13023 if (IsStubCode()) { | 12991 if (IsStubCode()) { |
| 13024 const char* name = StubCode::NameOfStub(EntryPoint()); | 12992 const char* name = StubCode::NameOfStub(EntryPoint()); |
| 13025 return zone->PrintToString("[stub: %s]", name); | 12993 return zone->PrintToString("[stub: %s]", name); |
| 13026 } else { | 12994 } else { |
| 13027 return zone->PrintToString("Code entry:%" Px, EntryPoint()); | 12995 return zone->PrintToString("Code entry:%" Px, EntryPoint()); |
| 13028 } | 12996 } |
| 13029 } | 12997 } |
| 13030 | 12998 |
| 13031 | 12999 |
| 13032 // Called by disassembler. | |
| 13033 RawString* Code::Name() const { | 13000 RawString* Code::Name() const { |
| 13034 const Object& obj = Object::Handle(owner()); | 13001 const Object& obj = Object::Handle(owner()); |
| 13035 if (obj.IsNull()) { | 13002 if (obj.IsNull()) { |
| 13036 // Regular stub. | 13003 // Regular stub. |
| 13037 const char* name = StubCode::NameOfStub(EntryPoint()); | 13004 const char* name = StubCode::NameOfStub(EntryPoint()); |
| 13038 ASSERT(name != NULL); | 13005 ASSERT(name != NULL); |
| 13039 const String& stub_name = String::Handle(Symbols::New(name)); | 13006 const String& stub_name = String::Handle(Symbols::New(name)); |
| 13040 return Symbols::FromConcat(Symbols::StubPrefix(), stub_name); | 13007 return Symbols::FromConcat(Symbols::StubPrefix(), stub_name); |
| 13041 } else if (obj.IsClass()) { | 13008 } else if (obj.IsClass()) { |
| 13042 // Allocation stub. | 13009 // Allocation stub. |
| 13043 const Class& cls = Class::Cast(obj); | 13010 const Class& cls = Class::Cast(obj); |
| 13044 String& cls_name = String::Handle(cls.Name()); | 13011 String& cls_name = String::Handle(cls.ScrubbedName()); |
| 13045 ASSERT(!cls_name.IsNull()); | 13012 ASSERT(!cls_name.IsNull()); |
| 13046 return Symbols::FromConcat(Symbols::AllocationStubFor(), cls_name); | 13013 return Symbols::FromConcat(Symbols::AllocationStubFor(), cls_name); |
| 13047 } else { | 13014 } else { |
| 13048 ASSERT(obj.IsFunction()); | 13015 ASSERT(obj.IsFunction()); |
| 13049 // Dart function. | 13016 // Dart function. |
| 13050 return Function::Cast(obj).name(); | 13017 return Function::Cast(obj).UserVisibleName(); // Same as scrubbed name. |
| 13051 } | 13018 } |
| 13052 } | 13019 } |
| 13053 | 13020 |
| 13054 | 13021 |
| 13055 RawString* Code::PrettyName() const { | 13022 RawString* Code::QualifiedName() const { |
| 13056 const Object& obj = Object::Handle(owner()); | 13023 const Object& obj = Object::Handle(owner()); |
| 13057 if (obj.IsNull()) { | 13024 if (obj.IsFunction()) { |
| 13058 // Regular stub. | 13025 return Function::Cast(obj).QualifiedScrubbedName(); |
| 13059 const char* name = StubCode::NameOfStub(EntryPoint()); | |
| 13060 ASSERT(name != NULL); | |
| 13061 const String& stub_name = String::Handle(String::New(name)); | |
| 13062 return String::Concat(Symbols::StubPrefix(), stub_name); | |
| 13063 } else if (obj.IsClass()) { | |
| 13064 // Allocation stub. | |
| 13065 const Class& cls = Class::Cast(obj); | |
| 13066 String& cls_name = String::Handle(cls.Name()); | |
| 13067 ASSERT(!cls_name.IsNull()); | |
| 13068 return String::Concat(Symbols::AllocationStubFor(), cls_name); | |
| 13069 } else { | |
| 13070 ASSERT(obj.IsFunction()); | |
| 13071 // Dart function. | |
| 13072 return Function::Cast(obj).QualifiedPrettyName(); | |
| 13073 } | 13026 } |
| 13027 return Name(); |
| 13074 } | 13028 } |
| 13075 | 13029 |
| 13076 | 13030 |
| 13077 bool Code::IsAllocationStubCode() const { | 13031 bool Code::IsAllocationStubCode() const { |
| 13078 const Object& obj = Object::Handle(owner()); | 13032 const Object& obj = Object::Handle(owner()); |
| 13079 return obj.IsClass(); | 13033 return obj.IsClass(); |
| 13080 } | 13034 } |
| 13081 | 13035 |
| 13082 | 13036 |
| 13083 bool Code::IsStubCode() const { | 13037 bool Code::IsStubCode() const { |
| (...skipping 1691 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14775 } | 14729 } |
| 14776 } | 14730 } |
| 14777 } | 14731 } |
| 14778 (*trail)->Add(*this); | 14732 (*trail)->Add(*this); |
| 14779 (*trail)->Add(buddy); | 14733 (*trail)->Add(buddy); |
| 14780 return false; | 14734 return false; |
| 14781 } | 14735 } |
| 14782 | 14736 |
| 14783 | 14737 |
| 14784 RawString* AbstractType::BuildName(NameVisibility name_visibility) const { | 14738 RawString* AbstractType::BuildName(NameVisibility name_visibility) const { |
| 14739 ASSERT(name_visibility != kScrubbedName); |
| 14785 Zone* zone = Thread::Current()->zone(); | 14740 Zone* zone = Thread::Current()->zone(); |
| 14786 if (IsBoundedType()) { | 14741 if (IsBoundedType()) { |
| 14787 const AbstractType& type = AbstractType::Handle( | 14742 const AbstractType& type = AbstractType::Handle( |
| 14788 BoundedType::Cast(*this).type()); | 14743 BoundedType::Cast(*this).type()); |
| 14789 if (name_visibility == kPrettyName) { | 14744 if (name_visibility == kUserVisibleName) { |
| 14790 return type.BuildName(kPrettyName); | |
| 14791 } else if (name_visibility == kUserVisibleName) { | |
| 14792 return type.BuildName(kUserVisibleName); | 14745 return type.BuildName(kUserVisibleName); |
| 14793 } | 14746 } |
| 14794 GrowableHandlePtrArray<const String> pieces(zone, 5); | 14747 GrowableHandlePtrArray<const String> pieces(zone, 5); |
| 14795 String& type_name = String::Handle(zone, type.BuildName(kInternalName)); | 14748 String& type_name = String::Handle(zone, type.BuildName(kInternalName)); |
| 14796 pieces.Add(type_name); | 14749 pieces.Add(type_name); |
| 14797 pieces.Add(Symbols::SpaceExtendsSpace()); | 14750 pieces.Add(Symbols::SpaceExtendsSpace()); |
| 14798 // Build the bound name without causing divergence. | 14751 // Build the bound name without causing divergence. |
| 14799 const AbstractType& bound = AbstractType::Handle( | 14752 const AbstractType& bound = AbstractType::Handle( |
| 14800 zone, BoundedType::Cast(*this).bound()); | 14753 zone, BoundedType::Cast(*this).bound()); |
| 14801 String& bound_name = String::Handle(zone); | 14754 String& bound_name = String::Handle(zone); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 14851 if (IsResolved() || !cls.IsMixinApplication()) { | 14804 if (IsResolved() || !cls.IsMixinApplication()) { |
| 14852 // Do not print the full vector, but only the declared type parameters. | 14805 // Do not print the full vector, but only the declared type parameters. |
| 14853 num_type_params = cls.NumTypeParameters(); | 14806 num_type_params = cls.NumTypeParameters(); |
| 14854 } else { | 14807 } else { |
| 14855 // Do not print the type parameters of an unresolved mixin application, | 14808 // Do not print the type parameters of an unresolved mixin application, |
| 14856 // since it would prematurely trigger the application of the mixin type. | 14809 // since it would prematurely trigger the application of the mixin type. |
| 14857 num_type_params = 0; | 14810 num_type_params = 0; |
| 14858 } | 14811 } |
| 14859 if (name_visibility == kInternalName) { | 14812 if (name_visibility == kInternalName) { |
| 14860 class_name = cls.Name(); | 14813 class_name = cls.Name(); |
| 14861 } else if (name_visibility == kPrettyName) { | |
| 14862 class_name = cls.PrettyName(); | |
| 14863 } else { | 14814 } else { |
| 14864 ASSERT(name_visibility == kUserVisibleName); | 14815 ASSERT(name_visibility == kUserVisibleName); |
| 14865 // Map internal types to their corresponding public interfaces. | 14816 // Map internal types to their corresponding public interfaces. |
| 14866 class_name = cls.UserVisibleName(); | 14817 class_name = cls.UserVisibleName(); |
| 14867 } | 14818 } |
| 14868 if (num_type_params > num_args) { | 14819 if (num_type_params > num_args) { |
| 14869 first_type_param_index = 0; | 14820 first_type_param_index = 0; |
| 14870 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { | 14821 if (!IsFinalized() || IsBeingFinalized() || IsMalformed()) { |
| 14871 // Most probably a malformed type. Do not fill up with "dynamic", | 14822 // Most probably a malformed type. Do not fill up with "dynamic", |
| 14872 // but use actual vector. | 14823 // but use actual vector. |
| (...skipping 6598 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 21471 return UserTag::null(); | 21422 return UserTag::null(); |
| 21472 } | 21423 } |
| 21473 | 21424 |
| 21474 | 21425 |
| 21475 const char* UserTag::ToCString() const { | 21426 const char* UserTag::ToCString() const { |
| 21476 const String& tag_label = String::Handle(label()); | 21427 const String& tag_label = String::Handle(label()); |
| 21477 return tag_label.ToCString(); | 21428 return tag_label.ToCString(); |
| 21478 } | 21429 } |
| 21479 | 21430 |
| 21480 } // namespace dart | 21431 } // namespace dart |
| OLD | NEW |