Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(303)

Side by Side Diff: runtime/vm/object.cc

Issue 51653006: Track live instance and allocation counts for classes (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 6 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
OLDNEW
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
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
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
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
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
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
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698