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