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_; |
Ivan Posva
2014/01/17 06:53:16
Why is this allocated eagerly? Is there a reason w
Cutch
2014/01/17 18:37:59
We write protect the VM isolate's heap.
| |
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::StringSym().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 |