| 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 119 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 130           HandleVector<Object>(NULL, 0))); | 130           HandleVector<Object>(NULL, 0))); | 
| 131 } | 131 } | 
| 132 | 132 | 
| 133 | 133 | 
| 134 void CopyObjectToObjectElements(FixedArray* from, | 134 void CopyObjectToObjectElements(FixedArray* from, | 
| 135                                 ElementsKind from_kind, | 135                                 ElementsKind from_kind, | 
| 136                                 uint32_t from_start, | 136                                 uint32_t from_start, | 
| 137                                 FixedArray* to, | 137                                 FixedArray* to, | 
| 138                                 ElementsKind to_kind, | 138                                 ElementsKind to_kind, | 
| 139                                 uint32_t to_start, | 139                                 uint32_t to_start, | 
| 140                                 int raw_copy_size, | 140                                 int raw_copy_size) { | 
| 141                                 WriteBarrierMode mode) { |  | 
| 142   ASSERT(to->map() != HEAP->fixed_cow_array_map()); | 141   ASSERT(to->map() != HEAP->fixed_cow_array_map()); | 
| 143   ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS); | 142   ASSERT(from_kind == FAST_ELEMENTS || from_kind == FAST_SMI_ONLY_ELEMENTS); | 
| 144   ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); | 143   ASSERT(to_kind == FAST_ELEMENTS || to_kind == FAST_SMI_ONLY_ELEMENTS); | 
| 145   int copy_size = raw_copy_size; | 144   int copy_size = raw_copy_size; | 
| 146   if (raw_copy_size < 0) { | 145   if (raw_copy_size < 0) { | 
| 147     ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 146     ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 
| 148            raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 147            raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 
| 149     copy_size = Min(from->length() - from_start, | 148     copy_size = Min(from->length() - from_start, | 
| 150                     to->length() - to_start); | 149                     to->length() - to_start); | 
| 151 #ifdef DEBUG | 150 #ifdef DEBUG | 
| 152     // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | 151     // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | 
| 153     // marked with the hole. | 152     // marked with the hole. | 
| 154     if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 153     if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 
| 155       for (int i = to_start + copy_size; i < to->length(); ++i) { | 154       for (int i = to_start + copy_size; i < to->length(); ++i) { | 
| 156         ASSERT(to->get(i)->IsTheHole()); | 155         ASSERT(to->get(i)->IsTheHole()); | 
| 157       } | 156       } | 
| 158     } | 157     } | 
| 159 #endif | 158 #endif | 
| 160   } | 159   } | 
| 161   ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() && | 160   ASSERT((copy_size + static_cast<int>(to_start)) <= to->length() && | 
| 162          (copy_size + static_cast<int>(from_start)) <= from->length()); | 161          (copy_size + static_cast<int>(from_start)) <= from->length()); | 
| 163   if (copy_size == 0) return; | 162   if (copy_size == 0) return; | 
| 164   Address to_address = to->address() + FixedArray::kHeaderSize; | 163   Address to_address = to->address() + FixedArray::kHeaderSize; | 
| 165   Address from_address = from->address() + FixedArray::kHeaderSize; | 164   Address from_address = from->address() + FixedArray::kHeaderSize; | 
| 166   CopyWords(reinterpret_cast<Object**>(to_address) + to_start, | 165   CopyWords(reinterpret_cast<Object**>(to_address) + to_start, | 
| 167             reinterpret_cast<Object**>(from_address) + from_start, | 166             reinterpret_cast<Object**>(from_address) + from_start, | 
| 168             copy_size); | 167             copy_size); | 
| 169   if (from_kind == FAST_ELEMENTS && to_kind == FAST_ELEMENTS && | 168   if (from_kind == FAST_ELEMENTS && to_kind == FAST_ELEMENTS) { | 
| 170       mode == UPDATE_WRITE_BARRIER) { |  | 
| 171     Heap* heap = from->GetHeap(); | 169     Heap* heap = from->GetHeap(); | 
| 172     if (!heap->InNewSpace(to)) { | 170     if (!heap->InNewSpace(to)) { | 
| 173       heap->RecordWrites(to->address(), | 171       heap->RecordWrites(to->address(), | 
| 174                          to->OffsetOfElementAt(to_start), | 172                          to->OffsetOfElementAt(to_start), | 
| 175                          copy_size); | 173                          copy_size); | 
| 176     } | 174     } | 
| 177     heap->incremental_marking()->RecordWrites(to); | 175     heap->incremental_marking()->RecordWrites(to); | 
| 178   } | 176   } | 
| 179 } | 177 } | 
| 180 | 178 | 
| 181 | 179 | 
| 182 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, | 180 static void CopyDictionaryToObjectElements(SeededNumberDictionary* from, | 
| 183                                            uint32_t from_start, | 181                                            uint32_t from_start, | 
| 184                                            FixedArray* to, | 182                                            FixedArray* to, | 
| 185                                            ElementsKind to_kind, | 183                                            ElementsKind to_kind, | 
| 186                                            uint32_t to_start, | 184                                            uint32_t to_start, | 
| 187                                            int raw_copy_size, | 185                                            int raw_copy_size) { | 
| 188                                            WriteBarrierMode mode) { |  | 
| 189   int copy_size = raw_copy_size; | 186   int copy_size = raw_copy_size; | 
| 190   Heap* heap = from->GetHeap(); | 187   Heap* heap = from->GetHeap(); | 
| 191   if (raw_copy_size < 0) { | 188   if (raw_copy_size < 0) { | 
| 192     ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 189     ASSERT(raw_copy_size == ElementsAccessor::kCopyToEnd || | 
| 193            raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 190            raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole); | 
| 194     copy_size = from->max_number_key() + 1 - from_start; | 191     copy_size = from->max_number_key() + 1 - from_start; | 
| 195 #ifdef DEBUG | 192 #ifdef DEBUG | 
| 196     // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | 193     // FAST_ELEMENT arrays cannot be uninitialized. Ensure they are already | 
| 197     // marked with the hole. | 194     // marked with the hole. | 
| 198     if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 195     if (raw_copy_size == ElementsAccessor::kCopyToEndAndInitializeToHole) { | 
| (...skipping 270 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 469 | 466 | 
| 470   virtual MaybeObject* Delete(JSObject* obj, | 467   virtual MaybeObject* Delete(JSObject* obj, | 
| 471                               uint32_t key, | 468                               uint32_t key, | 
| 472                               JSReceiver::DeleteMode mode) = 0; | 469                               JSReceiver::DeleteMode mode) = 0; | 
| 473 | 470 | 
| 474   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 471   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 
| 475                                        uint32_t from_start, | 472                                        uint32_t from_start, | 
| 476                                        FixedArrayBase* to, | 473                                        FixedArrayBase* to, | 
| 477                                        ElementsKind to_kind, | 474                                        ElementsKind to_kind, | 
| 478                                        uint32_t to_start, | 475                                        uint32_t to_start, | 
| 479                                        int copy_size, | 476                                        int copy_size) { | 
| 480                                        WriteBarrierMode mode) { |  | 
| 481     UNREACHABLE(); | 477     UNREACHABLE(); | 
| 482     return NULL; | 478     return NULL; | 
| 483   } | 479   } | 
| 484 | 480 | 
| 485   virtual MaybeObject* CopyElements(JSObject* from_holder, | 481   virtual MaybeObject* CopyElements(JSObject* from_holder, | 
| 486                                     uint32_t from_start, | 482                                     uint32_t from_start, | 
| 487                                     FixedArrayBase* to, | 483                                     FixedArrayBase* to, | 
| 488                                     ElementsKind to_kind, | 484                                     ElementsKind to_kind, | 
| 489                                     uint32_t to_start, | 485                                     uint32_t to_start, | 
| 490                                     int copy_size, | 486                                     int copy_size, | 
| 491                                     WriteBarrierMode mode, |  | 
| 492                                     FixedArrayBase* from) { | 487                                     FixedArrayBase* from) { | 
| 493     if (from == NULL) { | 488     if (from == NULL) { | 
| 494       from = from_holder->elements(); | 489       from = from_holder->elements(); | 
| 495     } | 490     } | 
| 496     if (from->length() == 0) { | 491     if (from->length() == 0) { | 
| 497       return from; | 492       return from; | 
| 498     } | 493     } | 
| 499     return ElementsAccessorSubclass::CopyElementsImpl( | 494     return ElementsAccessorSubclass::CopyElementsImpl( | 
| 500         from, from_start, to, to_kind, to_start, copy_size, mode); | 495         from, from_start, to, to_kind, to_start, copy_size); | 
| 501   } | 496   } | 
| 502 | 497 | 
| 503   virtual MaybeObject* AddElementsToFixedArray(Object* receiver, | 498   virtual MaybeObject* AddElementsToFixedArray(Object* receiver, | 
| 504                                                JSObject* holder, | 499                                                JSObject* holder, | 
| 505                                                FixedArray* to, | 500                                                FixedArray* to, | 
| 506                                                FixedArrayBase* from) { | 501                                                FixedArrayBase* from) { | 
| 507     int len0 = to->length(); | 502     int len0 = to->length(); | 
| 508 #ifdef DEBUG | 503 #ifdef DEBUG | 
| 509     if (FLAG_enable_slow_asserts) { | 504     if (FLAG_enable_slow_asserts) { | 
| 510       for (int i = 0; i < len0; i++) { | 505       for (int i = 0; i < len0; i++) { | 
| (...skipping 216 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 727       } | 722       } | 
| 728     } | 723     } | 
| 729     return heap->true_value(); | 724     return heap->true_value(); | 
| 730   } | 725   } | 
| 731 | 726 | 
| 732   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 727   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 
| 733                                        uint32_t from_start, | 728                                        uint32_t from_start, | 
| 734                                        FixedArrayBase* to, | 729                                        FixedArrayBase* to, | 
| 735                                        ElementsKind to_kind, | 730                                        ElementsKind to_kind, | 
| 736                                        uint32_t to_start, | 731                                        uint32_t to_start, | 
| 737                                        int copy_size, | 732                                        int copy_size) { | 
| 738                                        WriteBarrierMode mode) { |  | 
| 739     switch (to_kind) { | 733     switch (to_kind) { | 
| 740       case FAST_SMI_ONLY_ELEMENTS: | 734       case FAST_SMI_ONLY_ELEMENTS: | 
| 741       case FAST_ELEMENTS: { | 735       case FAST_ELEMENTS: { | 
| 742         CopyObjectToObjectElements( | 736         CopyObjectToObjectElements( | 
| 743             FixedArray::cast(from), ElementsTraits::Kind, from_start, | 737             FixedArray::cast(from), ElementsTraits::Kind, from_start, | 
| 744             FixedArray::cast(to), to_kind, to_start, copy_size, mode); | 738             FixedArray::cast(to), to_kind, to_start, copy_size); | 
| 745         return from; | 739         return from; | 
| 746       } | 740       } | 
| 747       case FAST_DOUBLE_ELEMENTS: | 741       case FAST_DOUBLE_ELEMENTS: | 
| 748         CopyObjectToDoubleElements( | 742         CopyObjectToDoubleElements( | 
| 749             FixedArray::cast(from), from_start, | 743             FixedArray::cast(from), from_start, | 
| 750             FixedDoubleArray::cast(to), to_start, copy_size); | 744             FixedDoubleArray::cast(to), to_start, copy_size); | 
| 751         return from; | 745         return from; | 
| 752       default: | 746       default: | 
| 753         UNREACHABLE(); | 747         UNREACHABLE(); | 
| 754     } | 748     } | 
| (...skipping 47 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 802                                     ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; | 796                                     ElementsKindTraits<FAST_DOUBLE_ELEMENTS> >; | 
| 803   friend class FastElementsAccessor<FastDoubleElementsAccessor, | 797   friend class FastElementsAccessor<FastDoubleElementsAccessor, | 
| 804                                     ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, | 798                                     ElementsKindTraits<FAST_DOUBLE_ELEMENTS>, | 
| 805                                     kDoubleSize>; | 799                                     kDoubleSize>; | 
| 806 | 800 | 
| 807   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 801   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 
| 808                                        uint32_t from_start, | 802                                        uint32_t from_start, | 
| 809                                        FixedArrayBase* to, | 803                                        FixedArrayBase* to, | 
| 810                                        ElementsKind to_kind, | 804                                        ElementsKind to_kind, | 
| 811                                        uint32_t to_start, | 805                                        uint32_t to_start, | 
| 812                                        int copy_size, | 806                                        int copy_size) { | 
| 813                                        WriteBarrierMode mode) { |  | 
| 814     switch (to_kind) { | 807     switch (to_kind) { | 
| 815       case FAST_SMI_ONLY_ELEMENTS: | 808       case FAST_SMI_ONLY_ELEMENTS: | 
| 816       case FAST_ELEMENTS: | 809       case FAST_ELEMENTS: | 
| 817         return CopyDoubleToObjectElements( | 810         return CopyDoubleToObjectElements( | 
| 818             FixedDoubleArray::cast(from), from_start, FixedArray::cast(to), | 811             FixedDoubleArray::cast(from), from_start, FixedArray::cast(to), | 
| 819             to_kind, to_start, copy_size); | 812             to_kind, to_start, copy_size); | 
| 820       case FAST_DOUBLE_ELEMENTS: | 813       case FAST_DOUBLE_ELEMENTS: | 
| 821         CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start, | 814         CopyDoubleToDoubleElements(FixedDoubleArray::cast(from), from_start, | 
| 822                                    FixedDoubleArray::cast(to), | 815                                    FixedDoubleArray::cast(to), | 
| 823                                    to_start, copy_size); | 816                                    to_start, copy_size); | 
| (...skipping 276 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1100       } | 1093       } | 
| 1101     } | 1094     } | 
| 1102     return heap->true_value(); | 1095     return heap->true_value(); | 
| 1103   } | 1096   } | 
| 1104 | 1097 | 
| 1105   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 1098   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 
| 1106                                        uint32_t from_start, | 1099                                        uint32_t from_start, | 
| 1107                                        FixedArrayBase* to, | 1100                                        FixedArrayBase* to, | 
| 1108                                        ElementsKind to_kind, | 1101                                        ElementsKind to_kind, | 
| 1109                                        uint32_t to_start, | 1102                                        uint32_t to_start, | 
| 1110                                        int copy_size, | 1103                                        int copy_size) { | 
| 1111                                        WriteBarrierMode mode) { |  | 
| 1112     switch (to_kind) { | 1104     switch (to_kind) { | 
| 1113       case FAST_SMI_ONLY_ELEMENTS: | 1105       case FAST_SMI_ONLY_ELEMENTS: | 
| 1114       case FAST_ELEMENTS: | 1106       case FAST_ELEMENTS: | 
| 1115         CopyDictionaryToObjectElements( | 1107         CopyDictionaryToObjectElements( | 
| 1116             SeededNumberDictionary::cast(from), from_start, | 1108             SeededNumberDictionary::cast(from), from_start, | 
| 1117             FixedArray::cast(to), to_kind, to_start, copy_size, mode); | 1109             FixedArray::cast(to), to_kind, to_start, copy_size); | 
| 1118         return from; | 1110         return from; | 
| 1119       case FAST_DOUBLE_ELEMENTS: | 1111       case FAST_DOUBLE_ELEMENTS: | 
| 1120         CopyDictionaryToDoubleElements( | 1112         CopyDictionaryToDoubleElements( | 
| 1121             SeededNumberDictionary::cast(from), from_start, | 1113             SeededNumberDictionary::cast(from), from_start, | 
| 1122             FixedDoubleArray::cast(to), to_start, copy_size); | 1114             FixedDoubleArray::cast(to), to_start, copy_size); | 
| 1123         return from; | 1115         return from; | 
| 1124       default: | 1116       default: | 
| 1125         UNREACHABLE(); | 1117         UNREACHABLE(); | 
| 1126     } | 1118     } | 
| 1127     return to->GetHeap()->undefined_value(); | 1119     return to->GetHeap()->undefined_value(); | 
| (...skipping 117 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1245       } | 1237       } | 
| 1246     } | 1238     } | 
| 1247     return obj->GetHeap()->true_value(); | 1239     return obj->GetHeap()->true_value(); | 
| 1248   } | 1240   } | 
| 1249 | 1241 | 
| 1250   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 1242   static MaybeObject* CopyElementsImpl(FixedArrayBase* from, | 
| 1251                                        uint32_t from_start, | 1243                                        uint32_t from_start, | 
| 1252                                        FixedArrayBase* to, | 1244                                        FixedArrayBase* to, | 
| 1253                                        ElementsKind to_kind, | 1245                                        ElementsKind to_kind, | 
| 1254                                        uint32_t to_start, | 1246                                        uint32_t to_start, | 
| 1255                                        int copy_size, | 1247                                        int copy_size) { | 
| 1256                                        WriteBarrierMode mode) { |  | 
| 1257     FixedArray* parameter_map = FixedArray::cast(from); | 1248     FixedArray* parameter_map = FixedArray::cast(from); | 
| 1258     FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 1249     FixedArray* arguments = FixedArray::cast(parameter_map->get(1)); | 
| 1259     ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); | 1250     ElementsAccessor* accessor = ElementsAccessor::ForArray(arguments); | 
| 1260     return accessor->CopyElements(NULL, from_start, to, to_kind, | 1251     return accessor->CopyElements(NULL, from_start, to, to_kind, | 
| 1261                                   to_start, copy_size, mode, arguments); | 1252                                   to_start, copy_size, arguments); | 
| 1262   } | 1253   } | 
| 1263 | 1254 | 
| 1264   static uint32_t GetCapacityImpl(FixedArray* parameter_map) { | 1255   static uint32_t GetCapacityImpl(FixedArray* parameter_map) { | 
| 1265     FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); | 1256     FixedArrayBase* arguments = FixedArrayBase::cast(parameter_map->get(1)); | 
| 1266     return Max(static_cast<uint32_t>(parameter_map->length() - 2), | 1257     return Max(static_cast<uint32_t>(parameter_map->length() - 2), | 
| 1267                ForArray(arguments)->GetCapacity(arguments)); | 1258                ForArray(arguments)->GetCapacity(arguments)); | 
| 1268   } | 1259   } | 
| 1269 | 1260 | 
| 1270   static uint32_t GetKeyForIndexImpl(FixedArray* dict, | 1261   static uint32_t GetKeyForIndexImpl(FixedArray* dict, | 
| 1271                                      uint32_t index) { | 1262                                      uint32_t index) { | 
| (...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after  Loading... | 
| 1412   if (!maybe_obj->To(&new_backing_store)) return maybe_obj; | 1403   if (!maybe_obj->To(&new_backing_store)) return maybe_obj; | 
| 1413   new_backing_store->set(0, length); | 1404   new_backing_store->set(0, length); | 
| 1414   { MaybeObject* result = array->SetContent(new_backing_store); | 1405   { MaybeObject* result = array->SetContent(new_backing_store); | 
| 1415     if (result->IsFailure()) return result; | 1406     if (result->IsFailure()) return result; | 
| 1416   } | 1407   } | 
| 1417   return array; | 1408   return array; | 
| 1418 } | 1409 } | 
| 1419 | 1410 | 
| 1420 | 1411 | 
| 1421 } }  // namespace v8::internal | 1412 } }  // namespace v8::internal | 
| OLD | NEW | 
|---|