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/symbols.h" | 5 #include "vm/symbols.h" |
6 | 6 |
7 #include "vm/handles.h" | 7 #include "vm/handles.h" |
8 #include "vm/handles_impl.h" | 8 #include "vm/handles_impl.h" |
9 #include "vm/hash_table.h" | 9 #include "vm/hash_table.h" |
10 #include "vm/isolate.h" | 10 #include "vm/isolate.h" |
(...skipping 199 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
210 const intptr_t initial_size = (isolate == Dart::vm_isolate()) ? | 210 const intptr_t initial_size = (isolate == Dart::vm_isolate()) ? |
211 kInitialVMIsolateSymtabSize : kInitialSymtabSize; | 211 kInitialVMIsolateSymtabSize : kInitialSymtabSize; |
212 Array& array = | 212 Array& array = |
213 Array::Handle(HashTables::New<SymbolTable>(initial_size, Heap::kOld)); | 213 Array::Handle(HashTables::New<SymbolTable>(initial_size, Heap::kOld)); |
214 isolate->object_store()->set_symbol_table(array); | 214 isolate->object_store()->set_symbol_table(array); |
215 } | 215 } |
216 | 216 |
217 | 217 |
218 void Symbols::GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity) { | 218 void Symbols::GetStats(Isolate* isolate, intptr_t* size, intptr_t* capacity) { |
219 ASSERT(isolate != NULL); | 219 ASSERT(isolate != NULL); |
220 SymbolTable table(Array::Handle(isolate->object_store()->symbol_table())); | 220 SymbolTable table(isolate, isolate->object_store()->symbol_table()); |
221 *size = table.NumOccupied(); | 221 *size = table.NumOccupied(); |
222 *capacity = table.NumEntries(); | 222 *capacity = table.NumEntries(); |
223 table.Release(); | 223 table.Release(); |
224 } | 224 } |
225 | 225 |
226 | 226 |
227 void Symbols::AddToVMIsolate(const String& str) { | 227 void Symbols::AddToVMIsolate(const String& str) { |
228 // Should only be run by the vm isolate. | 228 // Should only be run by the vm isolate. |
229 ASSERT(Isolate::Current() == Dart::vm_isolate()); | 229 ASSERT(Isolate::Current() == Dart::vm_isolate()); |
230 Isolate* isolate = Dart::vm_isolate(); | 230 Isolate* isolate = Dart::vm_isolate(); |
231 Array& array = Array::Handle(isolate->object_store()->symbol_table()); | 231 SymbolTable table(isolate, isolate->object_store()->symbol_table()); |
232 SymbolTable table(array); | |
233 bool present = table.Insert(str); | 232 bool present = table.Insert(str); |
234 str.SetCanonical(); | 233 str.SetCanonical(); |
235 ASSERT(!present); | 234 ASSERT(!present); |
236 isolate->object_store()->set_symbol_table(array); | 235 isolate->object_store()->set_symbol_table(table.Release()); |
237 table.Release(); | |
238 } | 236 } |
239 | 237 |
240 | 238 |
241 RawString* Symbols::New(const char* cstr, intptr_t len) { | 239 RawString* Symbols::New(const char* cstr, intptr_t len) { |
242 ASSERT((cstr != NULL) && (len >= 0)); | 240 ASSERT((cstr != NULL) && (len >= 0)); |
243 const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr); | 241 const uint8_t* utf8_array = reinterpret_cast<const uint8_t*>(cstr); |
244 return Symbols::FromUTF8(utf8_array, len); | 242 return Symbols::FromUTF8(utf8_array, len); |
245 } | 243 } |
246 | 244 |
247 | 245 |
(...skipping 28 matching lines...) Expand all Loading... |
276 | 274 |
277 | 275 |
278 RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) { | 276 RawString* Symbols::FromUTF32(const int32_t* utf32_array, intptr_t len) { |
279 return NewSymbol(UTF32Array(utf32_array, len)); | 277 return NewSymbol(UTF32Array(utf32_array, len)); |
280 } | 278 } |
281 | 279 |
282 | 280 |
283 // StringType can be StringSlice, Latin1Array, UTF16Array or UTF32Array. | 281 // StringType can be StringSlice, Latin1Array, UTF16Array or UTF32Array. |
284 template<typename StringType> | 282 template<typename StringType> |
285 RawString* Symbols::NewSymbol(const StringType& str) { | 283 RawString* Symbols::NewSymbol(const StringType& str) { |
286 String& symbol = String::Handle(); | 284 Isolate* isolate = Isolate::Current(); |
| 285 String& symbol = String::Handle(isolate); |
287 { | 286 { |
288 Isolate* isolate = Dart::vm_isolate(); | 287 Isolate* vm_isolate = Dart::vm_isolate(); |
289 Array& array = Array::Handle(isolate->object_store()->symbol_table()); | 288 SymbolTable table(isolate, vm_isolate->object_store()->symbol_table()); |
290 SymbolTable table(array); | |
291 symbol ^= table.GetOrNull(str); | 289 symbol ^= table.GetOrNull(str); |
292 table.Release(); | 290 table.Release(); |
293 } | 291 } |
294 if (symbol.IsNull()) { | 292 if (symbol.IsNull()) { |
295 Isolate* isolate = Isolate::Current(); | 293 SymbolTable table(isolate, isolate->object_store()->symbol_table()); |
296 Array& array = Array::Handle(isolate->object_store()->symbol_table()); | |
297 SymbolTable table(array); | |
298 symbol ^= table.InsertNewOrGet(str); | 294 symbol ^= table.InsertNewOrGet(str); |
299 isolate->object_store()->set_symbol_table(array); | 295 isolate->object_store()->set_symbol_table(table.Release()); |
300 table.Release(); | |
301 } | 296 } |
302 ASSERT(symbol.IsSymbol()); | 297 ASSERT(symbol.IsSymbol()); |
303 return symbol.raw(); | 298 return symbol.raw(); |
304 } | 299 } |
305 | 300 |
306 | 301 |
307 RawString* Symbols::New(const String& str) { | 302 RawString* Symbols::New(const String& str) { |
308 if (str.IsSymbol()) { | 303 if (str.IsSymbol()) { |
309 return str.raw(); | 304 return str.raw(); |
310 } | 305 } |
(...skipping 45 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
356 RawObject* Symbols::GetVMSymbol(intptr_t object_id) { | 351 RawObject* Symbols::GetVMSymbol(intptr_t object_id) { |
357 ASSERT(IsVMSymbolId(object_id)); | 352 ASSERT(IsVMSymbolId(object_id)); |
358 intptr_t i = (object_id - kMaxPredefinedObjectIds); | 353 intptr_t i = (object_id - kMaxPredefinedObjectIds); |
359 if ((i > kIllegal) && (i < Symbols::kMaxPredefinedId)) { | 354 if ((i > kIllegal) && (i < Symbols::kMaxPredefinedId)) { |
360 return symbol_handles_[i]->raw(); | 355 return symbol_handles_[i]->raw(); |
361 } | 356 } |
362 return Object::null(); | 357 return Object::null(); |
363 } | 358 } |
364 | 359 |
365 } // namespace dart | 360 } // namespace dart |
OLD | NEW |