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

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
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/pages.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
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 267 matching lines...) Expand 10 before | Expand all | Expand 10 after
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
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
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
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
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
OLDNEW
« no previous file with comments | « runtime/vm/object.h ('k') | runtime/vm/pages.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698