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 7706 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7717 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap; | 7717 typedef UnorderedHashMap<CompressedTokenTraits> CompressedTokenMap; |
7718 | 7718 |
7719 | 7719 |
7720 // Helper class for creation of compressed token stream data. | 7720 // Helper class for creation of compressed token stream data. |
7721 class CompressedTokenStreamData : public ValueObject { | 7721 class CompressedTokenStreamData : public ValueObject { |
7722 public: | 7722 public: |
7723 static const intptr_t kInitialBufferSize = 16 * KB; | 7723 static const intptr_t kInitialBufferSize = 16 * KB; |
7724 CompressedTokenStreamData() : | 7724 CompressedTokenStreamData() : |
7725 buffer_(NULL), | 7725 buffer_(NULL), |
7726 stream_(&buffer_, Reallocate, kInitialBufferSize), | 7726 stream_(&buffer_, Reallocate, kInitialBufferSize), |
7727 tokens_(Array::Handle( | 7727 tokens_(HashTables::New<CompressedTokenMap>(kInitialTableSize)) { |
7728 HashTables::New<CompressedTokenMap>(kInitialTableSize))) { | |
7729 } | 7728 } |
7730 ~CompressedTokenStreamData() { | 7729 ~CompressedTokenStreamData() { |
7731 // Safe to discard the hash table now. | 7730 // Safe to discard the hash table now. |
7732 tokens_.Release(); | 7731 tokens_.Release(); |
7733 } | 7732 } |
7734 | 7733 |
7735 // Add an IDENT token into the stream and the token hash map. | 7734 // Add an IDENT token into the stream and the token hash map. |
7736 void AddIdentToken(const String* ident) { | 7735 void AddIdentToken(const String* ident) { |
7737 ASSERT(ident->IsSymbol()); | 7736 ASSERT(ident->IsSymbol()); |
7738 const intptr_t fresh_index = tokens_.NumOccupied(); | 7737 const intptr_t fresh_index = tokens_.NumOccupied(); |
(...skipping 1004 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8743 } | 8742 } |
8744 }; | 8743 }; |
8745 typedef UnorderedHashMap<StringEqualsTraits> ResolvedNamesMap; | 8744 typedef UnorderedHashMap<StringEqualsTraits> ResolvedNamesMap; |
8746 | 8745 |
8747 | 8746 |
8748 // Returns true if the name is found in the cache, false no cache hit. | 8747 // Returns true if the name is found in the cache, false no cache hit. |
8749 // obj is set to the cached entry. It may be null, indicating that the | 8748 // obj is set to the cached entry. It may be null, indicating that the |
8750 // name does not resolve to anything in this library. | 8749 // name does not resolve to anything in this library. |
8751 bool Library::LookupResolvedNamesCache(const String& name, | 8750 bool Library::LookupResolvedNamesCache(const String& name, |
8752 Object* obj) const { | 8751 Object* obj) const { |
8753 ResolvedNamesMap cache(Array::Handle(resolved_names())); | 8752 ResolvedNamesMap cache(resolved_names()); |
8754 bool present = false; | 8753 bool present = false; |
8755 *obj = cache.GetOrNull(name, &present); | 8754 *obj = cache.GetOrNull(name, &present); |
8756 RawArray* array = cache.Release(); | 8755 ASSERT(cache.Release().raw() == resolved_names()); |
8757 ASSERT(array == resolved_names()); | |
8758 return present; | 8756 return present; |
8759 } | 8757 } |
8760 | 8758 |
8761 | 8759 |
8762 // Add a name to the resolved name cache. This name resolves to the | 8760 // Add a name to the resolved name cache. This name resolves to the |
8763 // given object in this library scope. obj may be null, which means | 8761 // given object in this library scope. obj may be null, which means |
8764 // the name does not resolve to anything in this library scope. | 8762 // the name does not resolve to anything in this library scope. |
8765 void Library::AddToResolvedNamesCache(const String& name, | 8763 void Library::AddToResolvedNamesCache(const String& name, |
8766 const Object& obj) const { | 8764 const Object& obj) const { |
8767 if (!FLAG_use_lib_cache) { | 8765 if (!FLAG_use_lib_cache) { |
8768 return; | 8766 return; |
8769 } | 8767 } |
8770 ResolvedNamesMap cache(Array::Handle(resolved_names())); | 8768 ResolvedNamesMap cache(resolved_names()); |
8771 cache.UpdateOrInsert(name, obj); | 8769 cache.UpdateOrInsert(name, obj); |
8772 StorePointer(&raw_ptr()->resolved_names_, cache.Release()); | 8770 StorePointer(&raw_ptr()->resolved_names_, cache.Release().raw()); |
8773 } | 8771 } |
8774 | 8772 |
8775 | 8773 |
8776 void Library::InvalidateResolvedName(const String& name) const { | 8774 void Library::InvalidateResolvedName(const String& name) const { |
8777 Object& entry = Object::Handle(); | 8775 Object& entry = Object::Handle(); |
8778 if (LookupResolvedNamesCache(name, &entry)) { | 8776 if (LookupResolvedNamesCache(name, &entry)) { |
8779 // TODO(koda): Support deleted sentinel in snapshots and remove only 'name'. | 8777 // TODO(koda): Support deleted sentinel in snapshots and remove only 'name'. |
8780 InvalidateResolvedNamesCache(); | 8778 InvalidateResolvedNamesCache(); |
8781 } | 8779 } |
8782 } | 8780 } |
(...skipping 9360 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18143 Integer::Cast(hash_code).AsTruncatedUint32Value()); | 18141 Integer::Cast(hash_code).AsTruncatedUint32Value()); |
18144 } else { | 18142 } else { |
18145 return 0; | 18143 return 0; |
18146 } | 18144 } |
18147 } | 18145 } |
18148 }; | 18146 }; |
18149 typedef EnumIndexHashMap<DefaultHashTraits> EnumIndexDefaultMap; | 18147 typedef EnumIndexHashMap<DefaultHashTraits> EnumIndexDefaultMap; |
18150 | 18148 |
18151 | 18149 |
18152 intptr_t LinkedHashMap::Length() const { | 18150 intptr_t LinkedHashMap::Length() const { |
18153 EnumIndexDefaultMap map(Array::Handle(data())); | 18151 EnumIndexDefaultMap map(data()); |
18154 intptr_t result = map.NumOccupied(); | 18152 intptr_t result = map.NumOccupied(); |
18155 { | 18153 ASSERT(map.Release().raw() == data()); |
18156 RawArray* array = map.Release(); | |
18157 ASSERT(array == data()); | |
18158 } | |
18159 return result; | 18154 return result; |
18160 } | 18155 } |
18161 | 18156 |
18162 | 18157 |
18163 void LinkedHashMap::InsertOrUpdate(const Object& key, | 18158 void LinkedHashMap::InsertOrUpdate(const Object& key, |
18164 const Object& value) const { | 18159 const Object& value) const { |
18165 ASSERT(!IsNull()); | 18160 ASSERT(!IsNull()); |
18166 EnumIndexDefaultMap map(Array::Handle(data())); | 18161 EnumIndexDefaultMap map(data()); |
18167 if (!map.UpdateOrInsert(key, value)) { | 18162 if (!map.UpdateOrInsert(key, value)) { |
18168 SetModified(); | 18163 SetModified(); |
18169 } | 18164 } |
18170 StorePointer(&raw_ptr()->data_, map.Release()); | 18165 StorePointer(&raw_ptr()->data_, map.Release().raw()); |
18171 } | 18166 } |
18172 | 18167 |
18173 | 18168 |
18174 RawObject* LinkedHashMap::LookUp(const Object& key) const { | 18169 RawObject* LinkedHashMap::LookUp(const Object& key) const { |
18175 ASSERT(!IsNull()); | 18170 ASSERT(!IsNull()); |
18176 EnumIndexDefaultMap map(Array::Handle(data())); | 18171 EnumIndexDefaultMap map(data()); |
18177 const Object& result = Object::Handle(map.GetOrNull(key)); | 18172 const Object& result = Object::Handle(map.GetOrNull(key)); |
18178 { | 18173 ASSERT(map.Release().raw() == data()); |
18179 RawArray* array = map.Release(); | |
18180 ASSERT(array == data()); | |
18181 } | |
18182 return result.raw(); | 18174 return result.raw(); |
18183 } | 18175 } |
18184 | 18176 |
18185 | 18177 |
18186 bool LinkedHashMap::Contains(const Object& key) const { | 18178 bool LinkedHashMap::Contains(const Object& key) const { |
18187 ASSERT(!IsNull()); | 18179 ASSERT(!IsNull()); |
18188 EnumIndexDefaultMap map(Array::Handle(data())); | 18180 EnumIndexDefaultMap map(data()); |
18189 bool result = map.ContainsKey(key); | 18181 bool result = map.ContainsKey(key); |
18190 { | 18182 ASSERT(map.Release().raw() == data()); |
18191 RawArray* array = map.Release(); | |
18192 ASSERT(array == data()); | |
18193 } | |
18194 return result; | 18183 return result; |
18195 } | 18184 } |
18196 | 18185 |
18197 | 18186 |
18198 RawObject* LinkedHashMap::Remove(const Object& key) const { | 18187 RawObject* LinkedHashMap::Remove(const Object& key) const { |
18199 ASSERT(!IsNull()); | 18188 ASSERT(!IsNull()); |
18200 EnumIndexDefaultMap map(Array::Handle(data())); | 18189 EnumIndexDefaultMap map(data()); |
18201 // TODO(koda): Make 'Remove' also return the old value. | 18190 // TODO(koda): Make 'Remove' also return the old value. |
18202 const Object& result = Object::Handle(map.GetOrNull(key)); | 18191 const Object& result = Object::Handle(map.GetOrNull(key)); |
18203 if (map.Remove(key)) { | 18192 if (map.Remove(key)) { |
18204 SetModified(); | 18193 SetModified(); |
18205 } | 18194 } |
18206 StorePointer(&raw_ptr()->data_, map.Release()); | 18195 StorePointer(&raw_ptr()->data_, map.Release().raw()); |
18207 return result.raw(); | 18196 return result.raw(); |
18208 } | 18197 } |
18209 | 18198 |
18210 | 18199 |
18211 void LinkedHashMap::Clear() const { | 18200 void LinkedHashMap::Clear() const { |
18212 ASSERT(!IsNull()); | 18201 ASSERT(!IsNull()); |
18213 if (Length() != 0) { | 18202 if (Length() != 0) { |
18214 EnumIndexDefaultMap map(Array::Handle(data())); | 18203 EnumIndexDefaultMap map(data()); |
18215 map.Initialize(); | 18204 map.Initialize(); |
18216 SetModified(); | 18205 SetModified(); |
18217 StorePointer(&raw_ptr()->data_, map.Release()); | 18206 StorePointer(&raw_ptr()->data_, map.Release().raw()); |
18218 } | 18207 } |
18219 } | 18208 } |
18220 | 18209 |
18221 | 18210 |
18222 RawArray* LinkedHashMap::ToArray() const { | 18211 RawArray* LinkedHashMap::ToArray() const { |
18223 EnumIndexDefaultMap map(Array::Handle(data())); | 18212 EnumIndexDefaultMap map(data()); |
18224 const Array& result = Array::Handle(HashTables::ToArray(map, true)); | 18213 const Array& result = Array::Handle(HashTables::ToArray(map, true)); |
18225 RawArray* array = map.Release(); | 18214 ASSERT(map.Release().raw() == data()); |
18226 ASSERT(array == data()); | |
18227 return result.raw(); | 18215 return result.raw(); |
18228 } | 18216 } |
18229 | 18217 |
18230 | 18218 |
18231 void LinkedHashMap::SetModified() const { | 18219 void LinkedHashMap::SetModified() const { |
18232 StorePointer(&raw_ptr()->cme_mark_, Instance::null()); | 18220 StorePointer(&raw_ptr()->cme_mark_, Instance::null()); |
18233 } | 18221 } |
18234 | 18222 |
18235 | 18223 |
18236 RawInstance* LinkedHashMap::GetModificationMark(bool create) const { | 18224 RawInstance* LinkedHashMap::GetModificationMark(bool create) const { |
(...skipping 1107 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
19344 return tag_label.ToCString(); | 19332 return tag_label.ToCString(); |
19345 } | 19333 } |
19346 | 19334 |
19347 | 19335 |
19348 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { | 19336 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { |
19349 Instance::PrintJSONImpl(stream, ref); | 19337 Instance::PrintJSONImpl(stream, ref); |
19350 } | 19338 } |
19351 | 19339 |
19352 | 19340 |
19353 } // namespace dart | 19341 } // namespace dart |
OLD | NEW |