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

Side by Side Diff: src/builtins.cc

Issue 9663002: Use CopyElements for SetFastDoubleElementsCapacityAndLength (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Review feedback Created 8 years, 9 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 | « no previous file | src/elements.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 490 matching lines...) Expand 10 before | Expand all | Expand 10 after
501 501
502 if (new_length > elms->length()) { 502 if (new_length > elms->length()) {
503 // New backing storage is needed. 503 // New backing storage is needed.
504 int capacity = new_length + (new_length >> 1) + 16; 504 int capacity = new_length + (new_length >> 1) + 16;
505 Object* obj; 505 Object* obj;
506 { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity); 506 { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
507 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 507 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
508 } 508 }
509 FixedArray* new_elms = FixedArray::cast(obj); 509 FixedArray* new_elms = FixedArray::cast(obj);
510 510
511 AssertNoAllocation no_gc; 511 CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
512 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, 0,
513 new_elms, FAST_ELEMENTS, 0, len); 512 new_elms, FAST_ELEMENTS, 0, len);
514 FillWithHoles(heap, new_elms, new_length, capacity); 513 FillWithHoles(heap, new_elms, new_length, capacity);
515 514
516 elms = new_elms; 515 elms = new_elms;
517 } 516 }
518 517
519 // Add the provided values. 518 // Add the provided values.
520 AssertNoAllocation no_gc; 519 AssertNoAllocation no_gc;
521 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); 520 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc);
522 for (int index = 0; index < to_add; index++) { 521 for (int index = 0; index < to_add; index++) {
(...skipping 115 matching lines...) Expand 10 before | Expand all | Expand 10 after
638 if (maybe_object->IsFailure()) return maybe_object; 637 if (maybe_object->IsFailure()) return maybe_object;
639 638
640 if (new_length > elms->length()) { 639 if (new_length > elms->length()) {
641 // New backing storage is needed. 640 // New backing storage is needed.
642 int capacity = new_length + (new_length >> 1) + 16; 641 int capacity = new_length + (new_length >> 1) + 16;
643 Object* obj; 642 Object* obj;
644 { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity); 643 { MaybeObject* maybe_obj = heap->AllocateUninitializedFixedArray(capacity);
645 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 644 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
646 } 645 }
647 FixedArray* new_elms = FixedArray::cast(obj); 646 FixedArray* new_elms = FixedArray::cast(obj);
648 AssertNoAllocation no_gc; 647 CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
649 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, 0,
650 new_elms, FAST_ELEMENTS, to_add, len); 648 new_elms, FAST_ELEMENTS, to_add, len);
651 FillWithHoles(heap, new_elms, new_length, capacity); 649 FillWithHoles(heap, new_elms, new_length, capacity);
652 elms = new_elms; 650 elms = new_elms;
653 array->set_elements(elms); 651 array->set_elements(elms);
654 } else { 652 } else {
655 AssertNoAllocation no_gc; 653 AssertNoAllocation no_gc;
656 MoveElements(heap, &no_gc, elms, to_add, elms, 0, len); 654 MoveElements(heap, &no_gc, elms, to_add, elms, 0, len);
657 } 655 }
658 656
659 // Add the provided values. 657 // Add the provided values.
(...skipping 90 matching lines...) Expand 10 before | Expand all | Expand 10 after
750 // Calculate the length of result array. 748 // Calculate the length of result array.
751 int result_len = Max(final - k, 0); 749 int result_len = Max(final - k, 0);
752 750
753 MaybeObject* maybe_array = 751 MaybeObject* maybe_array =
754 heap->AllocateJSArrayAndStorage(elements_kind, 752 heap->AllocateJSArrayAndStorage(elements_kind,
755 result_len, 753 result_len,
756 result_len); 754 result_len);
757 JSArray* result_array; 755 JSArray* result_array;
758 if (!maybe_array->To(&result_array)) return maybe_array; 756 if (!maybe_array->To(&result_array)) return maybe_array;
759 757
760 AssertNoAllocation no_gc; 758 CopyObjectToObjectElements(elms, FAST_ELEMENTS, k,
761 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, k,
762 FixedArray::cast(result_array->elements()), 759 FixedArray::cast(result_array->elements()),
763 FAST_ELEMENTS, 0, result_len); 760 FAST_ELEMENTS, 0, result_len);
764 761
765 return result_array; 762 return result_array;
766 } 763 }
767 764
768 765
769 BUILTIN(ArraySplice) { 766 BUILTIN(ArraySplice) {
770 Heap* heap = isolate->heap(); 767 Heap* heap = isolate->heap();
771 Object* receiver = *args.receiver(); 768 Object* receiver = *args.receiver();
(...skipping 52 matching lines...) Expand 10 before | Expand all | Expand 10 after
824 JSArray* result_array = NULL; 821 JSArray* result_array = NULL;
825 ElementsKind elements_kind = 822 ElementsKind elements_kind =
826 JSObject::cast(receiver)->GetElementsKind(); 823 JSObject::cast(receiver)->GetElementsKind();
827 MaybeObject* maybe_array = 824 MaybeObject* maybe_array =
828 heap->AllocateJSArrayAndStorage(elements_kind, 825 heap->AllocateJSArrayAndStorage(elements_kind,
829 actual_delete_count, 826 actual_delete_count,
830 actual_delete_count); 827 actual_delete_count);
831 if (!maybe_array->To(&result_array)) return maybe_array; 828 if (!maybe_array->To(&result_array)) return maybe_array;
832 829
833 { 830 {
834 AssertNoAllocation no_gc;
835 // Fill newly created array. 831 // Fill newly created array.
836 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, actual_start, 832 CopyObjectToObjectElements(elms, FAST_ELEMENTS, actual_start,
837 FixedArray::cast(result_array->elements()), 833 FixedArray::cast(result_array->elements()),
838 FAST_ELEMENTS, 0, actual_delete_count); 834 FAST_ELEMENTS, 0, actual_delete_count);
839 } 835 }
840 836
841 int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0; 837 int item_count = (n_arguments > 1) ? (n_arguments - 2) : 0;
842 int new_length = len - actual_delete_count + item_count; 838 int new_length = len - actual_delete_count + item_count;
843 839
844 bool elms_changed = false; 840 bool elms_changed = false;
845 if (item_count < actual_delete_count) { 841 if (item_count < actual_delete_count) {
846 // Shrink the array. 842 // Shrink the array.
(...skipping 29 matching lines...) Expand all
876 // New backing storage is needed. 872 // New backing storage is needed.
877 int capacity = new_length + (new_length >> 1) + 16; 873 int capacity = new_length + (new_length >> 1) + 16;
878 Object* obj; 874 Object* obj;
879 { MaybeObject* maybe_obj = 875 { MaybeObject* maybe_obj =
880 heap->AllocateUninitializedFixedArray(capacity); 876 heap->AllocateUninitializedFixedArray(capacity);
881 if (!maybe_obj->ToObject(&obj)) return maybe_obj; 877 if (!maybe_obj->ToObject(&obj)) return maybe_obj;
882 } 878 }
883 FixedArray* new_elms = FixedArray::cast(obj); 879 FixedArray* new_elms = FixedArray::cast(obj);
884 880
885 { 881 {
886 AssertNoAllocation no_gc;
887 // Copy the part before actual_start as is. 882 // Copy the part before actual_start as is.
888 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, 0, 883 CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
889 new_elms, FAST_ELEMENTS, 0, actual_start); 884 new_elms, FAST_ELEMENTS, 0, actual_start);
890 const int to_copy = len - actual_delete_count - actual_start; 885 const int to_copy = len - actual_delete_count - actual_start;
891 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, 886 CopyObjectToObjectElements(elms, FAST_ELEMENTS,
892 actual_start + actual_delete_count, 887 actual_start + actual_delete_count,
893 new_elms, FAST_ELEMENTS, 888 new_elms, FAST_ELEMENTS,
894 actual_start + item_count, to_copy); 889 actual_start + item_count, to_copy);
895 } 890 }
896 891
897 FillWithHoles(heap, new_elms, new_length, capacity); 892 FillWithHoles(heap, new_elms, new_length, capacity);
898 893
899 elms = new_elms; 894 elms = new_elms;
900 elms_changed = true; 895 elms_changed = true;
901 } else { 896 } else {
(...skipping 64 matching lines...) Expand 10 before | Expand all | Expand 10 after
966 // Allocate result. 961 // Allocate result.
967 JSArray* result_array; 962 JSArray* result_array;
968 MaybeObject* maybe_array = 963 MaybeObject* maybe_array =
969 heap->AllocateJSArrayAndStorage(elements_kind, 964 heap->AllocateJSArrayAndStorage(elements_kind,
970 result_len, 965 result_len,
971 result_len); 966 result_len);
972 if (!maybe_array->To(&result_array)) return maybe_array; 967 if (!maybe_array->To(&result_array)) return maybe_array;
973 if (result_len == 0) return result_array; 968 if (result_len == 0) return result_array;
974 969
975 // Copy data. 970 // Copy data.
976 AssertNoAllocation no_gc;
977 int start_pos = 0; 971 int start_pos = 0;
978 FixedArray* result_elms(FixedArray::cast(result_array->elements())); 972 FixedArray* result_elms(FixedArray::cast(result_array->elements()));
979 for (int i = 0; i < n_arguments; i++) { 973 for (int i = 0; i < n_arguments; i++) {
980 JSArray* array = JSArray::cast(args[i]); 974 JSArray* array = JSArray::cast(args[i]);
981 int len = Smi::cast(array->length())->value(); 975 int len = Smi::cast(array->length())->value();
982 FixedArray* elms = FixedArray::cast(array->elements()); 976 FixedArray* elms = FixedArray::cast(array->elements());
983 CopyObjectToObjectElements(&no_gc, elms, FAST_ELEMENTS, 0, 977 CopyObjectToObjectElements(elms, FAST_ELEMENTS, 0,
984 result_elms, FAST_ELEMENTS, 978 result_elms, FAST_ELEMENTS,
985 start_pos, len); 979 start_pos, len);
986 start_pos += len; 980 start_pos += len;
987 } 981 }
988 ASSERT(start_pos == result_len); 982 ASSERT(start_pos == result_len);
989 983
990 return result_array; 984 return result_array;
991 } 985 }
992 986
993 987
(...skipping 744 matching lines...) Expand 10 before | Expand all | Expand 10 after
1738 return Handle<Code>(code_address); \ 1732 return Handle<Code>(code_address); \
1739 } 1733 }
1740 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) 1734 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C)
1741 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) 1735 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A)
1742 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) 1736 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A)
1743 #undef DEFINE_BUILTIN_ACCESSOR_C 1737 #undef DEFINE_BUILTIN_ACCESSOR_C
1744 #undef DEFINE_BUILTIN_ACCESSOR_A 1738 #undef DEFINE_BUILTIN_ACCESSOR_A
1745 1739
1746 1740
1747 } } // namespace v8::internal 1741 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/elements.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698