Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(115)

Side by Side Diff: src/heap.cc

Issue 8011: Use direct copy and templates to speed up flattening of strings. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 12 years, 2 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | src/objects.cc » ('J')
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2006-2008 the V8 project authors. All rights reserved. 1 // Copyright 2006-2008 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 1324 matching lines...) Expand 10 before | Expand all | Expand 10 after
1335 share->set_function_data(undefined_value()); 1335 share->set_function_data(undefined_value());
1336 share->set_lazy_load_data(undefined_value()); 1336 share->set_lazy_load_data(undefined_value());
1337 share->set_script(undefined_value()); 1337 share->set_script(undefined_value());
1338 share->set_start_position_and_type(0); 1338 share->set_start_position_and_type(0);
1339 share->set_debug_info(undefined_value()); 1339 share->set_debug_info(undefined_value());
1340 return result; 1340 return result;
1341 } 1341 }
1342 1342
1343 1343
1344 Object* Heap::AllocateConsString(String* first, String* second) { 1344 Object* Heap::AllocateConsString(String* first, String* second) {
1345 int length = first->length() + second->length(); 1345 int first_length = first->length();
1346 int second_length = second->length();
1347 int length = first_length + second_length;
1346 bool is_ascii = first->is_ascii_representation() 1348 bool is_ascii = first->is_ascii_representation()
1347 && second->is_ascii_representation(); 1349 && second->is_ascii_representation();
1348 1350
1349 // If the resulting string is small make a flat string. 1351 // If the resulting string is small make a flat string.
1350 if (length < ConsString::kMinLength) { 1352 if (length < String::kMinNonFlatLength) {
1351 Object* result = is_ascii 1353 ASSERT(first->IsFlat());
1352 ? AllocateRawAsciiString(length) 1354 ASSERT(second->IsFlat());
1353 : AllocateRawTwoByteString(length); 1355 if (is_ascii) {
1354 if (result->IsFailure()) return result; 1356 Object* result = AllocateRawAsciiString(length);
1355 // Copy the characters into the new object. 1357 if (result->IsFailure()) return result;
1356 String* string_result = String::cast(result); 1358 // Copy the characters into the new object.
1357 int first_length = first->length(); 1359 byte* dest = SeqAsciiString::cast(result)->GetCharsAddress();
Christian Plesner Hansen 2008/10/21 14:16:22 There is some confusion about whether to use char
Erik Corry 2008/10/22 11:59:48 I've tried to use char consistently, since the nam
1358 // Copy the content of the first string. 1360 String::WriteToFlat(first, dest, 0, first_length);
1359 for (int i = 0; i < first_length; i++) { 1361 String::WriteToFlat(second, dest + first_length, 0, second_length);
1360 string_result->Set(i, first->Get(i)); 1362 return result;
1363 } else {
1364 Object* result = AllocateRawTwoByteString(length);
1365 if (result->IsFailure()) return result;
1366 // Copy the characters into the new object.
1367 uc16* dest = reinterpret_cast<uc16*>(
1368 SeqTwoByteString::cast(result)->GetCharsAddress());
1369 String::WriteToFlat(first, dest, 0, first_length);
1370 String::WriteToFlat(second, dest + first_length, 0, second_length);
1371 return result;
1361 } 1372 }
1362 int second_length = second->length();
1363 // Copy the content of the first string.
1364 for (int i = 0; i < second_length; i++) {
1365 string_result->Set(first_length + i, second->Get(i));
1366 }
1367 return result;
1368 } 1373 }
1369 1374
1370 Map* map; 1375 Map* map;
1371 if (length <= String::kMaxShortStringSize) { 1376 if (length <= String::kMaxShortStringSize) {
1372 map = is_ascii ? short_cons_ascii_string_map() 1377 map = is_ascii ? short_cons_ascii_string_map()
1373 : short_cons_string_map(); 1378 : short_cons_string_map();
1374 } else if (length <= String::kMaxMediumStringSize) { 1379 } else if (length <= String::kMaxMediumStringSize) {
1375 map = is_ascii ? medium_cons_ascii_string_map() 1380 map = is_ascii ? medium_cons_ascii_string_map()
1376 : medium_cons_string_map(); 1381 : medium_cons_string_map();
1377 } else { 1382 } else {
(...skipping 10 matching lines...) Expand all
1388 cons_string->set_length(length); 1393 cons_string->set_length(length);
1389 1394
1390 return result; 1395 return result;
1391 } 1396 }
1392 1397
1393 1398
1394 Object* Heap::AllocateSlicedString(String* buffer, int start, int end) { 1399 Object* Heap::AllocateSlicedString(String* buffer, int start, int end) {
1395 int length = end - start; 1400 int length = end - start;
1396 1401
1397 // If the resulting string is small make a sub string. 1402 // If the resulting string is small make a sub string.
1398 if (end - start <= SlicedString::kMinLength) { 1403 if (end - start <= String::kMinNonFlatLength) {
1399 return Heap::AllocateSubString(buffer, start, end); 1404 return Heap::AllocateSubString(buffer, start, end);
1400 } 1405 }
1401 1406
1402 Map* map; 1407 Map* map;
1403 if (length <= String::kMaxShortStringSize) { 1408 if (length <= String::kMaxShortStringSize) {
1404 map = buffer->is_ascii_representation() ? short_sliced_ascii_string_map() 1409 map = buffer->is_ascii_representation() ? short_sliced_ascii_string_map()
1405 : short_sliced_string_map(); 1410 : short_sliced_string_map();
1406 } else if (length <= String::kMaxMediumStringSize) { 1411 } else if (length <= String::kMaxMediumStringSize) {
1407 map = buffer->is_ascii_representation() ? medium_sliced_ascii_string_map() 1412 map = buffer->is_ascii_representation() ? medium_sliced_ascii_string_map()
1408 : medium_sliced_string_map(); 1413 : medium_sliced_string_map();
(...skipping 1715 matching lines...) Expand 10 before | Expand all | Expand 10 after
3124 #ifdef DEBUG 3129 #ifdef DEBUG
3125 bool Heap::GarbageCollectionGreedyCheck() { 3130 bool Heap::GarbageCollectionGreedyCheck() {
3126 ASSERT(FLAG_gc_greedy); 3131 ASSERT(FLAG_gc_greedy);
3127 if (Bootstrapper::IsActive()) return true; 3132 if (Bootstrapper::IsActive()) return true;
3128 if (disallow_allocation_failure()) return true; 3133 if (disallow_allocation_failure()) return true;
3129 return CollectGarbage(0, NEW_SPACE); 3134 return CollectGarbage(0, NEW_SPACE);
3130 } 3135 }
3131 #endif 3136 #endif
3132 3137
3133 } } // namespace v8::internal 3138 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/factory.cc ('k') | src/objects.h » ('j') | src/objects.cc » ('J')

Powered by Google App Engine
This is Rietveld 408576698