| OLD | NEW |
| 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 319 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 330 FixedDoubleArray* src, | 330 FixedDoubleArray* src, |
| 331 int src_index, | 331 int src_index, |
| 332 int len) { | 332 int len) { |
| 333 if (len == 0) return; | 333 if (len == 0) return; |
| 334 memmove(dst->data_start() + dst_index, | 334 memmove(dst->data_start() + dst_index, |
| 335 src->data_start() + src_index, | 335 src->data_start() + src_index, |
| 336 len * kDoubleSize); | 336 len * kDoubleSize); |
| 337 } | 337 } |
| 338 | 338 |
| 339 | 339 |
| 340 static void MoveElements(Heap* heap, | |
| 341 AssertNoAllocation* no_gc, | |
| 342 FixedArray* dst, | |
| 343 int dst_index, | |
| 344 FixedArray* src, | |
| 345 int src_index, | |
| 346 int len) { | |
| 347 if (len == 0) return; | |
| 348 ASSERT(dst->map() != HEAP->fixed_cow_array_map()); | |
| 349 memmove(dst->data_start() + dst_index, | |
| 350 src->data_start() + src_index, | |
| 351 len * kPointerSize); | |
| 352 WriteBarrierMode mode = dst->GetWriteBarrierMode(*no_gc); | |
| 353 if (mode == UPDATE_WRITE_BARRIER) { | |
| 354 heap->RecordWrites(dst->address(), dst->OffsetOfElementAt(dst_index), len); | |
| 355 } | |
| 356 heap->incremental_marking()->RecordWrites(dst); | |
| 357 } | |
| 358 | |
| 359 | |
| 360 static void FillWithHoles(Heap* heap, FixedArray* dst, int from, int to) { | 340 static void FillWithHoles(Heap* heap, FixedArray* dst, int from, int to) { |
| 361 ASSERT(dst->map() != heap->fixed_cow_array_map()); | 341 ASSERT(dst->map() != heap->fixed_cow_array_map()); |
| 362 MemsetPointer(dst->data_start() + from, heap->the_hole_value(), to - from); | 342 MemsetPointer(dst->data_start() + from, heap->the_hole_value(), to - from); |
| 363 } | 343 } |
| 364 | 344 |
| 365 | 345 |
| 366 static void FillWithHoles(FixedDoubleArray* dst, int from, int to) { | 346 static void FillWithHoles(FixedDoubleArray* dst, int from, int to) { |
| 367 for (int i = from; i < to; i++) { | 347 for (int i = from; i < to; i++) { |
| 368 dst->set_the_hole(i); | 348 dst->set_the_hole(i); |
| 369 } | 349 } |
| (...skipping 347 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 717 first = heap->undefined_value(); | 697 first = heap->undefined_value(); |
| 718 } | 698 } |
| 719 | 699 |
| 720 if (!heap->lo_space()->Contains(elms_obj)) { | 700 if (!heap->lo_space()->Contains(elms_obj)) { |
| 721 array->set_elements(LeftTrimFixedArray(heap, elms_obj, 1)); | 701 array->set_elements(LeftTrimFixedArray(heap, elms_obj, 1)); |
| 722 } else { | 702 } else { |
| 723 // Shift the elements. | 703 // Shift the elements. |
| 724 if (elms_obj->IsFixedArray()) { | 704 if (elms_obj->IsFixedArray()) { |
| 725 FixedArray* elms = FixedArray::cast(elms_obj); | 705 FixedArray* elms = FixedArray::cast(elms_obj); |
| 726 AssertNoAllocation no_gc; | 706 AssertNoAllocation no_gc; |
| 727 MoveElements(heap, &no_gc, elms, 0, elms, 1, len - 1); | 707 heap->MoveElements(elms, 0, elms, 1, len - 1); |
| 728 elms->set(len - 1, heap->the_hole_value()); | 708 elms->set(len - 1, heap->the_hole_value()); |
| 729 } else { | 709 } else { |
| 730 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); | 710 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
| 731 MoveDoubleElements(elms, 0, elms, 1, len - 1); | 711 MoveDoubleElements(elms, 0, elms, 1, len - 1); |
| 732 elms->set_the_hole(len - 1); | 712 elms->set_the_hole(len - 1); |
| 733 } | 713 } |
| 734 } | 714 } |
| 735 | 715 |
| 736 // Set the length. | 716 // Set the length. |
| 737 array->set_length(Smi::FromInt(len - 1)); | 717 array->set_length(Smi::FromInt(len - 1)); |
| (...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 787 MaybeObject* maybe_failure = accessor->CopyElements( | 767 MaybeObject* maybe_failure = accessor->CopyElements( |
| 788 NULL, 0, kind, new_elms, to_add, | 768 NULL, 0, kind, new_elms, to_add, |
| 789 ElementsAccessor::kCopyToEndAndInitializeToHole, elms); | 769 ElementsAccessor::kCopyToEndAndInitializeToHole, elms); |
| 790 ASSERT(!maybe_failure->IsFailure()); | 770 ASSERT(!maybe_failure->IsFailure()); |
| 791 USE(maybe_failure); | 771 USE(maybe_failure); |
| 792 | 772 |
| 793 elms = new_elms; | 773 elms = new_elms; |
| 794 array->set_elements(elms); | 774 array->set_elements(elms); |
| 795 } else { | 775 } else { |
| 796 AssertNoAllocation no_gc; | 776 AssertNoAllocation no_gc; |
| 797 MoveElements(heap, &no_gc, elms, to_add, elms, 0, len); | 777 heap->MoveElements(elms, to_add, elms, 0, len); |
| 798 } | 778 } |
| 799 | 779 |
| 800 // Add the provided values. | 780 // Add the provided values. |
| 801 AssertNoAllocation no_gc; | 781 AssertNoAllocation no_gc; |
| 802 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); | 782 WriteBarrierMode mode = elms->GetWriteBarrierMode(no_gc); |
| 803 for (int i = 0; i < to_add; i++) { | 783 for (int i = 0; i < to_add; i++) { |
| 804 elms->set(i, args[i + 1], mode); | 784 elms->set(i, args[i + 1], mode); |
| 805 } | 785 } |
| 806 | 786 |
| 807 // Set the length. | 787 // Set the length. |
| (...skipping 245 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1053 (len - actual_delete_count - actual_start)); | 1033 (len - actual_delete_count - actual_start)); |
| 1054 if (trim_array) { | 1034 if (trim_array) { |
| 1055 const int delta = actual_delete_count - item_count; | 1035 const int delta = actual_delete_count - item_count; |
| 1056 | 1036 |
| 1057 if (elms_obj->IsFixedDoubleArray()) { | 1037 if (elms_obj->IsFixedDoubleArray()) { |
| 1058 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); | 1038 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
| 1059 MoveDoubleElements(elms, delta, elms, 0, actual_start); | 1039 MoveDoubleElements(elms, delta, elms, 0, actual_start); |
| 1060 } else { | 1040 } else { |
| 1061 FixedArray* elms = FixedArray::cast(elms_obj); | 1041 FixedArray* elms = FixedArray::cast(elms_obj); |
| 1062 AssertNoAllocation no_gc; | 1042 AssertNoAllocation no_gc; |
| 1063 MoveElements(heap, &no_gc, elms, delta, elms, 0, actual_start); | 1043 heap->MoveElements(elms, delta, elms, 0, actual_start); |
| 1064 } | 1044 } |
| 1065 | 1045 |
| 1066 elms_obj = LeftTrimFixedArray(heap, elms_obj, delta); | 1046 elms_obj = LeftTrimFixedArray(heap, elms_obj, delta); |
| 1067 | 1047 |
| 1068 elms_changed = true; | 1048 elms_changed = true; |
| 1069 } else { | 1049 } else { |
| 1070 if (elms_obj->IsFixedDoubleArray()) { | 1050 if (elms_obj->IsFixedDoubleArray()) { |
| 1071 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); | 1051 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
| 1072 MoveDoubleElements(elms, actual_start + item_count, | 1052 MoveDoubleElements(elms, actual_start + item_count, |
| 1073 elms, actual_start + actual_delete_count, | 1053 elms, actual_start + actual_delete_count, |
| 1074 (len - actual_delete_count - actual_start)); | 1054 (len - actual_delete_count - actual_start)); |
| 1075 FillWithHoles(elms, new_length, len); | 1055 FillWithHoles(elms, new_length, len); |
| 1076 } else { | 1056 } else { |
| 1077 FixedArray* elms = FixedArray::cast(elms_obj); | 1057 FixedArray* elms = FixedArray::cast(elms_obj); |
| 1078 AssertNoAllocation no_gc; | 1058 AssertNoAllocation no_gc; |
| 1079 MoveElements(heap, &no_gc, | 1059 heap->MoveElements(elms, actual_start + item_count, |
| 1080 elms, actual_start + item_count, | 1060 elms, actual_start + actual_delete_count, |
| 1081 elms, actual_start + actual_delete_count, | 1061 (len - actual_delete_count - actual_start)); |
| 1082 (len - actual_delete_count - actual_start)); | |
| 1083 FillWithHoles(heap, elms, new_length, len); | 1062 FillWithHoles(heap, elms, new_length, len); |
| 1084 } | 1063 } |
| 1085 } | 1064 } |
| 1086 } else if (item_count > actual_delete_count) { | 1065 } else if (item_count > actual_delete_count) { |
| 1087 FixedArray* elms = FixedArray::cast(elms_obj); | 1066 FixedArray* elms = FixedArray::cast(elms_obj); |
| 1088 // Currently fixed arrays cannot grow too big, so | 1067 // Currently fixed arrays cannot grow too big, so |
| 1089 // we should never hit this case. | 1068 // we should never hit this case. |
| 1090 ASSERT((item_count - actual_delete_count) <= (Smi::kMaxValue - len)); | 1069 ASSERT((item_count - actual_delete_count) <= (Smi::kMaxValue - len)); |
| 1091 | 1070 |
| 1092 // Check if array need to grow. | 1071 // Check if array need to grow. |
| (...skipping 19 matching lines...) Expand all Loading... |
| 1112 NULL, actual_start + actual_delete_count, kind, new_elms, | 1091 NULL, actual_start + actual_delete_count, kind, new_elms, |
| 1113 actual_start + item_count, | 1092 actual_start + item_count, |
| 1114 ElementsAccessor::kCopyToEndAndInitializeToHole, elms); | 1093 ElementsAccessor::kCopyToEndAndInitializeToHole, elms); |
| 1115 ASSERT(!maybe_failure->IsFailure()); | 1094 ASSERT(!maybe_failure->IsFailure()); |
| 1116 USE(maybe_failure); | 1095 USE(maybe_failure); |
| 1117 | 1096 |
| 1118 elms_obj = new_elms; | 1097 elms_obj = new_elms; |
| 1119 elms_changed = true; | 1098 elms_changed = true; |
| 1120 } else { | 1099 } else { |
| 1121 AssertNoAllocation no_gc; | 1100 AssertNoAllocation no_gc; |
| 1122 MoveElements(heap, &no_gc, | 1101 heap->MoveElements(elms, actual_start + item_count, |
| 1123 elms, actual_start + item_count, | 1102 elms, actual_start + actual_delete_count, |
| 1124 elms, actual_start + actual_delete_count, | 1103 (len - actual_delete_count - actual_start)); |
| 1125 (len - actual_delete_count - actual_start)); | |
| 1126 } | 1104 } |
| 1127 } | 1105 } |
| 1128 | 1106 |
| 1129 if (IsFastDoubleElementsKind(elements_kind)) { | 1107 if (IsFastDoubleElementsKind(elements_kind)) { |
| 1130 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); | 1108 FixedDoubleArray* elms = FixedDoubleArray::cast(elms_obj); |
| 1131 for (int k = actual_start; k < actual_start + item_count; k++) { | 1109 for (int k = actual_start; k < actual_start + item_count; k++) { |
| 1132 Object* arg = args[3 + k - actual_start]; | 1110 Object* arg = args[3 + k - actual_start]; |
| 1133 if (arg->IsSmi()) { | 1111 if (arg->IsSmi()) { |
| 1134 elms->set(k, Smi::cast(arg)->value()); | 1112 elms->set(k, Smi::cast(arg)->value()); |
| 1135 } else { | 1113 } else { |
| (...skipping 806 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 1942 return Handle<Code>(code_address); \ | 1920 return Handle<Code>(code_address); \ |
| 1943 } | 1921 } |
| 1944 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) | 1922 BUILTIN_LIST_C(DEFINE_BUILTIN_ACCESSOR_C) |
| 1945 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) | 1923 BUILTIN_LIST_A(DEFINE_BUILTIN_ACCESSOR_A) |
| 1946 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) | 1924 BUILTIN_LIST_DEBUG_A(DEFINE_BUILTIN_ACCESSOR_A) |
| 1947 #undef DEFINE_BUILTIN_ACCESSOR_C | 1925 #undef DEFINE_BUILTIN_ACCESSOR_C |
| 1948 #undef DEFINE_BUILTIN_ACCESSOR_A | 1926 #undef DEFINE_BUILTIN_ACCESSOR_A |
| 1949 | 1927 |
| 1950 | 1928 |
| 1951 } } // namespace v8::internal | 1929 } } // namespace v8::internal |
| OLD | NEW |