Chromium Code Reviews| 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 |