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 1135 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
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 Loading... |
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 Loading... |
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 Loading... |
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 |
OLD | NEW |