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

Side by Side Diff: src/runtime.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
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 1338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1349 return SingleCharIndexOf(sub->ToAsciiVector(), pat->Get(0), start_index); 1349 return SingleCharIndexOf(sub->ToAsciiVector(), pat->Get(0), start_index);
1350 } 1350 }
1351 return SingleCharIndexOf(sub->ToUC16Vector(), pat->Get(0), start_index); 1351 return SingleCharIndexOf(sub->ToUC16Vector(), pat->Get(0), start_index);
1352 } 1352 }
1353 1353
1354 FlattenString(pat); 1354 FlattenString(pat);
1355 1355
1356 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid 1356 AssertNoAllocation no_heap_allocation; // ensure vectors stay valid
1357 // dispatch on type of strings 1357 // dispatch on type of strings
1358 if (pat->is_ascii_representation()) { 1358 if (pat->is_ascii_representation()) {
1359 Vector<const char> pat_vector = pat->ToAsciiVector(); 1359 Vector<const byte> pat_vector = pat->ToAsciiVector();
1360 if (sub->is_ascii_representation()) { 1360 if (sub->is_ascii_representation()) {
1361 return StringMatchStrategy(sub->ToAsciiVector(), pat_vector, start_index); 1361 return StringMatchStrategy(sub->ToAsciiVector(), pat_vector, start_index);
1362 } 1362 }
1363 return StringMatchStrategy(sub->ToUC16Vector(), pat_vector, start_index); 1363 return StringMatchStrategy(sub->ToUC16Vector(), pat_vector, start_index);
1364 } 1364 }
1365 Vector<const uc16> pat_vector = pat->ToUC16Vector(); 1365 Vector<const uc16> pat_vector = pat->ToUC16Vector();
1366 if (sub->is_ascii_representation()) { 1366 if (sub->is_ascii_representation()) {
1367 return StringMatchStrategy(sub->ToAsciiVector(), pat_vector, start_index); 1367 return StringMatchStrategy(sub->ToAsciiVector(), pat_vector, start_index);
1368 } 1368 }
1369 return StringMatchStrategy(sub->ToUC16Vector(), pat_vector, start_index); 1369 return StringMatchStrategy(sub->ToUC16Vector(), pat_vector, start_index);
(...skipping 1214 matching lines...) Expand 10 before | Expand all | Expand 10 after
2584 // Make sure that an out of memory exception is thrown if the length 2584 // Make sure that an out of memory exception is thrown if the length
2585 // of the new cons string is too large to fit in a Smi. 2585 // of the new cons string is too large to fit in a Smi.
2586 if (length_sum > Smi::kMaxValue || length_sum < 0) { 2586 if (length_sum > Smi::kMaxValue || length_sum < 0) {
2587 Top::context()->mark_out_of_memory(); 2587 Top::context()->mark_out_of_memory();
2588 return Failure::OutOfMemoryException(); 2588 return Failure::OutOfMemoryException();
2589 } 2589 }
2590 return Heap::AllocateConsString(str1, str2); 2590 return Heap::AllocateConsString(str1, str2);
2591 } 2591 }
2592 2592
2593 2593
2594 template<typename sinkchar>
2595 static inline void StringBuilderConcatHelper(String* special, sinkchar* sink, Fi xedArray* fixed_array, int array_length) {
2596 int position = 0;
2597 for (int i = 0; i < array_length; i++) {
2598 Object* element = fixed_array->get(i);
2599 if (element->IsSmi()) {
2600 int len = Smi::cast(element)->value();
2601 int pos = len >> 11;
2602 len &= 0x7ff;
2603 String::WriteToFlat(special, sink + position, pos, pos + len);
2604 position += len;
2605 } else {
2606 String* string = String::cast(element);
2607 int element_length = string->length();
2608 String::WriteToFlat(string, sink + position, 0, element_length);
2609 position += element_length;
2610 }
2611 }
2612 }
2613
2614
2594 static Object* Runtime_StringBuilderConcat(Arguments args) { 2615 static Object* Runtime_StringBuilderConcat(Arguments args) {
2595 NoHandleAllocation ha; 2616 NoHandleAllocation ha;
2596 ASSERT(args.length() == 2); 2617 ASSERT(args.length() == 2);
2597 CONVERT_CHECKED(JSArray, array, args[0]); 2618 CONVERT_CHECKED(JSArray, array, args[0]);
2598 CONVERT_CHECKED(String, special, args[1]); 2619 CONVERT_CHECKED(String, special, args[1]);
2599 int special_length = special->length(); 2620 int special_length = special->length();
2600 Object* smi_array_length = array->length(); 2621 Object* smi_array_length = array->length();
2601 if (!smi_array_length->IsSmi()) { 2622 if (!smi_array_length->IsSmi()) {
2602 Top::context()->mark_out_of_memory(); 2623 Top::context()->mark_out_of_memory();
2603 return Failure::OutOfMemoryException(); 2624 return Failure::OutOfMemoryException();
(...skipping 36 matching lines...) Expand 10 before | Expand all | Expand 10 after
2640 position += element_length; 2661 position += element_length;
2641 if (ascii && !element->IsAsciiRepresentation()) { 2662 if (ascii && !element->IsAsciiRepresentation()) {
2642 ascii = false; 2663 ascii = false;
2643 } 2664 }
2644 } else { 2665 } else {
2645 return Top::Throw(Heap::illegal_argument_symbol()); 2666 return Top::Throw(Heap::illegal_argument_symbol());
2646 } 2667 }
2647 } 2668 }
2648 2669
2649 int length = position; 2670 int length = position;
2650 position = 0;
2651 Object* object; 2671 Object* object;
2672
2652 if (ascii) { 2673 if (ascii) {
2653 object = Heap::AllocateRawAsciiString(length); 2674 object = Heap::AllocateRawAsciiString(length);
2675 if (object->IsFailure()) return object;
2676 SeqAsciiString* answer = SeqAsciiString::cast(object);
2677 StringBuilderConcatHelper(special,
2678 answer->GetCharsAddress(),
2679 fixed_array,
2680 array_length);
2681 return answer;
2654 } else { 2682 } else {
2655 object = Heap::AllocateRawTwoByteString(length); 2683 object = Heap::AllocateRawTwoByteString(length);
2684 if (object->IsFailure()) return object;
2685 SeqTwoByteString* answer = SeqTwoByteString::cast(object);
2686 StringBuilderConcatHelper(special,
2687 reinterpret_cast<uc16*>(answer->GetCharsAddress()) ,
2688 fixed_array,
2689 array_length);
2690 return answer;
2656 } 2691 }
2657 if (object->IsFailure()) return object;
2658
2659 String* answer = String::cast(object);
2660 for (int i = 0; i < array_length; i++) {
2661 Object* element = fixed_array->get(i);
2662 if (element->IsSmi()) {
2663 int len = Smi::cast(element)->value();
2664 int pos = len >> 11;
2665 len &= 0x7ff;
2666 String::Flatten(special, answer, pos, pos + len, position);
2667 position += len;
2668 } else {
2669 String* string = String::cast(element);
2670 int element_length = string->length();
2671 String::Flatten(string, answer, 0, element_length, position);
2672 position += element_length;
2673 }
2674 }
2675 return answer;
2676 } 2692 }
2677 2693
2678 2694
2679 static Object* Runtime_NumberOr(Arguments args) { 2695 static Object* Runtime_NumberOr(Arguments args) {
2680 NoHandleAllocation ha; 2696 NoHandleAllocation ha;
2681 ASSERT(args.length() == 2); 2697 ASSERT(args.length() == 2);
2682 2698
2683 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]); 2699 CONVERT_NUMBER_CHECKED(int32_t, x, Int32, args[0]);
2684 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]); 2700 CONVERT_NUMBER_CHECKED(int32_t, y, Int32, args[1]);
2685 return Heap::NumberFromInt32(x | y); 2701 return Heap::NumberFromInt32(x | y);
(...skipping 2761 matching lines...) Expand 10 before | Expand all | Expand 10 after
5447 5463
5448 void Runtime::PerformGC(Object* result) { 5464 void Runtime::PerformGC(Object* result) {
5449 Failure* failure = Failure::cast(result); 5465 Failure* failure = Failure::cast(result);
5450 // Try to do a garbage collection; ignore it if it fails. The C 5466 // Try to do a garbage collection; ignore it if it fails. The C
5451 // entry stub will throw an out-of-memory exception in that case. 5467 // entry stub will throw an out-of-memory exception in that case.
5452 Heap::CollectGarbage(failure->requested(), failure->allocation_space()); 5468 Heap::CollectGarbage(failure->requested(), failure->allocation_space());
5453 } 5469 }
5454 5470
5455 5471
5456 } } // namespace v8::internal 5472 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698