| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
| 2 // Redistribution and use in source and binary forms, with or without | 2 // Redistribution and use in source and binary forms, with or without |
| 3 // modification, are permitted provided that the following conditions are | 3 // modification, are permitted provided that the following conditions are |
| 4 // met: | 4 // met: |
| 5 // | 5 // |
| 6 // * Redistributions of source code must retain the above copyright | 6 // * Redistributions of source code must retain the above copyright |
| 7 // notice, this list of conditions and the following disclaimer. | 7 // notice, this list of conditions and the following disclaimer. |
| 8 // * Redistributions in binary form must reproduce the above | 8 // * Redistributions in binary form must reproduce the above |
| 9 // copyright notice, this list of conditions and the following | 9 // copyright notice, this list of conditions and the following |
| 10 // disclaimer in the documentation and/or other materials provided | 10 // disclaimer in the documentation and/or other materials provided |
| (...skipping 1262 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1273 return false; | 1273 return false; |
| 1274 } | 1274 } |
| 1275 bool is_ascii = this->IsOneByteRepresentation(); | 1275 bool is_ascii = this->IsOneByteRepresentation(); |
| 1276 bool is_internalized = this->IsInternalizedString(); | 1276 bool is_internalized = this->IsInternalizedString(); |
| 1277 | 1277 |
| 1278 // Morph the string to an external string by replacing the map and | 1278 // Morph the string to an external string by replacing the map and |
| 1279 // reinitializing the fields. This won't work if | 1279 // reinitializing the fields. This won't work if |
| 1280 // - the space the existing string occupies is too small for a regular | 1280 // - the space the existing string occupies is too small for a regular |
| 1281 // external string. | 1281 // external string. |
| 1282 // - the existing string is in old pointer space and the backing store of | 1282 // - the existing string is in old pointer space and the backing store of |
| 1283 // the external string is not aligned. The GC cannot deal with fields | 1283 // the external string is not aligned. The GC cannot deal with a field |
| 1284 // containing an unaligned address that points to outside of V8's heap. | 1284 // containing a possibly unaligned address to outside of V8's heap. |
| 1285 // In either case we resort to a short external string instead, omitting | 1285 // In either case we resort to a short external string instead, omitting |
| 1286 // the field caching the address of the backing store. When we encounter | 1286 // the field caching the address of the backing store. When we encounter |
| 1287 // short external strings in generated code, we need to bailout to runtime. | 1287 // short external strings in generated code, we need to bailout to runtime. |
| 1288 if (size < ExternalString::kSize || | 1288 if (size < ExternalString::kSize || |
| 1289 (!IsAligned(reinterpret_cast<intptr_t>(resource->data()), kPointerSize) && | 1289 heap->old_pointer_space()->Contains(this)) { |
| 1290 heap->old_pointer_space()->Contains(this))) { | |
| 1291 this->set_map_no_write_barrier( | 1290 this->set_map_no_write_barrier( |
| 1292 is_internalized | 1291 is_internalized |
| 1293 ? (is_ascii | 1292 ? (is_ascii |
| 1294 ? heap-> | 1293 ? heap-> |
| 1295 short_external_internalized_string_with_one_byte_data_map() | 1294 short_external_internalized_string_with_one_byte_data_map() |
| 1296 : heap->short_external_internalized_string_map()) | 1295 : heap->short_external_internalized_string_map()) |
| 1297 : (is_ascii | 1296 : (is_ascii |
| 1298 ? heap->short_external_string_with_one_byte_data_map() | 1297 ? heap->short_external_string_with_one_byte_data_map() |
| 1299 : heap->short_external_string_map())); | 1298 : heap->short_external_string_map())); |
| 1300 } else { | 1299 } else { |
| (...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1344 if (size < ExternalString::kShortSize) { | 1343 if (size < ExternalString::kShortSize) { |
| 1345 return false; | 1344 return false; |
| 1346 } | 1345 } |
| 1347 bool is_internalized = this->IsInternalizedString(); | 1346 bool is_internalized = this->IsInternalizedString(); |
| 1348 | 1347 |
| 1349 // Morph the string to an external string by replacing the map and | 1348 // Morph the string to an external string by replacing the map and |
| 1350 // reinitializing the fields. This won't work if | 1349 // reinitializing the fields. This won't work if |
| 1351 // - the space the existing string occupies is too small for a regular | 1350 // - the space the existing string occupies is too small for a regular |
| 1352 // external string. | 1351 // external string. |
| 1353 // - the existing string is in old pointer space and the backing store of | 1352 // - the existing string is in old pointer space and the backing store of |
| 1354 // the external string is not aligned. The GC cannot deal with fields | 1353 // the external string is not aligned. The GC cannot deal with a field |
| 1355 // containing an unaligned address that points to outside of V8's heap. | 1354 // containing a possibly unaligned address to outside of V8's heap. |
| 1356 // In either case we resort to a short external string instead, omitting | 1355 // In either case we resort to a short external string instead, omitting |
| 1357 // the field caching the address of the backing store. When we encounter | 1356 // the field caching the address of the backing store. When we encounter |
| 1358 // short external strings in generated code, we need to bailout to runtime. | 1357 // short external strings in generated code, we need to bailout to runtime. |
| 1359 if (size < ExternalString::kSize || | 1358 if (size < ExternalString::kSize || |
| 1360 (!IsAligned(reinterpret_cast<intptr_t>(resource->data()), kPointerSize) && | 1359 heap->old_pointer_space()->Contains(this)) { |
| 1361 heap->old_pointer_space()->Contains(this))) { | |
| 1362 this->set_map_no_write_barrier( | 1360 this->set_map_no_write_barrier( |
| 1363 is_internalized ? heap->short_external_ascii_internalized_string_map() | 1361 is_internalized ? heap->short_external_ascii_internalized_string_map() |
| 1364 : heap->short_external_ascii_string_map()); | 1362 : heap->short_external_ascii_string_map()); |
| 1365 } else { | 1363 } else { |
| 1366 this->set_map_no_write_barrier( | 1364 this->set_map_no_write_barrier( |
| 1367 is_internalized ? heap->external_ascii_internalized_string_map() | 1365 is_internalized ? heap->external_ascii_internalized_string_map() |
| 1368 : heap->external_ascii_string_map()); | 1366 : heap->external_ascii_string_map()); |
| 1369 } | 1367 } |
| 1370 ExternalAsciiString* self = ExternalAsciiString::cast(this); | 1368 ExternalAsciiString* self = ExternalAsciiString::cast(this); |
| 1371 self->set_resource(resource); | 1369 self->set_resource(resource); |
| (...skipping 15129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16501 #define ERROR_MESSAGES_TEXTS(C, T) T, | 16499 #define ERROR_MESSAGES_TEXTS(C, T) T, |
| 16502 static const char* error_messages_[] = { | 16500 static const char* error_messages_[] = { |
| 16503 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) | 16501 ERROR_MESSAGES_LIST(ERROR_MESSAGES_TEXTS) |
| 16504 }; | 16502 }; |
| 16505 #undef ERROR_MESSAGES_TEXTS | 16503 #undef ERROR_MESSAGES_TEXTS |
| 16506 return error_messages_[reason]; | 16504 return error_messages_[reason]; |
| 16507 } | 16505 } |
| 16508 | 16506 |
| 16509 | 16507 |
| 16510 } } // namespace v8::internal | 16508 } } // namespace v8::internal |
| OLD | NEW |