OLD | NEW |
1 // Copyright (c) 2016, the Dart project authors. Please see the AUTHORS file | 1 // Copyright (c) 2016, 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 <set> | 5 #include <set> |
6 | 6 |
7 #include "vm/kernel_to_il.h" | 7 #include "vm/kernel_to_il.h" |
8 | 8 |
9 #include "vm/compiler.h" | 9 #include "vm/compiler.h" |
10 #include "vm/intermediate_language.h" | 10 #include "vm/intermediate_language.h" |
(...skipping 118 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
129 intptr_t TranslationHelper::StringSize(StringIndex index) const { | 129 intptr_t TranslationHelper::StringSize(StringIndex index) const { |
130 return StringOffset(StringIndex(index + 1)) - StringOffset(index); | 130 return StringOffset(StringIndex(index + 1)) - StringOffset(index); |
131 } | 131 } |
132 | 132 |
133 uint8_t TranslationHelper::CharacterAt(StringIndex string_index, | 133 uint8_t TranslationHelper::CharacterAt(StringIndex string_index, |
134 intptr_t index) { | 134 intptr_t index) { |
135 ASSERT(index < StringSize(string_index)); | 135 ASSERT(index < StringSize(string_index)); |
136 return string_data_.GetUint8(StringOffset(string_index) + index); | 136 return string_data_.GetUint8(StringOffset(string_index) + index); |
137 } | 137 } |
138 | 138 |
| 139 uint8_t* TranslationHelper::StringBuffer(StringIndex string_index) const { |
| 140 // Though this implementation appears like it could be replaced by |
| 141 // string_data_.DataAddr(StringOffset(string_index)), it can't quite. If the |
| 142 // last string in the string table is a zero length string, then the latter |
| 143 // expression will try to return the address that is one past the backing |
| 144 // store of the string_data_ table. Though this is safe in C++ as long as the |
| 145 // address is not dereferenced, it will trigger the assert in |
| 146 // TypedData::DataAddr. |
| 147 ASSERT(Thread::Current()->no_safepoint_scope_depth() > 0); |
| 148 return reinterpret_cast<uint8_t*>(string_data_.DataAddr(0)) + |
| 149 StringOffset(string_index); |
| 150 } |
| 151 |
139 bool TranslationHelper::StringEquals(StringIndex string_index, | 152 bool TranslationHelper::StringEquals(StringIndex string_index, |
140 const char* other) { | 153 const char* other) { |
| 154 intptr_t length = strlen(other); |
| 155 if (length != StringSize(string_index)) return false; |
| 156 |
141 NoSafepointScope no_safepoint; | 157 NoSafepointScope no_safepoint; |
142 intptr_t length = strlen(other); | 158 return memcmp(StringBuffer(string_index), other, length) == 0; |
143 return (length == StringSize(string_index)) && | |
144 (memcmp(string_data_.DataAddr(StringOffset(string_index)), other, | |
145 length) == 0); | |
146 } | 159 } |
147 | 160 |
148 NameIndex TranslationHelper::CanonicalNameParent(NameIndex name) { | 161 NameIndex TranslationHelper::CanonicalNameParent(NameIndex name) { |
149 // Canonical names are pairs of 4-byte parent and string indexes, so the size | 162 // Canonical names are pairs of 4-byte parent and string indexes, so the size |
150 // of an entry is 8 bytes. The parent is biased: 0 represents the root name | 163 // of an entry is 8 bytes. The parent is biased: 0 represents the root name |
151 // and N+1 represents the name with index N. | 164 // and N+1 represents the name with index N. |
152 return NameIndex(static_cast<intptr_t>(canonical_names_.GetUint32(8 * name)) - | 165 return NameIndex(static_cast<intptr_t>(canonical_names_.GetUint32(8 * name)) - |
153 1); | 166 1); |
154 } | 167 } |
155 | 168 |
(...skipping 148 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
304 Heap::Space space) { | 317 Heap::Space space) { |
305 return String::ZoneHandle(Z, String::New(content, space)); | 318 return String::ZoneHandle(Z, String::New(content, space)); |
306 } | 319 } |
307 | 320 |
308 String& TranslationHelper::DartString(StringIndex string_index, | 321 String& TranslationHelper::DartString(StringIndex string_index, |
309 Heap::Space space) { | 322 Heap::Space space) { |
310 intptr_t length = StringSize(string_index); | 323 intptr_t length = StringSize(string_index); |
311 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 324 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
312 { | 325 { |
313 NoSafepointScope no_safepoint; | 326 NoSafepointScope no_safepoint; |
314 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); | 327 memmove(buffer, StringBuffer(string_index), length); |
315 } | 328 } |
316 return String::ZoneHandle(Z, String::FromUTF8(buffer, length, space)); | 329 return String::ZoneHandle(Z, String::FromUTF8(buffer, length, space)); |
317 } | 330 } |
318 | 331 |
319 String& TranslationHelper::DartString(const uint8_t* utf8_array, | 332 String& TranslationHelper::DartString(const uint8_t* utf8_array, |
320 intptr_t len, | 333 intptr_t len, |
321 Heap::Space space) { | 334 Heap::Space space) { |
322 return String::ZoneHandle(Z, String::FromUTF8(utf8_array, len, space)); | 335 return String::ZoneHandle(Z, String::FromUTF8(utf8_array, len, space)); |
323 } | 336 } |
324 | 337 |
325 const String& TranslationHelper::DartSymbol(const char* content) const { | 338 const String& TranslationHelper::DartSymbol(const char* content) const { |
326 return String::ZoneHandle(Z, Symbols::New(thread_, content)); | 339 return String::ZoneHandle(Z, Symbols::New(thread_, content)); |
327 } | 340 } |
328 | 341 |
329 String& TranslationHelper::DartSymbol(StringIndex string_index) const { | 342 String& TranslationHelper::DartSymbol(StringIndex string_index) const { |
330 intptr_t length = StringSize(string_index); | 343 intptr_t length = StringSize(string_index); |
331 uint8_t* buffer = Z->Alloc<uint8_t>(length); | 344 uint8_t* buffer = Z->Alloc<uint8_t>(length); |
332 { | 345 { |
333 NoSafepointScope no_safepoint; | 346 NoSafepointScope no_safepoint; |
334 memmove(buffer, string_data_.DataAddr(StringOffset(string_index)), length); | 347 memmove(buffer, StringBuffer(string_index), length); |
335 } | 348 } |
336 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, buffer, length)); | 349 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, buffer, length)); |
337 } | 350 } |
338 | 351 |
339 String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, | 352 String& TranslationHelper::DartSymbol(const uint8_t* utf8_array, |
340 intptr_t len) const { | 353 intptr_t len) const { |
341 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, utf8_array, len)); | 354 return String::ZoneHandle(Z, Symbols::FromUTF8(thread_, utf8_array, len)); |
342 } | 355 } |
343 | 356 |
344 const String& TranslationHelper::DartClassName(NameIndex kernel_class) { | 357 const String& TranslationHelper::DartClassName(NameIndex kernel_class) { |
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
381 // => In order to be consistent, we remove the `=` always and adopt the VM | 394 // => In order to be consistent, we remove the `=` always and adopt the VM |
382 // conventions. | 395 // conventions. |
383 intptr_t size = StringSize(setter); | 396 intptr_t size = StringSize(setter); |
384 ASSERT(size > 0); | 397 ASSERT(size > 0); |
385 if (CharacterAt(setter, size - 1) == '=') { | 398 if (CharacterAt(setter, size - 1) == '=') { |
386 --size; | 399 --size; |
387 } | 400 } |
388 uint8_t* buffer = Z->Alloc<uint8_t>(size); | 401 uint8_t* buffer = Z->Alloc<uint8_t>(size); |
389 { | 402 { |
390 NoSafepointScope no_safepoint; | 403 NoSafepointScope no_safepoint; |
391 memmove(buffer, string_data_.DataAddr(StringOffset(setter)), size); | 404 memmove(buffer, StringBuffer(setter), size); |
392 } | 405 } |
393 String& name = | 406 String& name = |
394 String::ZoneHandle(Z, String::FromUTF8(buffer, size, allocation_space_)); | 407 String::ZoneHandle(Z, String::FromUTF8(buffer, size, allocation_space_)); |
395 ManglePrivateName(parent, &name, false); | 408 ManglePrivateName(parent, &name, false); |
396 name = Field::SetterSymbol(name); | 409 name = Field::SetterSymbol(name); |
397 return name; | 410 return name; |
398 } | 411 } |
399 | 412 |
400 const String& TranslationHelper::DartGetterName(NameIndex getter) { | 413 const String& TranslationHelper::DartGetterName(NameIndex getter) { |
401 return DartGetterName(CanonicalNameParent(getter), | 414 return DartGetterName(CanonicalNameParent(getter), |
(...skipping 1999 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2401 array_object = AsSortedDuplicateFreeArray(&token_positions); | 2414 array_object = AsSortedDuplicateFreeArray(&token_positions); |
2402 script.set_debug_positions(array_object); | 2415 script.set_debug_positions(array_object); |
2403 array_object = AsSortedDuplicateFreeArray(&yield_positions); | 2416 array_object = AsSortedDuplicateFreeArray(&yield_positions); |
2404 script.set_yield_positions(array_object); | 2417 script.set_yield_positions(array_object); |
2405 } | 2418 } |
2406 | 2419 |
2407 } // namespace kernel | 2420 } // namespace kernel |
2408 } // namespace dart | 2421 } // namespace dart |
2409 | 2422 |
2410 #endif // !defined(DART_PRECOMPILED_RUNTIME) | 2423 #endif // !defined(DART_PRECOMPILED_RUNTIME) |
OLD | NEW |