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/become.h" | 10 #include "vm/become.h" |
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
261 // And so forth: | 261 // And so forth: |
262 // | 262 // |
263 // get:foo@6328321 -> foo | 263 // get:foo@6328321 -> foo |
264 // _MyClass@6328321. -> _MyClass | 264 // _MyClass@6328321. -> _MyClass |
265 // _MyClass@6328321.named -> _MyClass.named | 265 // _MyClass@6328321.named -> _MyClass.named |
266 // | 266 // |
267 RawString* String::ScrubName(const String& name) { | 267 RawString* String::ScrubName(const String& name) { |
268 Thread* thread = Thread::Current(); | 268 Thread* thread = Thread::Current(); |
269 Zone* zone = thread->zone(); | 269 Zone* zone = thread->zone(); |
270 | 270 |
271 #if !defined(PRODUCT) | 271 #if !defined(DART_PRECOMPILED_RUNTIME) |
272 if (name.Equals(Symbols::TopLevel())) { | 272 if (name.Equals(Symbols::TopLevel())) { |
273 // Name of invisible top-level class. | 273 // Name of invisible top-level class. |
274 return Symbols::Empty().raw(); | 274 return Symbols::Empty().raw(); |
275 } | 275 } |
276 #endif // !defined(PRODUCT) | 276 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
277 | 277 |
278 const char* cname = name.ToCString(); | 278 const char* cname = name.ToCString(); |
279 ASSERT(strlen(cname) == static_cast<size_t>(name.Length())); | 279 ASSERT(strlen(cname) == static_cast<size_t>(name.Length())); |
280 const intptr_t name_len = name.Length(); | 280 const intptr_t name_len = name.Length(); |
281 // First remove all private name mangling. | 281 // First remove all private name mangling. |
282 intptr_t start_pos = 0; | 282 intptr_t start_pos = 0; |
283 GrowableArray<const char*> unmangled_segments; | 283 GrowableArray<const char*> unmangled_segments; |
284 intptr_t sum_segment_len = 0; | 284 intptr_t sum_segment_len = 0; |
285 for (intptr_t i = 0; i < name_len; i++) { | 285 for (intptr_t i = 0; i < name_len; i++) { |
286 if ((cname[i] == '@') && ((i + 1) < name_len) && (cname[i + 1] >= '0') && | 286 if ((cname[i] == '@') && ((i + 1) < name_len) && (cname[i + 1] >= '0') && |
(...skipping 23 matching lines...) Expand all Loading... |
310 // Append the last segment. | 310 // Append the last segment. |
311 const intptr_t segment_len = name.Length() - start_pos; | 311 const intptr_t segment_len = name.Length() - start_pos; |
312 sum_segment_len += segment_len; | 312 sum_segment_len += segment_len; |
313 AppendSubString(zone, &unmangled_segments, cname, start_pos, segment_len); | 313 AppendSubString(zone, &unmangled_segments, cname, start_pos, segment_len); |
314 } | 314 } |
315 if (unmangled_name == NULL) { | 315 if (unmangled_name == NULL) { |
316 // Merge unmangled_segments. | 316 // Merge unmangled_segments. |
317 unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len); | 317 unmangled_name = MergeSubStrings(zone, unmangled_segments, sum_segment_len); |
318 } | 318 } |
319 | 319 |
320 #if !defined(PRODUCT) | 320 #if !defined(DART_PRECOMPILED_RUNTIME) |
321 intptr_t len = sum_segment_len; | 321 intptr_t len = sum_segment_len; |
322 intptr_t start = 0; | 322 intptr_t start = 0; |
323 intptr_t dot_pos = -1; // Position of '.' in the name, if any. | 323 intptr_t dot_pos = -1; // Position of '.' in the name, if any. |
324 bool is_setter = false; | 324 bool is_setter = false; |
325 for (intptr_t i = start; i < len; i++) { | 325 for (intptr_t i = start; i < len; i++) { |
326 if (unmangled_name[i] == ':') { | 326 if (unmangled_name[i] == ':') { |
327 if (start != 0) { | 327 if (start != 0) { |
328 // Reset and break. | 328 // Reset and break. |
329 start = 0; | 329 start = 0; |
330 dot_pos = -1; | 330 dot_pos = -1; |
(...skipping 28 matching lines...) Expand all Loading... |
359 intptr_t final_len = end - start; | 359 intptr_t final_len = end - start; |
360 AppendSubString(zone, &unmangled_segments, unmangled_name, start, final_len); | 360 AppendSubString(zone, &unmangled_segments, unmangled_name, start, final_len); |
361 if (is_setter) { | 361 if (is_setter) { |
362 const char* equals = Symbols::Equals().ToCString(); | 362 const char* equals = Symbols::Equals().ToCString(); |
363 const intptr_t equals_len = strlen(equals); | 363 const intptr_t equals_len = strlen(equals); |
364 AppendSubString(zone, &unmangled_segments, equals, 0, equals_len); | 364 AppendSubString(zone, &unmangled_segments, equals, 0, equals_len); |
365 final_len += equals_len; | 365 final_len += equals_len; |
366 } | 366 } |
367 | 367 |
368 unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len); | 368 unmangled_name = MergeSubStrings(zone, unmangled_segments, final_len); |
369 #endif // !defined(PRODUCT) | 369 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
370 | 370 |
371 return Symbols::New(thread, unmangled_name); | 371 return Symbols::New(thread, unmangled_name); |
372 } | 372 } |
373 | 373 |
374 | 374 |
375 RawString* String::ScrubNameRetainPrivate(const String& name) { | 375 RawString* String::ScrubNameRetainPrivate(const String& name) { |
376 #if !defined(PRODUCT) | 376 #if !defined(DART_PRECOMPILED_RUNTIME) |
377 intptr_t len = name.Length(); | 377 intptr_t len = name.Length(); |
378 intptr_t start = 0; | 378 intptr_t start = 0; |
379 intptr_t at_pos = -1; // Position of '@' in the name, if any. | 379 intptr_t at_pos = -1; // Position of '@' in the name, if any. |
380 bool is_setter = false; | 380 bool is_setter = false; |
381 | 381 |
382 for (intptr_t i = start; i < len; i++) { | 382 for (intptr_t i = start; i < len; i++) { |
383 if (name.CharAt(i) == ':') { | 383 if (name.CharAt(i) == ':') { |
384 ASSERT(start == 0); // Only one : is possible in getters or setters. | 384 ASSERT(start == 0); // Only one : is possible in getters or setters. |
385 if (name.CharAt(0) == 's') { | 385 if (name.CharAt(0) == 's') { |
386 is_setter = true; | 386 is_setter = true; |
(...skipping 22 matching lines...) Expand all Loading... |
409 const String& pre_at = | 409 const String& pre_at = |
410 String::Handle(String::SubString(result, 0, at_pos - 4)); | 410 String::Handle(String::SubString(result, 0, at_pos - 4)); |
411 const String& post_at = | 411 const String& post_at = |
412 String::Handle(String::SubString(name, at_pos, len - at_pos)); | 412 String::Handle(String::SubString(name, at_pos, len - at_pos)); |
413 result = String::Concat(pre_at, Symbols::Equals()); | 413 result = String::Concat(pre_at, Symbols::Equals()); |
414 result = String::Concat(result, post_at); | 414 result = String::Concat(result, post_at); |
415 } | 415 } |
416 } | 416 } |
417 | 417 |
418 return result.raw(); | 418 return result.raw(); |
419 #endif // !defined(PRODUCT) | 419 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
420 return name.raw(); // In PRODUCT, return argument unchanged. | 420 return name.raw(); // In AOT, return argument unchanged. |
421 } | 421 } |
422 | 422 |
423 | 423 |
424 template <typename type> | 424 template <typename type> |
425 static bool IsSpecialCharacter(type value) { | 425 static bool IsSpecialCharacter(type value) { |
426 return ((value == '"') || (value == '\n') || (value == '\f') || | 426 return ((value == '"') || (value == '\n') || (value == '\f') || |
427 (value == '\b') || (value == '\t') || (value == '\v') || | 427 (value == '\b') || (value == '\t') || (value == '\v') || |
428 (value == '\r') || (value == '\\') || (value == '$')); | 428 (value == '\r') || (value == '\\') || (value == '$')); |
429 } | 429 } |
430 | 430 |
(...skipping 1073 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1504 cls.ResetFinalization(); // To calculate field offsets from Dart source. | 1504 cls.ResetFinalization(); // To calculate field offsets from Dart source. |
1505 RegisterPrivateClass(cls, Symbols::_Closure(), core_lib); | 1505 RegisterPrivateClass(cls, Symbols::_Closure(), core_lib); |
1506 pending_classes.Add(cls); | 1506 pending_classes.Add(cls); |
1507 | 1507 |
1508 cls = Class::New<WeakProperty>(); | 1508 cls = Class::New<WeakProperty>(); |
1509 object_store->set_weak_property_class(cls); | 1509 object_store->set_weak_property_class(cls); |
1510 RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib); | 1510 RegisterPrivateClass(cls, Symbols::_WeakProperty(), core_lib); |
1511 | 1511 |
1512 // Pre-register the mirrors library so we can place the vm class | 1512 // Pre-register the mirrors library so we can place the vm class |
1513 // MirrorReference there rather than the core library. | 1513 // MirrorReference there rather than the core library. |
1514 #if !defined(PRODUCT) | 1514 #if !defined(DART_PRECOMPILED_RUNTIME) |
1515 lib = Library::LookupLibrary(thread, Symbols::DartMirrors()); | 1515 lib = Library::LookupLibrary(thread, Symbols::DartMirrors()); |
1516 if (lib.IsNull()) { | 1516 if (lib.IsNull()) { |
1517 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); | 1517 lib = Library::NewLibraryHelper(Symbols::DartMirrors(), true); |
1518 lib.SetLoadRequested(); | 1518 lib.SetLoadRequested(); |
1519 lib.Register(thread); | 1519 lib.Register(thread); |
1520 } | 1520 } |
1521 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); | 1521 object_store->set_bootstrap_library(ObjectStore::kMirrors, lib); |
1522 ASSERT(!lib.IsNull()); | 1522 ASSERT(!lib.IsNull()); |
1523 ASSERT(lib.raw() == Library::MirrorsLibrary()); | 1523 ASSERT(lib.raw() == Library::MirrorsLibrary()); |
1524 | 1524 |
(...skipping 8827 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
10352 if (entryname.Equals(metaname)) { | 10352 if (entryname.Equals(metaname)) { |
10353 return entry.raw(); | 10353 return entry.raw(); |
10354 } | 10354 } |
10355 } | 10355 } |
10356 return Field::null(); | 10356 return Field::null(); |
10357 } | 10357 } |
10358 | 10358 |
10359 | 10359 |
10360 RawObject* Library::GetMetadata(const Object& obj) const { | 10360 RawObject* Library::GetMetadata(const Object& obj) const { |
10361 #if defined(DART_PRECOMPILED_RUNTIME) | 10361 #if defined(DART_PRECOMPILED_RUNTIME) |
10362 COMPILE_ASSERT(!FLAG_enable_mirrors); | |
10363 return Object::empty_array().raw(); | 10362 return Object::empty_array().raw(); |
10364 #else | 10363 #else |
10365 if (!obj.IsClass() && !obj.IsField() && !obj.IsFunction() && | 10364 if (!obj.IsClass() && !obj.IsField() && !obj.IsFunction() && |
10366 !obj.IsLibrary() && !obj.IsTypeParameter()) { | 10365 !obj.IsLibrary() && !obj.IsTypeParameter()) { |
10367 return Object::null(); | 10366 return Object::null(); |
10368 } | 10367 } |
10369 const String& metaname = String::Handle(MakeMetadataName(obj)); | 10368 const String& metaname = String::Handle(MakeMetadataName(obj)); |
10370 Field& field = Field::Handle(GetMetadataField(metaname)); | 10369 Field& field = Field::Handle(GetMetadataField(metaname)); |
10371 if (field.IsNull()) { | 10370 if (field.IsNull()) { |
10372 // There is no metadata for this object. | 10371 // There is no metadata for this object. |
(...skipping 1184 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11557 RawLibrary* Library::IsolateLibrary() { | 11556 RawLibrary* Library::IsolateLibrary() { |
11558 return Isolate::Current()->object_store()->isolate_library(); | 11557 return Isolate::Current()->object_store()->isolate_library(); |
11559 } | 11558 } |
11560 | 11559 |
11561 | 11560 |
11562 RawLibrary* Library::MathLibrary() { | 11561 RawLibrary* Library::MathLibrary() { |
11563 return Isolate::Current()->object_store()->math_library(); | 11562 return Isolate::Current()->object_store()->math_library(); |
11564 } | 11563 } |
11565 | 11564 |
11566 | 11565 |
11567 #if !defined(PRODUCT) | 11566 #if !defined(DART_PRECOMPILED_RUNTIME) |
11568 RawLibrary* Library::MirrorsLibrary() { | 11567 RawLibrary* Library::MirrorsLibrary() { |
11569 return Isolate::Current()->object_store()->mirrors_library(); | 11568 return Isolate::Current()->object_store()->mirrors_library(); |
11570 } | 11569 } |
11571 #endif | 11570 #endif |
11572 | 11571 |
11573 | 11572 |
11574 RawLibrary* Library::NativeWrappersLibrary() { | 11573 RawLibrary* Library::NativeWrappersLibrary() { |
11575 return Isolate::Current()->object_store()->native_wrappers_library(); | 11574 return Isolate::Current()->object_store()->native_wrappers_library(); |
11576 } | 11575 } |
11577 | 11576 |
(...skipping 12058 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
23636 return UserTag::null(); | 23635 return UserTag::null(); |
23637 } | 23636 } |
23638 | 23637 |
23639 | 23638 |
23640 const char* UserTag::ToCString() const { | 23639 const char* UserTag::ToCString() const { |
23641 const String& tag_label = String::Handle(label()); | 23640 const String& tag_label = String::Handle(label()); |
23642 return tag_label.ToCString(); | 23641 return tag_label.ToCString(); |
23643 } | 23642 } |
23644 | 23643 |
23645 } // namespace dart | 23644 } // namespace dart |
OLD | NEW |