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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
278 } else if (name.Length() != start_pos) { | 278 } else if (name.Length() != start_pos) { |
279 // Append the last segment. | 279 // Append the last segment. |
280 segment = String::SubString(name, start_pos, (name.Length() - start_pos)); | 280 segment = String::SubString(name, start_pos, (name.Length() - start_pos)); |
281 unmangled_name = String::Concat(unmangled_name, segment); | 281 unmangled_name = String::Concat(unmangled_name, segment); |
282 } | 282 } |
283 | 283 |
284 intptr_t len = unmangled_name.Length(); | 284 intptr_t len = unmangled_name.Length(); |
285 intptr_t start = 0; | 285 intptr_t start = 0; |
286 intptr_t dot_pos = -1; // Position of '.' in the name, if any. | 286 intptr_t dot_pos = -1; // Position of '.' in the name, if any. |
287 bool is_setter = false; | 287 bool is_setter = false; |
288 | |
289 for (intptr_t i = start; i < len; i++) { | 288 for (intptr_t i = start; i < len; i++) { |
290 if (unmangled_name.CharAt(i) == ':') { | 289 if (unmangled_name.CharAt(i) == ':') { |
| 290 if (start != 0) { |
| 291 // Reset and break. |
| 292 start = 0; |
| 293 dot_pos = -1; |
| 294 break; |
| 295 } |
291 ASSERT(start == 0); // Only one : is possible in getters or setters. | 296 ASSERT(start == 0); // Only one : is possible in getters or setters. |
292 if (unmangled_name.CharAt(0) == 's') { | 297 if (unmangled_name.CharAt(0) == 's') { |
293 is_setter = true; | 298 is_setter = true; |
294 } | 299 } |
295 start = i + 1; | 300 start = i + 1; |
296 } else if (unmangled_name.CharAt(i) == '.') { | 301 } else if (unmangled_name.CharAt(i) == '.') { |
| 302 if (dot_pos != -1) { |
| 303 // Reset and break. |
| 304 start = 0; |
| 305 dot_pos = -1; |
| 306 break; |
| 307 } |
297 ASSERT(dot_pos == -1); // Only one dot is supported. | 308 ASSERT(dot_pos == -1); // Only one dot is supported. |
298 dot_pos = i; | 309 dot_pos = i; |
299 } | 310 } |
300 } | 311 } |
301 | 312 |
302 if ((start == 0) && (dot_pos == -1)) { | 313 if ((start == 0) && (dot_pos == -1)) { |
303 // This unmangled_name is fine as it is. | 314 // This unmangled_name is fine as it is. |
304 return unmangled_name.raw(); | 315 return unmangled_name.raw(); |
305 } | 316 } |
306 | 317 |
(...skipping 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1465 | 1476 |
1466 uword address = heap->Allocate(size, space); | 1477 uword address = heap->Allocate(size, space); |
1467 if (address == 0) { | 1478 if (address == 0) { |
1468 // Use the preallocated out of memory exception to avoid calling | 1479 // Use the preallocated out of memory exception to avoid calling |
1469 // into dart code or allocating any code. | 1480 // into dart code or allocating any code. |
1470 const Instance& exception = | 1481 const Instance& exception = |
1471 Instance::Handle(isolate->object_store()->out_of_memory()); | 1482 Instance::Handle(isolate->object_store()->out_of_memory()); |
1472 Exceptions::Throw(exception); | 1483 Exceptions::Throw(exception); |
1473 UNREACHABLE(); | 1484 UNREACHABLE(); |
1474 } | 1485 } |
| 1486 if (space == Heap::kNew) { |
| 1487 isolate->class_table()->UpdateAllocatedNew(cls_id, size); |
| 1488 } else { |
| 1489 isolate->class_table()->UpdateAllocatedOld(cls_id, size); |
| 1490 } |
1475 NoGCScope no_gc; | 1491 NoGCScope no_gc; |
1476 InitializeObject(address, cls_id, size); | 1492 InitializeObject(address, cls_id, size); |
1477 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); | 1493 RawObject* raw_obj = reinterpret_cast<RawObject*>(address + kHeapObjectTag); |
1478 ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_)); | 1494 ASSERT(cls_id == RawObject::ClassIdTag::decode(raw_obj->ptr()->tags_)); |
1479 return raw_obj; | 1495 return raw_obj; |
1480 } | 1496 } |
1481 | 1497 |
1482 | 1498 |
1483 class StoreBufferUpdateVisitor : public ObjectPointerVisitor { | 1499 class StoreBufferUpdateVisitor : public ObjectPointerVisitor { |
1484 public: | 1500 public: |
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1533 | 1549 |
1534 RawString* Class::Name() const { | 1550 RawString* Class::Name() const { |
1535 // TODO(turnidge): This assert fails for the fake kFreeListElement class. | 1551 // TODO(turnidge): This assert fails for the fake kFreeListElement class. |
1536 // Fix this. | 1552 // Fix this. |
1537 ASSERT(raw_ptr()->name_ != String::null()); | 1553 ASSERT(raw_ptr()->name_ != String::null()); |
1538 return raw_ptr()->name_; | 1554 return raw_ptr()->name_; |
1539 } | 1555 } |
1540 | 1556 |
1541 | 1557 |
1542 RawString* Class::UserVisibleName() const { | 1558 RawString* Class::UserVisibleName() const { |
1543 if (FLAG_show_internal_names) { | 1559 ASSERT(raw_ptr()->user_name_ != String::null()); |
1544 return Name(); | 1560 return raw_ptr()->user_name_; |
1545 } | |
1546 switch (id()) { | |
1547 case kIntegerCid: | |
1548 case kSmiCid: | |
1549 case kMintCid: | |
1550 case kBigintCid: | |
1551 return Symbols::Int().raw(); | |
1552 case kDoubleCid: | |
1553 return Symbols::Double().raw(); | |
1554 case kOneByteStringCid: | |
1555 case kTwoByteStringCid: | |
1556 case kExternalOneByteStringCid: | |
1557 case kExternalTwoByteStringCid: | |
1558 return Symbols::New("String"); | |
1559 case kArrayCid: | |
1560 case kImmutableArrayCid: | |
1561 case kGrowableObjectArrayCid: | |
1562 return Symbols::List().raw(); | |
1563 case kFloat32x4Cid: | |
1564 return Symbols::Float32x4().raw(); | |
1565 case kInt32x4Cid: | |
1566 return Symbols::Int32x4().raw(); | |
1567 case kTypedDataInt8ArrayCid: | |
1568 case kExternalTypedDataInt8ArrayCid: | |
1569 return Symbols::Int8List().raw(); | |
1570 case kTypedDataUint8ArrayCid: | |
1571 case kExternalTypedDataUint8ArrayCid: | |
1572 return Symbols::Uint8List().raw(); | |
1573 case kTypedDataUint8ClampedArrayCid: | |
1574 case kExternalTypedDataUint8ClampedArrayCid: | |
1575 return Symbols::Uint8ClampedList().raw(); | |
1576 case kTypedDataInt16ArrayCid: | |
1577 case kExternalTypedDataInt16ArrayCid: | |
1578 return Symbols::Int16List().raw(); | |
1579 case kTypedDataUint16ArrayCid: | |
1580 case kExternalTypedDataUint16ArrayCid: | |
1581 return Symbols::Uint16List().raw(); | |
1582 case kTypedDataInt32ArrayCid: | |
1583 case kExternalTypedDataInt32ArrayCid: | |
1584 return Symbols::Int32List().raw(); | |
1585 case kTypedDataUint32ArrayCid: | |
1586 case kExternalTypedDataUint32ArrayCid: | |
1587 return Symbols::Uint32List().raw(); | |
1588 case kTypedDataInt64ArrayCid: | |
1589 case kExternalTypedDataInt64ArrayCid: | |
1590 return Symbols::Int64List().raw(); | |
1591 case kTypedDataUint64ArrayCid: | |
1592 case kExternalTypedDataUint64ArrayCid: | |
1593 return Symbols::Uint64List().raw(); | |
1594 case kTypedDataFloat32x4ArrayCid: | |
1595 case kExternalTypedDataFloat32x4ArrayCid: | |
1596 return Symbols::Float32x4List().raw(); | |
1597 case kTypedDataFloat32ArrayCid: | |
1598 case kExternalTypedDataFloat32ArrayCid: | |
1599 return Symbols::Float32List().raw(); | |
1600 case kTypedDataFloat64ArrayCid: | |
1601 case kExternalTypedDataFloat64ArrayCid: | |
1602 return Symbols::Float64List().raw(); | |
1603 default: | |
1604 if (!IsCanonicalSignatureClass()) { | |
1605 const String& name = String::Handle(Name()); | |
1606 return String::IdentifierPrettyName(name); | |
1607 } else { | |
1608 return Name(); | |
1609 } | |
1610 } | |
1611 UNREACHABLE(); | |
1612 } | 1561 } |
1613 | 1562 |
1614 | 1563 |
1615 RawType* Class::SignatureType() const { | 1564 RawType* Class::SignatureType() const { |
1616 ASSERT(IsSignatureClass()); | 1565 ASSERT(IsSignatureClass()); |
1617 const Function& function = Function::Handle(signature_function()); | 1566 const Function& function = Function::Handle(signature_function()); |
1618 ASSERT(!function.IsNull()); | 1567 ASSERT(!function.IsNull()); |
1619 if (function.signature_class() != raw()) { | 1568 if (function.signature_class() != raw()) { |
1620 // This class is a function type alias. Return the canonical signature type. | 1569 // This class is a function type alias. Return the canonical signature type. |
1621 const Class& canonical_class = Class::Handle(function.signature_class()); | 1570 const Class& canonical_class = Class::Handle(function.signature_class()); |
(...skipping 1163 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2785 result.set_instance_size(instance_size); | 2734 result.set_instance_size(instance_size); |
2786 result.set_next_field_offset(ExternalTypedData::NextFieldOffset()); | 2735 result.set_next_field_offset(ExternalTypedData::NextFieldOffset()); |
2787 result.set_is_prefinalized(); | 2736 result.set_is_prefinalized(); |
2788 return result.raw(); | 2737 return result.raw(); |
2789 } | 2738 } |
2790 | 2739 |
2791 | 2740 |
2792 void Class::set_name(const String& value) const { | 2741 void Class::set_name(const String& value) const { |
2793 ASSERT(value.IsSymbol()); | 2742 ASSERT(value.IsSymbol()); |
2794 StorePointer(&raw_ptr()->name_, value.raw()); | 2743 StorePointer(&raw_ptr()->name_, value.raw()); |
| 2744 if (raw_ptr()->user_name_ == String::null()) { |
| 2745 // TODO(johnmccutchan): Eagerly set user name for VM isolate classes, |
| 2746 // lazily set user name for the other classes. |
| 2747 // Generate and set user_name. |
| 2748 const String& user_name = String::Handle(GenerateUserVisibleName()); |
| 2749 set_user_name(user_name); |
| 2750 } |
2795 } | 2751 } |
2796 | 2752 |
2797 | 2753 |
| 2754 void Class::set_user_name(const String& value) const { |
| 2755 StorePointer(&raw_ptr()->user_name_, value.raw()); |
| 2756 } |
| 2757 |
| 2758 |
| 2759 RawString* Class::GenerateUserVisibleName() const { |
| 2760 if (FLAG_show_internal_names) { |
| 2761 return Name(); |
| 2762 } |
| 2763 switch (id()) { |
| 2764 case kNullCid: |
| 2765 return Symbols::Null().raw(); |
| 2766 case kDynamicCid: |
| 2767 return Symbols::Dynamic().raw(); |
| 2768 case kVoidCid: |
| 2769 return Symbols::Void().raw(); |
| 2770 case kClassCid: |
| 2771 return Symbols::Class().raw(); |
| 2772 case kUnresolvedClassCid: |
| 2773 return Symbols::UnresolvedClass().raw(); |
| 2774 case kTypeArgumentsCid: |
| 2775 return Symbols::TypeArguments().raw(); |
| 2776 case kInstantiatedTypeArgumentsCid: |
| 2777 return Symbols::InstantiatedTypeArguments().raw(); |
| 2778 case kPatchClassCid: |
| 2779 return Symbols::PatchClass().raw(); |
| 2780 case kFunctionCid: |
| 2781 return Symbols::Function().raw(); |
| 2782 case kClosureDataCid: |
| 2783 return Symbols::ClosureData().raw(); |
| 2784 case kRedirectionDataCid: |
| 2785 return Symbols::RedirectionData().raw(); |
| 2786 case kFieldCid: |
| 2787 return Symbols::Field().raw(); |
| 2788 case kLiteralTokenCid: |
| 2789 return Symbols::LiteralToken().raw(); |
| 2790 case kTokenStreamCid: |
| 2791 return Symbols::TokenStream().raw(); |
| 2792 case kScriptCid: |
| 2793 return Symbols::Script().raw(); |
| 2794 case kLibraryCid: |
| 2795 return Symbols::Library().raw(); |
| 2796 case kLibraryPrefixCid: |
| 2797 return Symbols::LibraryPrefix().raw(); |
| 2798 case kNamespaceCid: |
| 2799 return Symbols::Namespace().raw(); |
| 2800 case kCodeCid: |
| 2801 return Symbols::Code().raw(); |
| 2802 case kInstructionsCid: |
| 2803 return Symbols::Instructions().raw(); |
| 2804 case kPcDescriptorsCid: |
| 2805 return Symbols::PcDescriptors().raw(); |
| 2806 case kStackmapCid: |
| 2807 return Symbols::Stackmap().raw(); |
| 2808 case kLocalVarDescriptorsCid: |
| 2809 return Symbols::LocalVarDescriptors().raw(); |
| 2810 case kExceptionHandlersCid: |
| 2811 return Symbols::ExceptionHandlers().raw(); |
| 2812 case kDeoptInfoCid: |
| 2813 return Symbols::DeoptInfo().raw(); |
| 2814 case kContextCid: |
| 2815 return Symbols::Context().raw(); |
| 2816 case kContextScopeCid: |
| 2817 return Symbols::ContextScope().raw(); |
| 2818 case kICDataCid: |
| 2819 return Symbols::ICData().raw(); |
| 2820 case kMegamorphicCacheCid: |
| 2821 return Symbols::MegamorphicCache().raw(); |
| 2822 case kSubtypeTestCacheCid: |
| 2823 return Symbols::SubtypeTestCache().raw(); |
| 2824 case kApiErrorCid: |
| 2825 return Symbols::ApiError().raw(); |
| 2826 case kLanguageErrorCid: |
| 2827 return Symbols::LanguageError().raw(); |
| 2828 case kUnhandledExceptionCid: |
| 2829 return Symbols::UnhandledException().raw(); |
| 2830 case kUnwindErrorCid: |
| 2831 return Symbols::UnwindError().raw(); |
| 2832 case kIntegerCid: |
| 2833 case kSmiCid: |
| 2834 case kMintCid: |
| 2835 case kBigintCid: |
| 2836 return Symbols::Int().raw(); |
| 2837 case kDoubleCid: |
| 2838 return Symbols::Double().raw(); |
| 2839 case kOneByteStringCid: |
| 2840 case kTwoByteStringCid: |
| 2841 case kExternalOneByteStringCid: |
| 2842 case kExternalTwoByteStringCid: |
| 2843 return Symbols::_String().raw(); |
| 2844 case kArrayCid: |
| 2845 case kImmutableArrayCid: |
| 2846 case kGrowableObjectArrayCid: |
| 2847 return Symbols::List().raw(); |
| 2848 case kFloat32x4Cid: |
| 2849 return Symbols::Float32x4().raw(); |
| 2850 case kInt32x4Cid: |
| 2851 return Symbols::Int32x4().raw(); |
| 2852 case kTypedDataInt8ArrayCid: |
| 2853 case kExternalTypedDataInt8ArrayCid: |
| 2854 return Symbols::Int8List().raw(); |
| 2855 case kTypedDataUint8ArrayCid: |
| 2856 case kExternalTypedDataUint8ArrayCid: |
| 2857 return Symbols::Uint8List().raw(); |
| 2858 case kTypedDataUint8ClampedArrayCid: |
| 2859 case kExternalTypedDataUint8ClampedArrayCid: |
| 2860 return Symbols::Uint8ClampedList().raw(); |
| 2861 case kTypedDataInt16ArrayCid: |
| 2862 case kExternalTypedDataInt16ArrayCid: |
| 2863 return Symbols::Int16List().raw(); |
| 2864 case kTypedDataUint16ArrayCid: |
| 2865 case kExternalTypedDataUint16ArrayCid: |
| 2866 return Symbols::Uint16List().raw(); |
| 2867 case kTypedDataInt32ArrayCid: |
| 2868 case kExternalTypedDataInt32ArrayCid: |
| 2869 return Symbols::Int32List().raw(); |
| 2870 case kTypedDataUint32ArrayCid: |
| 2871 case kExternalTypedDataUint32ArrayCid: |
| 2872 return Symbols::Uint32List().raw(); |
| 2873 case kTypedDataInt64ArrayCid: |
| 2874 case kExternalTypedDataInt64ArrayCid: |
| 2875 return Symbols::Int64List().raw(); |
| 2876 case kTypedDataUint64ArrayCid: |
| 2877 case kExternalTypedDataUint64ArrayCid: |
| 2878 return Symbols::Uint64List().raw(); |
| 2879 case kTypedDataFloat32x4ArrayCid: |
| 2880 case kExternalTypedDataFloat32x4ArrayCid: |
| 2881 return Symbols::Float32x4List().raw(); |
| 2882 case kTypedDataFloat32ArrayCid: |
| 2883 case kExternalTypedDataFloat32ArrayCid: |
| 2884 return Symbols::Float32List().raw(); |
| 2885 case kTypedDataFloat64ArrayCid: |
| 2886 case kExternalTypedDataFloat64ArrayCid: |
| 2887 return Symbols::Float64List().raw(); |
| 2888 default: |
| 2889 if (!IsCanonicalSignatureClass()) { |
| 2890 const String& name = String::Handle(Name()); |
| 2891 return String::IdentifierPrettyName(name); |
| 2892 } else { |
| 2893 return Name(); |
| 2894 } |
| 2895 } |
| 2896 UNREACHABLE(); |
| 2897 } |
| 2898 |
| 2899 |
2798 void Class::set_script(const Script& value) const { | 2900 void Class::set_script(const Script& value) const { |
2799 StorePointer(&raw_ptr()->script_, value.raw()); | 2901 StorePointer(&raw_ptr()->script_, value.raw()); |
2800 } | 2902 } |
2801 | 2903 |
2802 | 2904 |
2803 void Class::set_token_pos(intptr_t token_pos) const { | 2905 void Class::set_token_pos(intptr_t token_pos) const { |
2804 ASSERT(token_pos >= 0); | 2906 ASSERT(token_pos >= 0); |
2805 raw_ptr()->token_pos_ = token_pos; | 2907 raw_ptr()->token_pos_ = token_pos; |
2806 } | 2908 } |
2807 | 2909 |
(...skipping 14183 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16991 return "_MirrorReference"; | 17093 return "_MirrorReference"; |
16992 } | 17094 } |
16993 | 17095 |
16994 | 17096 |
16995 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { | 17097 void MirrorReference::PrintToJSONStream(JSONStream* stream, bool ref) const { |
16996 Instance::PrintToJSONStream(stream, ref); | 17098 Instance::PrintToJSONStream(stream, ref); |
16997 } | 17099 } |
16998 | 17100 |
16999 | 17101 |
17000 } // namespace dart | 17102 } // namespace dart |
OLD | NEW |