OLD | NEW |
1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #include <sstream> | 5 #include <sstream> |
6 | 6 |
7 #include "src/v8.h" | 7 #include "src/v8.h" |
8 | 8 |
9 #include "src/accessors.h" | 9 #include "src/accessors.h" |
10 #include "src/allocation-site-scopes.h" | 10 #include "src/allocation-site-scopes.h" |
(...skipping 11249 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11260 os << "Constant Pool\n"; | 11260 os << "Constant Pool\n"; |
11261 pool->Print(os); | 11261 pool->Print(os); |
11262 os << "\n"; | 11262 os << "\n"; |
11263 } | 11263 } |
11264 } | 11264 } |
11265 #endif | 11265 #endif |
11266 } | 11266 } |
11267 #endif // ENABLE_DISASSEMBLER | 11267 #endif // ENABLE_DISASSEMBLER |
11268 | 11268 |
11269 | 11269 |
11270 Handle<FixedArray> JSObject::SetFastElementsCapacity( | 11270 Handle<FixedArray> JSObject::SetFastElementsCapacityAndLength( |
11271 Handle<JSObject> object, int capacity, | 11271 Handle<JSObject> object, |
| 11272 int capacity, |
| 11273 int length, |
11272 SetFastElementsCapacitySmiMode smi_mode) { | 11274 SetFastElementsCapacitySmiMode smi_mode) { |
11273 // We should never end in here with a pixel or external array. | 11275 // We should never end in here with a pixel or external array. |
11274 DCHECK(!object->HasExternalArrayElements()); | 11276 DCHECK(!object->HasExternalArrayElements()); |
11275 | 11277 |
11276 // Allocate a new fast elements backing store. | 11278 // Allocate a new fast elements backing store. |
11277 Handle<FixedArray> new_elements = | 11279 Handle<FixedArray> new_elements = |
11278 object->GetIsolate()->factory()->NewUninitializedFixedArray(capacity); | 11280 object->GetIsolate()->factory()->NewUninitializedFixedArray(capacity); |
11279 | 11281 |
11280 ElementsKind elements_kind = object->GetElementsKind(); | 11282 ElementsKind elements_kind = object->GetElementsKind(); |
11281 ElementsKind new_elements_kind; | 11283 ElementsKind new_elements_kind; |
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11313 } else { | 11315 } else { |
11314 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(old_elements); | 11316 Handle<FixedArray> parameter_map = Handle<FixedArray>::cast(old_elements); |
11315 parameter_map->set(1, *new_elements); | 11317 parameter_map->set(1, *new_elements); |
11316 } | 11318 } |
11317 | 11319 |
11318 if (FLAG_trace_elements_transitions) { | 11320 if (FLAG_trace_elements_transitions) { |
11319 PrintElementsTransition(stdout, object, elements_kind, old_elements, | 11321 PrintElementsTransition(stdout, object, elements_kind, old_elements, |
11320 object->GetElementsKind(), new_elements); | 11322 object->GetElementsKind(), new_elements); |
11321 } | 11323 } |
11322 | 11324 |
11323 return new_elements; | |
11324 } | |
11325 | |
11326 | |
11327 Handle<FixedArray> JSObject::SetFastElementsCapacityAndLength( | |
11328 Handle<JSObject> object, int capacity, int length, | |
11329 SetFastElementsCapacitySmiMode smi_mode) { | |
11330 Handle<FixedArray> new_elements = | |
11331 SetFastElementsCapacity(object, capacity, smi_mode); | |
11332 if (object->IsJSArray()) { | 11325 if (object->IsJSArray()) { |
11333 Handle<JSArray>::cast(object)->set_length(Smi::FromInt(length)); | 11326 Handle<JSArray>::cast(object)->set_length(Smi::FromInt(length)); |
11334 } | 11327 } |
11335 return new_elements; | 11328 return new_elements; |
11336 } | 11329 } |
11337 | 11330 |
11338 | 11331 |
11339 Handle<FixedArrayBase> JSObject::SetFastDoubleElementsCapacity( | 11332 void JSObject::SetFastDoubleElementsCapacityAndLength(Handle<JSObject> object, |
11340 Handle<JSObject> object, int capacity) { | 11333 int capacity, |
| 11334 int length) { |
11341 // We should never end in here with a pixel or external array. | 11335 // We should never end in here with a pixel or external array. |
11342 DCHECK(!object->HasExternalArrayElements()); | 11336 DCHECK(!object->HasExternalArrayElements()); |
11343 | 11337 |
11344 Handle<FixedArrayBase> elems = | 11338 Handle<FixedArrayBase> elems = |
11345 object->GetIsolate()->factory()->NewFixedDoubleArray(capacity); | 11339 object->GetIsolate()->factory()->NewFixedDoubleArray(capacity); |
11346 | 11340 |
11347 ElementsKind elements_kind = object->GetElementsKind(); | 11341 ElementsKind elements_kind = object->GetElementsKind(); |
11348 CHECK(elements_kind != SLOPPY_ARGUMENTS_ELEMENTS); | 11342 CHECK(elements_kind != SLOPPY_ARGUMENTS_ELEMENTS); |
11349 ElementsKind new_elements_kind = elements_kind; | 11343 ElementsKind new_elements_kind = elements_kind; |
11350 if (IsHoleyElementsKind(elements_kind)) { | 11344 if (IsHoleyElementsKind(elements_kind)) { |
11351 new_elements_kind = FAST_HOLEY_DOUBLE_ELEMENTS; | 11345 new_elements_kind = FAST_HOLEY_DOUBLE_ELEMENTS; |
11352 } else { | 11346 } else { |
11353 new_elements_kind = FAST_DOUBLE_ELEMENTS; | 11347 new_elements_kind = FAST_DOUBLE_ELEMENTS; |
11354 } | 11348 } |
11355 | 11349 |
11356 Handle<Map> new_map = GetElementsTransitionMap(object, new_elements_kind); | 11350 Handle<Map> new_map = GetElementsTransitionMap(object, new_elements_kind); |
11357 | 11351 |
11358 Handle<FixedArrayBase> old_elements(object->elements()); | 11352 Handle<FixedArrayBase> old_elements(object->elements()); |
11359 ElementsAccessor* accessor = ElementsAccessor::ForKind(FAST_DOUBLE_ELEMENTS); | 11353 ElementsAccessor* accessor = ElementsAccessor::ForKind(FAST_DOUBLE_ELEMENTS); |
11360 accessor->CopyElements(object, elems, elements_kind); | 11354 accessor->CopyElements(object, elems, elements_kind); |
11361 | 11355 |
11362 JSObject::ValidateElements(object); | 11356 JSObject::ValidateElements(object); |
11363 JSObject::SetMapAndElements(object, new_map, elems); | 11357 JSObject::SetMapAndElements(object, new_map, elems); |
11364 | 11358 |
11365 if (FLAG_trace_elements_transitions) { | 11359 if (FLAG_trace_elements_transitions) { |
11366 PrintElementsTransition(stdout, object, elements_kind, old_elements, | 11360 PrintElementsTransition(stdout, object, elements_kind, old_elements, |
11367 object->GetElementsKind(), elems); | 11361 object->GetElementsKind(), elems); |
11368 } | 11362 } |
11369 | 11363 |
11370 return elems; | 11364 if (object->IsJSArray()) { |
| 11365 Handle<JSArray>::cast(object)->set_length(Smi::FromInt(length)); |
| 11366 } |
11371 } | 11367 } |
11372 | 11368 |
11373 | 11369 |
11374 Handle<FixedArrayBase> JSObject::SetFastDoubleElementsCapacityAndLength( | |
11375 Handle<JSObject> object, int capacity, int length) { | |
11376 Handle<FixedArrayBase> new_elements = | |
11377 SetFastDoubleElementsCapacity(object, capacity); | |
11378 if (object->IsJSArray()) { | |
11379 Handle<JSArray>::cast(object)->set_length(Smi::FromInt(length)); | |
11380 } | |
11381 return new_elements; | |
11382 } | |
11383 | |
11384 | |
11385 // static | 11370 // static |
11386 void JSArray::Initialize(Handle<JSArray> array, int capacity, int length) { | 11371 void JSArray::Initialize(Handle<JSArray> array, int capacity, int length) { |
11387 DCHECK(capacity >= 0); | 11372 DCHECK(capacity >= 0); |
11388 array->GetIsolate()->factory()->NewJSArrayStorage( | 11373 array->GetIsolate()->factory()->NewJSArrayStorage( |
11389 array, length, capacity, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); | 11374 array, length, capacity, INITIALIZE_ARRAY_ELEMENTS_WITH_HOLE); |
11390 } | 11375 } |
11391 | 11376 |
11392 | 11377 |
11393 void JSArray::Expand(Handle<JSArray> array, int required_size) { | 11378 void JSArray::Expand(Handle<JSArray> array, int required_size) { |
11394 ElementsAccessor* accessor = array->GetElementsAccessor(); | 11379 ElementsAccessor* accessor = array->GetElementsAccessor(); |
(...skipping 1901 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
13296 // External arrays are considered 100% used. | 13281 // External arrays are considered 100% used. |
13297 FixedArrayBase* external_array = FixedArrayBase::cast(elements()); | 13282 FixedArrayBase* external_array = FixedArrayBase::cast(elements()); |
13298 *capacity = external_array->length(); | 13283 *capacity = external_array->length(); |
13299 *used = external_array->length(); | 13284 *used = external_array->length(); |
13300 break; | 13285 break; |
13301 } | 13286 } |
13302 } | 13287 } |
13303 } | 13288 } |
13304 | 13289 |
13305 | 13290 |
13306 bool JSObject::WouldConvertToSlowElements(uint32_t index) { | 13291 bool JSObject::WouldConvertToSlowElements(Handle<Object> key) { |
13307 if (HasFastElements()) { | 13292 uint32_t index; |
| 13293 if (HasFastElements() && key->ToArrayIndex(&index)) { |
13308 Handle<FixedArrayBase> backing_store(FixedArrayBase::cast(elements())); | 13294 Handle<FixedArrayBase> backing_store(FixedArrayBase::cast(elements())); |
13309 uint32_t capacity = static_cast<uint32_t>(backing_store->length()); | 13295 uint32_t capacity = static_cast<uint32_t>(backing_store->length()); |
13310 if (index >= capacity) { | 13296 if (index >= capacity) { |
13311 if ((index - capacity) >= kMaxGap) return true; | 13297 if ((index - capacity) >= kMaxGap) return true; |
13312 uint32_t new_capacity = NewElementsCapacity(index + 1); | 13298 uint32_t new_capacity = NewElementsCapacity(index + 1); |
13313 return ShouldConvertToSlowElements(new_capacity); | 13299 return ShouldConvertToSlowElements(new_capacity); |
13314 } | 13300 } |
13315 } | 13301 } |
13316 return false; | 13302 return false; |
13317 } | 13303 } |
(...skipping 3525 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16843 Handle<DependentCode> codes = | 16829 Handle<DependentCode> codes = |
16844 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16830 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
16845 DependentCode::kPropertyCellChangedGroup, | 16831 DependentCode::kPropertyCellChangedGroup, |
16846 info->object_wrapper()); | 16832 info->object_wrapper()); |
16847 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16833 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
16848 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16834 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
16849 cell, info->zone()); | 16835 cell, info->zone()); |
16850 } | 16836 } |
16851 | 16837 |
16852 } } // namespace v8::internal | 16838 } } // namespace v8::internal |
OLD | NEW |