OLD | NEW |
1 // Copyright (c) 2013, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2013, 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_store.h" | 5 #include "vm/object_store.h" |
6 | 6 |
7 #include "vm/exceptions.h" | 7 #include "vm/exceptions.h" |
8 #include "vm/dart_entry.h" | 8 #include "vm/dart_entry.h" |
9 #include "vm/isolate.h" | 9 #include "vm/isolate.h" |
10 #include "vm/object.h" | 10 #include "vm/object.h" |
11 #include "vm/raw_object.h" | 11 #include "vm/raw_object.h" |
12 #include "vm/symbols.h" | 12 #include "vm/symbols.h" |
13 #include "vm/visitor.h" | 13 #include "vm/visitor.h" |
14 | 14 |
15 namespace dart { | 15 namespace dart { |
16 | 16 |
17 ObjectStore::ObjectStore() | 17 ObjectStore::ObjectStore() |
18 : object_class_(Class::null()), | 18 : object_class_(Class::null()), |
19 object_type_(Type::null()), | 19 object_type_(Type::null()), |
20 null_class_(Class::null()), | 20 null_class_(Class::null()), |
21 null_type_(Type::null()), | 21 null_type_(Type::null()), |
22 function_type_(Type::null()), | 22 function_type_(Type::null()), |
23 closure_class_(Class::null()), | 23 closure_class_(Class::null()), |
24 number_type_(Type::null()), | 24 number_type_(Type::null()), |
25 int_type_(Type::null()), | 25 int_type_(Type::null()), |
26 integer_implementation_class_(Class::null()), | 26 integer_implementation_class_(Class::null()), |
27 smi_class_(Class::null()), | 27 smi_class_(Class::null()), |
28 smi_type_(Type::null()), | 28 smi_type_(Type::null()), |
29 mint_class_(Class::null()), | 29 mint_class_(Class::null()), |
30 mint_type_(Type::null()), | 30 mint_type_(Type::null()), |
31 bigint_class_(Class::null()), | 31 bigint_class_(Class::null()), |
32 double_class_(Class::null()), | 32 double_class_(Class::null()), |
33 double_type_(Type::null()), | 33 double_type_(Type::null()), |
34 float32x4_type_(Type::null()), | 34 float32x4_type_(Type::null()), |
35 int32x4_type_(Type::null()), | 35 int32x4_type_(Type::null()), |
36 float64x2_type_(Type::null()), | 36 float64x2_type_(Type::null()), |
37 string_type_(Type::null()), | 37 string_type_(Type::null()), |
38 compiletime_error_class_(Class::null()), | 38 compiletime_error_class_(Class::null()), |
39 future_class_(Class::null()), | 39 future_class_(Class::null()), |
40 completer_class_(Class::null()), | 40 completer_class_(Class::null()), |
41 stream_iterator_class_(Class::null()), | 41 stream_iterator_class_(Class::null()), |
42 symbol_class_(Class::null()), | 42 symbol_class_(Class::null()), |
43 one_byte_string_class_(Class::null()), | 43 one_byte_string_class_(Class::null()), |
44 two_byte_string_class_(Class::null()), | 44 two_byte_string_class_(Class::null()), |
45 external_one_byte_string_class_(Class::null()), | 45 external_one_byte_string_class_(Class::null()), |
46 external_two_byte_string_class_(Class::null()), | 46 external_two_byte_string_class_(Class::null()), |
47 bool_type_(Type::null()), | 47 bool_type_(Type::null()), |
48 bool_class_(Class::null()), | 48 bool_class_(Class::null()), |
49 array_class_(Class::null()), | 49 array_class_(Class::null()), |
50 array_type_(Type::null()), | 50 array_type_(Type::null()), |
51 immutable_array_class_(Class::null()), | 51 immutable_array_class_(Class::null()), |
52 growable_object_array_class_(Class::null()), | 52 growable_object_array_class_(Class::null()), |
53 linked_hash_map_class_(Class::null()), | 53 linked_hash_map_class_(Class::null()), |
54 float32x4_class_(Class::null()), | 54 float32x4_class_(Class::null()), |
55 int32x4_class_(Class::null()), | 55 int32x4_class_(Class::null()), |
56 float64x2_class_(Class::null()), | 56 float64x2_class_(Class::null()), |
57 error_class_(Class::null()), | 57 error_class_(Class::null()), |
58 weak_property_class_(Class::null()), | 58 weak_property_class_(Class::null()), |
59 symbol_table_(Array::null()), | 59 symbol_table_(Array::null()), |
60 canonical_types_(Array::null()), | 60 canonical_types_(Array::null()), |
61 canonical_type_arguments_(Array::null()), | 61 canonical_type_arguments_(Array::null()), |
62 async_library_(Library::null()), | 62 async_library_(Library::null()), |
63 builtin_library_(Library::null()), | 63 builtin_library_(Library::null()), |
64 core_library_(Library::null()), | 64 core_library_(Library::null()), |
65 collection_library_(Library::null()), | 65 collection_library_(Library::null()), |
66 convert_library_(Library::null()), | 66 convert_library_(Library::null()), |
67 developer_library_(Library::null()), | 67 developer_library_(Library::null()), |
68 internal_library_(Library::null()), | 68 internal_library_(Library::null()), |
69 isolate_library_(Library::null()), | 69 isolate_library_(Library::null()), |
70 math_library_(Library::null()), | 70 math_library_(Library::null()), |
71 mirrors_library_(Library::null()), | 71 mirrors_library_(Library::null()), |
72 native_wrappers_library_(Library::null()), | 72 native_wrappers_library_(Library::null()), |
73 profiler_library_(Library::null()), | 73 profiler_library_(Library::null()), |
74 root_library_(Library::null()), | 74 root_library_(Library::null()), |
75 typed_data_library_(Library::null()), | 75 typed_data_library_(Library::null()), |
76 vmservice_library_(Library::null()), | 76 vmservice_library_(Library::null()), |
77 libraries_(GrowableObjectArray::null()), | 77 libraries_(GrowableObjectArray::null()), |
78 libraries_map_(Array::null()), | 78 libraries_map_(Array::null()), |
79 closure_functions_(GrowableObjectArray::null()), | 79 closure_functions_(GrowableObjectArray::null()), |
80 pending_classes_(GrowableObjectArray::null()), | 80 pending_classes_(GrowableObjectArray::null()), |
81 pending_deferred_loads_(GrowableObjectArray::null()), | 81 pending_deferred_loads_(GrowableObjectArray::null()), |
82 resume_capabilities_(GrowableObjectArray::null()), | 82 resume_capabilities_(GrowableObjectArray::null()), |
83 exit_listeners_(GrowableObjectArray::null()), | 83 exit_listeners_(GrowableObjectArray::null()), |
84 error_listeners_(GrowableObjectArray::null()), | 84 error_listeners_(GrowableObjectArray::null()), |
85 empty_context_(Context::null()), | 85 empty_context_(Context::null()), |
86 stack_overflow_(Instance::null()), | 86 stack_overflow_(Instance::null()), |
87 out_of_memory_(Instance::null()), | 87 out_of_memory_(Instance::null()), |
88 preallocated_unhandled_exception_(UnhandledException::null()), | 88 preallocated_unhandled_exception_(UnhandledException::null()), |
89 preallocated_stack_trace_(Stacktrace::null()), | 89 preallocated_stack_trace_(Stacktrace::null()), |
90 lookup_port_handler_(Function::null()), | 90 lookup_port_handler_(Function::null()), |
91 empty_uint32_array_(TypedData::null()), | 91 empty_uint32_array_(TypedData::null()), |
92 handle_message_function_(Function::null()), | 92 handle_message_function_(Function::null()), |
93 simple_instance_of_function_(Function::null()), | 93 simple_instance_of_function_(Function::null()), |
94 simple_instance_of_true_function_(Function::null()), | 94 simple_instance_of_true_function_(Function::null()), |
95 simple_instance_of_false_function_(Function::null()), | 95 simple_instance_of_false_function_(Function::null()), |
96 library_load_error_table_(Array::null()), | 96 library_load_error_table_(Array::null()), |
97 unique_dynamic_targets_(Array::null()), | 97 unique_dynamic_targets_(Array::null()), |
98 token_objects_(GrowableObjectArray::null()), | 98 token_objects_(GrowableObjectArray::null()), |
99 token_objects_map_(Array::null()), | 99 token_objects_map_(Array::null()), |
100 megamorphic_cache_table_(GrowableObjectArray::null()), | 100 megamorphic_cache_table_(GrowableObjectArray::null()), |
101 megamorphic_miss_code_(Code::null()), | 101 megamorphic_miss_code_(Code::null()), |
102 megamorphic_miss_function_(Function::null()) { | 102 megamorphic_miss_function_(Function::null()) { |
103 for (RawObject** current = from(); current <= to(); current++) { | 103 for (RawObject** current = from(); current <= to(); current++) { |
104 ASSERT(*current == Object::null()); | 104 ASSERT(*current == Object::null()); |
105 } | 105 } |
106 } | 106 } |
107 | 107 |
108 | 108 |
109 ObjectStore::~ObjectStore() { | 109 ObjectStore::~ObjectStore() {} |
110 } | |
111 | 110 |
112 | 111 |
113 void ObjectStore::VisitObjectPointers(ObjectPointerVisitor* visitor) { | 112 void ObjectStore::VisitObjectPointers(ObjectPointerVisitor* visitor) { |
114 ASSERT(visitor != NULL); | 113 ASSERT(visitor != NULL); |
115 visitor->VisitPointers(from(), to()); | 114 visitor->VisitPointers(from(), to()); |
116 } | 115 } |
117 | 116 |
118 | 117 |
119 void ObjectStore::Init(Isolate* isolate) { | 118 void ObjectStore::Init(Isolate* isolate) { |
120 ASSERT(isolate->object_store() == NULL); | 119 ASSERT(isolate->object_store() == NULL); |
121 ObjectStore* store = new ObjectStore(); | 120 ObjectStore* store = new ObjectStore(); |
122 isolate->set_object_store(store); | 121 isolate->set_object_store(store); |
123 } | 122 } |
124 | 123 |
125 | 124 |
126 #ifndef PRODUCT | 125 #ifndef PRODUCT |
127 void ObjectStore::PrintToJSONObject(JSONObject* jsobj) { | 126 void ObjectStore::PrintToJSONObject(JSONObject* jsobj) { |
128 if (!FLAG_support_service) { | 127 if (!FLAG_support_service) { |
129 return; | 128 return; |
130 } | 129 } |
131 jsobj->AddProperty("type", "_ObjectStore"); | 130 jsobj->AddProperty("type", "_ObjectStore"); |
132 | 131 |
133 { | 132 { |
134 JSONObject fields(jsobj, "fields"); | 133 JSONObject fields(jsobj, "fields"); |
135 Object& value = Object::Handle(); | 134 Object& value = Object::Handle(); |
136 #define PRINT_OBJECT_STORE_FIELD(type, name) \ | 135 #define PRINT_OBJECT_STORE_FIELD(type, name) \ |
137 value = name; \ | 136 value = name; \ |
138 fields.AddProperty(#name, value); | 137 fields.AddProperty(#name, value); |
139 OBJECT_STORE_FIELD_LIST(PRINT_OBJECT_STORE_FIELD); | 138 OBJECT_STORE_FIELD_LIST(PRINT_OBJECT_STORE_FIELD); |
140 #undef PRINT_OBJECT_STORE_FIELD | 139 #undef PRINT_OBJECT_STORE_FIELD |
141 } | 140 } |
142 } | 141 } |
143 #endif // !PRODUCT | 142 #endif // !PRODUCT |
144 | 143 |
145 | 144 |
146 RawError* ObjectStore::PreallocateObjects() { | 145 RawError* ObjectStore::PreallocateObjects() { |
147 Thread* thread = Thread::Current(); | 146 Thread* thread = Thread::Current(); |
148 Isolate* isolate = thread->isolate(); | 147 Isolate* isolate = thread->isolate(); |
149 Zone* zone = thread->zone(); | 148 Zone* zone = thread->zone(); |
(...skipping 10 matching lines...) Expand all Loading... |
160 this->pending_deferred_loads_ = GrowableObjectArray::New(); | 159 this->pending_deferred_loads_ = GrowableObjectArray::New(); |
161 | 160 |
162 this->closure_functions_ = GrowableObjectArray::New(); | 161 this->closure_functions_ = GrowableObjectArray::New(); |
163 this->resume_capabilities_ = GrowableObjectArray::New(); | 162 this->resume_capabilities_ = GrowableObjectArray::New(); |
164 this->exit_listeners_ = GrowableObjectArray::New(); | 163 this->exit_listeners_ = GrowableObjectArray::New(); |
165 this->error_listeners_ = GrowableObjectArray::New(); | 164 this->error_listeners_ = GrowableObjectArray::New(); |
166 | 165 |
167 Object& result = Object::Handle(); | 166 Object& result = Object::Handle(); |
168 const Library& library = Library::Handle(Library::CoreLibrary()); | 167 const Library& library = Library::Handle(Library::CoreLibrary()); |
169 | 168 |
170 result = DartLibraryCalls::InstanceCreate(library, | 169 result = |
171 Symbols::StackOverflowError(), | 170 DartLibraryCalls::InstanceCreate(library, Symbols::StackOverflowError(), |
172 Symbols::Dot(), | 171 Symbols::Dot(), Object::empty_array()); |
173 Object::empty_array()); | |
174 if (result.IsError()) { | 172 if (result.IsError()) { |
175 return Error::Cast(result).raw(); | 173 return Error::Cast(result).raw(); |
176 } | 174 } |
177 set_stack_overflow(Instance::Cast(result)); | 175 set_stack_overflow(Instance::Cast(result)); |
178 | 176 |
179 result = DartLibraryCalls::InstanceCreate(library, | 177 result = |
180 Symbols::OutOfMemoryError(), | 178 DartLibraryCalls::InstanceCreate(library, Symbols::OutOfMemoryError(), |
181 Symbols::Dot(), | 179 Symbols::Dot(), Object::empty_array()); |
182 Object::empty_array()); | |
183 if (result.IsError()) { | 180 if (result.IsError()) { |
184 return Error::Cast(result).raw(); | 181 return Error::Cast(result).raw(); |
185 } | 182 } |
186 set_out_of_memory(Instance::Cast(result)); | 183 set_out_of_memory(Instance::Cast(result)); |
187 | 184 |
188 // Allocate pre-allocated unhandled exception object initialized with the | 185 // Allocate pre-allocated unhandled exception object initialized with the |
189 // pre-allocated OutOfMemoryError. | 186 // pre-allocated OutOfMemoryError. |
190 const UnhandledException& unhandled_exception = UnhandledException::Handle( | 187 const UnhandledException& unhandled_exception = |
191 UnhandledException::New(Instance::Cast(result), | 188 UnhandledException::Handle(UnhandledException::New( |
192 Stacktrace::Handle(zone))); | 189 Instance::Cast(result), Stacktrace::Handle(zone))); |
193 set_preallocated_unhandled_exception(unhandled_exception); | 190 set_preallocated_unhandled_exception(unhandled_exception); |
194 | 191 |
195 const Array& code_array = Array::Handle(zone, | 192 const Array& code_array = Array::Handle( |
196 Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld)); | 193 zone, Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld)); |
197 const Array& pc_offset_array = Array::Handle(zone, | 194 const Array& pc_offset_array = Array::Handle( |
198 Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld)); | 195 zone, Array::New(Stacktrace::kPreallocatedStackdepth, Heap::kOld)); |
199 const Stacktrace& stack_trace = Stacktrace::Handle(zone, | 196 const Stacktrace& stack_trace = |
200 Stacktrace::New(code_array, pc_offset_array)); | 197 Stacktrace::Handle(zone, Stacktrace::New(code_array, pc_offset_array)); |
201 // Expansion of inlined functions requires additional memory at run time, | 198 // Expansion of inlined functions requires additional memory at run time, |
202 // avoid it. | 199 // avoid it. |
203 stack_trace.set_expand_inlined(false); | 200 stack_trace.set_expand_inlined(false); |
204 set_preallocated_stack_trace(stack_trace); | 201 set_preallocated_stack_trace(stack_trace); |
205 | 202 |
206 return Error::null(); | 203 return Error::null(); |
207 } | 204 } |
208 | 205 |
209 | 206 |
210 RawFunction* ObjectStore::PrivateObjectLookup(const String& name) { | 207 RawFunction* ObjectStore::PrivateObjectLookup(const String& name) { |
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
253 simple_instance_of_function_ = | 250 simple_instance_of_function_ = |
254 PrivateObjectLookup(Symbols::_simpleInstanceOf()); | 251 PrivateObjectLookup(Symbols::_simpleInstanceOf()); |
255 simple_instance_of_true_function_ = | 252 simple_instance_of_true_function_ = |
256 PrivateObjectLookup(Symbols::_simpleInstanceOfTrue()); | 253 PrivateObjectLookup(Symbols::_simpleInstanceOfTrue()); |
257 simple_instance_of_false_function_ = | 254 simple_instance_of_false_function_ = |
258 PrivateObjectLookup(Symbols::_simpleInstanceOfFalse()); | 255 PrivateObjectLookup(Symbols::_simpleInstanceOfFalse()); |
259 #endif | 256 #endif |
260 } | 257 } |
261 | 258 |
262 } // namespace dart | 259 } // namespace dart |
OLD | NEW |