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

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

Issue 380333002: Add VM class for Map/LinkedHashMap. (Closed) Base URL: http://dart.googlecode.com/svn/branches/bleeding_edge/dart/
Patch Set: Created 6 years, 5 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 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after
1146 lib.Register(); 1146 lib.Register();
1147 isolate->object_store()->set_bootstrap_library(ObjectStore::kMirrors, 1147 isolate->object_store()->set_bootstrap_library(ObjectStore::kMirrors,
1148 lib); 1148 lib);
1149 } 1149 }
1150 ASSERT(!lib.IsNull()); 1150 ASSERT(!lib.IsNull());
1151 ASSERT(lib.raw() == Library::MirrorsLibrary()); 1151 ASSERT(lib.raw() == Library::MirrorsLibrary());
1152 1152
1153 cls = Class::New<MirrorReference>(); 1153 cls = Class::New<MirrorReference>();
1154 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib); 1154 RegisterPrivateClass(cls, Symbols::_MirrorReference(), lib);
1155 1155
1156 // Pre-register the collection library so we can place the vm class
1157 // LinkedHashMap there rather than the core library.
1158 lib = Library::LookupLibrary(Symbols::DartCollection());
1159 if (lib.IsNull()) {
1160 lib = Library::NewLibraryHelper(Symbols::DartCollection(), true);
1161 lib.SetLoadRequested();
1162 lib.Register();
1163 isolate->object_store()->set_bootstrap_library(ObjectStore::kCollection,
1164 lib);
1165 }
1166 ASSERT(!lib.IsNull());
1167 ASSERT(lib.raw() == Library::CollectionLibrary());
1168
1169 cls = Class::New<LinkedHashMap>();
1170 object_store->set_linked_hash_map_class(cls);
1171 cls.set_type_arguments_field_offset(LinkedHashMap::type_arguments_offset());
1172 cls.set_num_type_arguments(2);
1173 cls.set_num_own_type_arguments(2);
1174 RegisterPrivateClass(cls, Symbols::_LinkedHashMap(), lib);
1175 pending_classes.Add(cls);
1176
1156 // Pre-register the profiler library so we can place the vm class 1177 // Pre-register the profiler library so we can place the vm class
1157 // UserTag there rather than the core library. 1178 // UserTag there rather than the core library.
1158 lib = Library::LookupLibrary(Symbols::DartProfiler()); 1179 lib = Library::LookupLibrary(Symbols::DartProfiler());
1159 if (lib.IsNull()) { 1180 if (lib.IsNull()) {
1160 lib = Library::NewLibraryHelper(Symbols::DartProfiler(), true); 1181 lib = Library::NewLibraryHelper(Symbols::DartProfiler(), true);
1161 lib.SetLoadRequested(); 1182 lib.SetLoadRequested();
1162 lib.Register(); 1183 lib.Register();
1163 isolate->object_store()->set_bootstrap_library(ObjectStore::kProfiler, 1184 isolate->object_store()->set_bootstrap_library(ObjectStore::kProfiler,
1164 lib); 1185 lib);
1165 } 1186 }
(...skipping 250 matching lines...) Expand 10 before | Expand all | Expand 10 after
1416 1437
1417 cls = Class::New<Array>(); 1438 cls = Class::New<Array>();
1418 object_store->set_array_class(cls); 1439 object_store->set_array_class(cls);
1419 1440
1420 cls = Class::New<Array>(kImmutableArrayCid); 1441 cls = Class::New<Array>(kImmutableArrayCid);
1421 object_store->set_immutable_array_class(cls); 1442 object_store->set_immutable_array_class(cls);
1422 1443
1423 cls = Class::New<GrowableObjectArray>(); 1444 cls = Class::New<GrowableObjectArray>();
1424 object_store->set_growable_object_array_class(cls); 1445 object_store->set_growable_object_array_class(cls);
1425 1446
1447 cls = Class::New<LinkedHashMap>();
1448 object_store->set_linked_hash_map_class(cls);
1449
1426 cls = Class::New<Float32x4>(); 1450 cls = Class::New<Float32x4>();
1427 object_store->set_float32x4_class(cls); 1451 object_store->set_float32x4_class(cls);
1428 1452
1429 cls = Class::New<Int32x4>(); 1453 cls = Class::New<Int32x4>();
1430 object_store->set_int32x4_class(cls); 1454 object_store->set_int32x4_class(cls);
1431 1455
1432 cls = Class::New<Float64x2>(); 1456 cls = Class::New<Float64x2>();
1433 object_store->set_float64x2_class(cls); 1457 object_store->set_float64x2_class(cls);
1434 1458
1435 #define REGISTER_TYPED_DATA_CLASS(clazz) \ 1459 #define REGISTER_TYPED_DATA_CLASS(clazz) \
(...skipping 16546 matching lines...) Expand 10 before | Expand all | Expand 10 after
17982 JSONObject jselement(&jsarr); 18006 JSONObject jselement(&jsarr);
17983 jselement.AddProperty("index", index); 18007 jselement.AddProperty("index", index);
17984 18008
17985 Object& element = Object::Handle(At(index)); 18009 Object& element = Object::Handle(At(index));
17986 jselement.AddProperty("value", element); 18010 jselement.AddProperty("value", element);
17987 } 18011 }
17988 } 18012 }
17989 } 18013 }
17990 18014
17991 18015
18016 // Equivalent to Dart's operator "==" and hashCode.
18017 class DefaultHashTraits {
18018 public:
18019 static bool IsMatch(const Object& a, const Object& b) {
18020 if (a.IsNull() || b.IsNull()) {
18021 return (a.IsNull() && b.IsNull());
18022 } else {
18023 return Instance::Cast(a).OperatorEquals(Instance::Cast(b));
18024 }
18025 }
18026 static uword Hash(const Object& obj) {
18027 if (obj.IsNull()) {
18028 return 0;
18029 }
18030 // TODO(koda): Ensure VM classes only produce Smi hash codes, and remove
18031 // non-Smi cases once Dart-side implementation is complete.
18032 Isolate* isolate = Isolate::Current();
18033 REUSABLE_INSTANCE_HANDLESCOPE(isolate);
18034 Instance& hash_code = isolate->InstanceHandle();
18035 hash_code ^= Instance::Cast(obj).HashCode();
18036 if (hash_code.IsSmi()) {
18037 // May waste some bits on 64-bit, to ensure consistency with non-Smi case.
18038 return static_cast<uword>(Smi::Cast(hash_code).Value() & 0xFFFFFFFF);
18039 } else if (hash_code.IsInteger()) {
18040 return static_cast<uword>(
18041 Integer::Cast(hash_code).AsTruncatedUint32Value());
18042 } else {
18043 return 0;
18044 }
18045 }
18046 };
18047 typedef EnumIndexHashMap<DefaultHashTraits> EnumIndexDefaultMap;
18048
18049
18050 intptr_t LinkedHashMap::Length() const {
18051 EnumIndexDefaultMap map(Array::Handle(data()));
18052 intptr_t result = map.NumOccupied();
18053 {
18054 RawArray* array = map.Release();
18055 ASSERT(array == data());
18056 }
18057 return result;
18058 }
18059
18060
18061 void LinkedHashMap::InsertOrUpdate(const Object& key,
18062 const Object& value) const {
18063 ASSERT(!IsNull());
18064 EnumIndexDefaultMap map(Array::Handle(data()));
18065 if (!map.UpdateOrInsert(key, value)) {
18066 SetModified();
18067 }
18068 StorePointer(&raw_ptr()->data_, map.Release());
18069 }
18070
18071
18072 RawObject* LinkedHashMap::LookUp(const Object& key) const {
18073 ASSERT(!IsNull());
18074 EnumIndexDefaultMap map(Array::Handle(data()));
18075 const Object& result = Object::Handle(map.GetOrNull(key));
18076 {
18077 RawArray* array = map.Release();
18078 ASSERT(array == data());
18079 }
18080 return result.raw();
18081 }
18082
18083
18084 bool LinkedHashMap::Contains(const Object& key) const {
18085 ASSERT(!IsNull());
18086 EnumIndexDefaultMap map(Array::Handle(data()));
18087 bool result = map.ContainsKey(key);
18088 {
18089 RawArray* array = map.Release();
18090 ASSERT(array == data());
18091 }
18092 return result;
18093 }
18094
18095
18096 RawObject* LinkedHashMap::Remove(const Object& key) const {
18097 ASSERT(!IsNull());
18098 EnumIndexDefaultMap map(Array::Handle(data()));
18099 // TODO(koda): Make 'Remove' also return the old value.
18100 const Object& result = Object::Handle(map.GetOrNull(key));
18101 if (map.Remove(key)) {
18102 SetModified();
18103 }
18104 StorePointer(&raw_ptr()->data_, map.Release());
18105 return result.raw();
18106 }
18107
18108
18109 void LinkedHashMap::Clear() const {
18110 ASSERT(!IsNull());
18111 if (Length() != 0) {
18112 EnumIndexDefaultMap map(Array::Handle(data()));
18113 map.Initialize();
18114 SetModified();
18115 StorePointer(&raw_ptr()->data_, map.Release());
18116 }
18117 }
18118
18119
18120 RawArray* LinkedHashMap::ToArray() const {
18121 EnumIndexDefaultMap map(Array::Handle(data()));
18122 const Array& result = Array::Handle(HashTables::ToArray(map, true));
18123 RawArray* array = map.Release();
18124 ASSERT(array == data());
18125 return result.raw();
18126 }
18127
18128
18129 void LinkedHashMap::SetModified() const {
18130 StorePointer(&raw_ptr()->cme_mark_, Instance::null());
18131 }
18132
18133
18134 RawInstance* LinkedHashMap::GetModificationMark(bool create) const {
18135 if (create && raw_ptr()->cme_mark_ == Instance::null()) {
18136 Isolate* isolate = Isolate::Current();
18137 const Class& object_class =
18138 Class::Handle(isolate, isolate->object_store()->object_class());
18139 const Instance& current =
18140 Instance::Handle(isolate, Instance::New(object_class));
18141 StorePointer(&raw_ptr()->cme_mark_, current.raw());
18142 }
18143 return raw_ptr()->cme_mark_;
18144 }
18145
18146
18147 RawLinkedHashMap* LinkedHashMap::New(Heap::Space space) {
18148 ASSERT(Isolate::Current()->object_store()->linked_hash_map_class()
18149 != Class::null());
18150 static const intptr_t kInitialCapacity = 4;
18151 const Array& data =
18152 Array::Handle(HashTables::New<EnumIndexDefaultMap>(kInitialCapacity,
18153 space));
18154 LinkedHashMap& result = LinkedHashMap::Handle();
18155 {
18156 RawObject* raw = Object::Allocate(LinkedHashMap::kClassId,
18157 LinkedHashMap::InstanceSize(),
18158 space);
18159 NoGCScope no_gc;
18160 result ^= raw;
18161 result.SetData(data);
18162 result.SetModified();
18163 }
18164 return result.raw();
18165 }
18166
18167
18168 const char* LinkedHashMap::ToCString() const {
18169 // TODO(koda): Print key/value pairs.
18170 return "_LinkedHashMap";
18171 }
18172
18173
18174 void LinkedHashMap::PrintJSONImpl(JSONStream* stream, bool ref) const {
18175 // TODO(koda): Print key/value pairs.
18176 Instance::PrintJSONImpl(stream, ref);
18177 }
18178
18179
17992 RawFloat32x4* Float32x4::New(float v0, float v1, float v2, float v3, 18180 RawFloat32x4* Float32x4::New(float v0, float v1, float v2, float v3,
17993 Heap::Space space) { 18181 Heap::Space space) {
17994 ASSERT(Isolate::Current()->object_store()->float32x4_class() != 18182 ASSERT(Isolate::Current()->object_store()->float32x4_class() !=
17995 Class::null()); 18183 Class::null());
17996 Float32x4& result = Float32x4::Handle(); 18184 Float32x4& result = Float32x4::Handle();
17997 { 18185 {
17998 RawObject* raw = Object::Allocate(Float32x4::kClassId, 18186 RawObject* raw = Object::Allocate(Float32x4::kClassId,
17999 Float32x4::InstanceSize(), 18187 Float32x4::InstanceSize(),
18000 space); 18188 space);
18001 NoGCScope no_gc; 18189 NoGCScope no_gc;
(...skipping 1052 matching lines...) Expand 10 before | Expand all | Expand 10 after
19054 return tag_label.ToCString(); 19242 return tag_label.ToCString();
19055 } 19243 }
19056 19244
19057 19245
19058 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const { 19246 void UserTag::PrintJSONImpl(JSONStream* stream, bool ref) const {
19059 Instance::PrintJSONImpl(stream, ref); 19247 Instance::PrintJSONImpl(stream, ref);
19060 } 19248 }
19061 19249
19062 19250
19063 } // namespace dart 19251 } // namespace dart
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698