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 13922 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13933 intptr_t MegamorphicCache::filled_entry_count() const { | 13933 intptr_t MegamorphicCache::filled_entry_count() const { |
13934 return raw_ptr()->filled_entry_count_; | 13934 return raw_ptr()->filled_entry_count_; |
13935 } | 13935 } |
13936 | 13936 |
13937 | 13937 |
13938 void MegamorphicCache::set_filled_entry_count(intptr_t count) const { | 13938 void MegamorphicCache::set_filled_entry_count(intptr_t count) const { |
13939 StoreNonPointer(&raw_ptr()->filled_entry_count_, count); | 13939 StoreNonPointer(&raw_ptr()->filled_entry_count_, count); |
13940 } | 13940 } |
13941 | 13941 |
13942 | 13942 |
| 13943 void MegamorphicCache::set_target_name(const String& value) const { |
| 13944 StorePointer(&raw_ptr()->target_name_, value.raw()); |
| 13945 } |
| 13946 |
| 13947 |
| 13948 void MegamorphicCache::set_arguments_descriptor(const Array& value) const { |
| 13949 StorePointer(&raw_ptr()->args_descriptor_, value.raw()); |
| 13950 } |
| 13951 |
| 13952 |
13943 RawMegamorphicCache* MegamorphicCache::New() { | 13953 RawMegamorphicCache* MegamorphicCache::New() { |
13944 MegamorphicCache& result = MegamorphicCache::Handle(); | 13954 MegamorphicCache& result = MegamorphicCache::Handle(); |
13945 { RawObject* raw = Object::Allocate(MegamorphicCache::kClassId, | 13955 { RawObject* raw = Object::Allocate(MegamorphicCache::kClassId, |
13946 MegamorphicCache::InstanceSize(), | 13956 MegamorphicCache::InstanceSize(), |
13947 Heap::kOld); | 13957 Heap::kOld); |
13948 NoSafepointScope no_safepoint; | 13958 NoSafepointScope no_safepoint; |
13949 result ^= raw; | 13959 result ^= raw; |
13950 } | 13960 } |
| 13961 result.set_filled_entry_count(0); |
| 13962 return result.raw(); |
| 13963 } |
| 13964 |
| 13965 |
| 13966 RawMegamorphicCache* MegamorphicCache::New(const String& target_name, |
| 13967 const Array& arguments_descriptor) { |
| 13968 MegamorphicCache& result = MegamorphicCache::Handle(); |
| 13969 { RawObject* raw = Object::Allocate(MegamorphicCache::kClassId, |
| 13970 MegamorphicCache::InstanceSize(), |
| 13971 Heap::kOld); |
| 13972 NoSafepointScope no_safepoint; |
| 13973 result ^= raw; |
| 13974 } |
13951 const intptr_t capacity = kInitialCapacity; | 13975 const intptr_t capacity = kInitialCapacity; |
13952 const Array& buckets = Array::Handle( | 13976 const Array& buckets = Array::Handle( |
13953 Array::New(kEntryLength * capacity, Heap::kOld)); | 13977 Array::New(kEntryLength * capacity, Heap::kOld)); |
13954 const Function& handler = Function::Handle( | 13978 const Function& handler = Function::Handle( |
13955 MegamorphicCacheTable::miss_handler(Isolate::Current())); | 13979 MegamorphicCacheTable::miss_handler(Isolate::Current())); |
13956 for (intptr_t i = 0; i < capacity; ++i) { | 13980 for (intptr_t i = 0; i < capacity; ++i) { |
13957 SetEntry(buckets, i, smi_illegal_cid(), handler); | 13981 SetEntry(buckets, i, smi_illegal_cid(), handler); |
13958 } | 13982 } |
13959 result.set_buckets(buckets); | 13983 result.set_buckets(buckets); |
13960 result.set_mask(capacity - 1); | 13984 result.set_mask(capacity - 1); |
| 13985 result.set_target_name(target_name); |
| 13986 result.set_arguments_descriptor(arguments_descriptor); |
13961 result.set_filled_entry_count(0); | 13987 result.set_filled_entry_count(0); |
13962 return result.raw(); | 13988 return result.raw(); |
13963 } | 13989 } |
13964 | 13990 |
13965 | 13991 |
13966 void MegamorphicCache::EnsureCapacity() const { | 13992 void MegamorphicCache::EnsureCapacity() const { |
13967 intptr_t old_capacity = mask() + 1; | 13993 intptr_t old_capacity = mask() + 1; |
13968 double load_limit = kLoadFactor * static_cast<double>(old_capacity); | 13994 double load_limit = kLoadFactor * static_cast<double>(old_capacity); |
13969 if (static_cast<double>(filled_entry_count() + 1) > load_limit) { | 13995 if (static_cast<double>(filled_entry_count() + 1) > load_limit) { |
13970 const Array& old_buckets = Array::Handle(buckets()); | 13996 const Array& old_buckets = Array::Handle(buckets()); |
(...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
14008 set_filled_entry_count(filled_entry_count() + 1); | 14034 set_filled_entry_count(filled_entry_count() + 1); |
14009 return; | 14035 return; |
14010 } | 14036 } |
14011 i = (i + 1) & id_mask; | 14037 i = (i + 1) & id_mask; |
14012 } while (i != index); | 14038 } while (i != index); |
14013 UNREACHABLE(); | 14039 UNREACHABLE(); |
14014 } | 14040 } |
14015 | 14041 |
14016 | 14042 |
14017 const char* MegamorphicCache::ToCString() const { | 14043 const char* MegamorphicCache::ToCString() const { |
14018 return "MegamorphicCache"; | 14044 const String& name = String::Handle(target_name()); |
| 14045 return OS::SCreate(Thread::Current()->zone(), |
| 14046 "MegamorphicCache(%s)", name.ToCString()); |
14019 } | 14047 } |
14020 | 14048 |
14021 | 14049 |
14022 void MegamorphicCache::PrintJSONImpl(JSONStream* stream, bool ref) const { | 14050 void MegamorphicCache::PrintJSONImpl(JSONStream* stream, bool ref) const { |
14023 JSONObject jsobj(stream); | 14051 JSONObject jsobj(stream); |
14024 AddCommonObjectProperties(&jsobj, "Object", ref); | 14052 AddCommonObjectProperties(&jsobj, "Object", ref); |
14025 jsobj.AddServiceId(*this); | 14053 jsobj.AddServiceId(*this); |
| 14054 jsobj.AddProperty("_selector", String::Handle(target_name()).ToCString()); |
14026 if (ref) { | 14055 if (ref) { |
14027 return; | 14056 return; |
14028 } | 14057 } |
14029 jsobj.AddProperty("_buckets", Object::Handle(buckets())); | 14058 jsobj.AddProperty("_buckets", Object::Handle(buckets())); |
14030 jsobj.AddProperty("_mask", mask()); | 14059 jsobj.AddProperty("_mask", mask()); |
| 14060 jsobj.AddProperty("_argumentsDescriptor", |
| 14061 Object::Handle(arguments_descriptor())); |
14031 } | 14062 } |
14032 | 14063 |
14033 | 14064 |
14034 RawSubtypeTestCache* SubtypeTestCache::New() { | 14065 RawSubtypeTestCache* SubtypeTestCache::New() { |
14035 ASSERT(Object::subtypetestcache_class() != Class::null()); | 14066 ASSERT(Object::subtypetestcache_class() != Class::null()); |
14036 SubtypeTestCache& result = SubtypeTestCache::Handle(); | 14067 SubtypeTestCache& result = SubtypeTestCache::Handle(); |
14037 { | 14068 { |
14038 // SubtypeTestCache objects are long living objects, allocate them in the | 14069 // SubtypeTestCache objects are long living objects, allocate them in the |
14039 // old generation. | 14070 // old generation. |
14040 RawObject* raw = Object::Allocate(SubtypeTestCache::kClassId, | 14071 RawObject* raw = Object::Allocate(SubtypeTestCache::kClassId, |
(...skipping 7679 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
21720 return tag_label.ToCString(); | 21751 return tag_label.ToCString(); |
21721 } | 21752 } |
21722 | 21753 |
21723 | 21754 |
21724 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 21755 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
21725 Instance::PrintJSONImpl(stream, ref); | 21756 Instance::PrintJSONImpl(stream, ref); |
21726 } | 21757 } |
21727 | 21758 |
21728 | 21759 |
21729 } // namespace dart | 21760 } // namespace dart |
OLD | NEW |