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 11129 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11140 if (!JSObject::GetOwnElementAccessorPair(object, index).is_null()) { | 11140 if (!JSObject::GetOwnElementAccessorPair(object, index).is_null()) { |
11141 value = Handle<Object>::cast(isolate->factory()->the_hole_value()); | 11141 value = Handle<Object>::cast(isolate->factory()->the_hole_value()); |
11142 } else { | 11142 } else { |
11143 value = Object::GetElement(isolate, object, index).ToHandleChecked(); | 11143 value = Object::GetElement(isolate, object, index).ToHandleChecked(); |
11144 } | 11144 } |
11145 old_values->Add(value); | 11145 old_values->Add(value); |
11146 indices->Add(index); | 11146 indices->Add(index); |
11147 return true; | 11147 return true; |
11148 } | 11148 } |
11149 | 11149 |
11150 static void EnqueueSpliceRecord(Handle<JSArray> object, | 11150 MUST_USE_RESULT static MaybeHandle<Object> EnqueueSpliceRecord( |
11151 uint32_t index, | 11151 Handle<JSArray> object, uint32_t index, Handle<JSArray> deleted, |
11152 Handle<JSArray> deleted, | 11152 uint32_t add_count) { |
11153 uint32_t add_count) { | |
11154 Isolate* isolate = object->GetIsolate(); | 11153 Isolate* isolate = object->GetIsolate(); |
11155 HandleScope scope(isolate); | 11154 HandleScope scope(isolate); |
11156 Handle<Object> index_object = isolate->factory()->NewNumberFromUint(index); | 11155 Handle<Object> index_object = isolate->factory()->NewNumberFromUint(index); |
11157 Handle<Object> add_count_object = | 11156 Handle<Object> add_count_object = |
11158 isolate->factory()->NewNumberFromUint(add_count); | 11157 isolate->factory()->NewNumberFromUint(add_count); |
11159 | 11158 |
11160 Handle<Object> args[] = | 11159 Handle<Object> args[] = |
11161 { object, index_object, deleted, add_count_object }; | 11160 { object, index_object, deleted, add_count_object }; |
11162 | 11161 |
11163 Execution::Call(isolate, | 11162 return Execution::Call( |
11164 Handle<JSFunction>(isolate->observers_enqueue_splice()), | 11163 isolate, Handle<JSFunction>(isolate->observers_enqueue_splice()), |
11165 isolate->factory()->undefined_value(), | 11164 isolate->factory()->undefined_value(), arraysize(args), args); |
11166 arraysize(args), | |
11167 args).Assert(); | |
11168 } | 11165 } |
11169 | 11166 |
11170 | 11167 |
11171 static void BeginPerformSplice(Handle<JSArray> object) { | 11168 MUST_USE_RESULT static MaybeHandle<Object> BeginPerformSplice( |
| 11169 Handle<JSArray> object) { |
11172 Isolate* isolate = object->GetIsolate(); | 11170 Isolate* isolate = object->GetIsolate(); |
11173 HandleScope scope(isolate); | 11171 HandleScope scope(isolate); |
11174 Handle<Object> args[] = { object }; | 11172 Handle<Object> args[] = { object }; |
11175 | 11173 |
11176 Execution::Call(isolate, | 11174 return Execution::Call( |
11177 Handle<JSFunction>(isolate->observers_begin_perform_splice()), | 11175 isolate, Handle<JSFunction>(isolate->observers_begin_perform_splice()), |
11178 isolate->factory()->undefined_value(), | 11176 isolate->factory()->undefined_value(), arraysize(args), args); |
11179 arraysize(args), | |
11180 args).Assert(); | |
11181 } | 11177 } |
11182 | 11178 |
11183 | 11179 |
11184 static void EndPerformSplice(Handle<JSArray> object) { | 11180 MUST_USE_RESULT static MaybeHandle<Object> EndPerformSplice( |
| 11181 Handle<JSArray> object) { |
11185 Isolate* isolate = object->GetIsolate(); | 11182 Isolate* isolate = object->GetIsolate(); |
11186 HandleScope scope(isolate); | 11183 HandleScope scope(isolate); |
11187 Handle<Object> args[] = { object }; | 11184 Handle<Object> args[] = { object }; |
11188 | 11185 |
11189 Execution::Call(isolate, | 11186 return Execution::Call( |
11190 Handle<JSFunction>(isolate->observers_end_perform_splice()), | 11187 isolate, Handle<JSFunction>(isolate->observers_end_perform_splice()), |
11191 isolate->factory()->undefined_value(), | 11188 isolate->factory()->undefined_value(), arraysize(args), args); |
11192 arraysize(args), | |
11193 args).Assert(); | |
11194 } | 11189 } |
11195 | 11190 |
11196 | 11191 |
11197 MaybeHandle<Object> JSArray::SetElementsLength( | 11192 MaybeHandle<Object> JSArray::SetElementsLength( |
11198 Handle<JSArray> array, | 11193 Handle<JSArray> array, |
11199 Handle<Object> new_length_handle) { | 11194 Handle<Object> new_length_handle) { |
11200 if (array->HasFastElements()) { | 11195 if (array->HasFastElements()) { |
11201 // If the new array won't fit in a some non-trivial fraction of the max old | 11196 // If the new array won't fit in a some non-trivial fraction of the max old |
11202 // space size, then force it to go dictionary mode. | 11197 // space size, then force it to go dictionary mode. |
11203 int max_fast_array_size = static_cast<int>( | 11198 int max_fast_array_size = static_cast<int>( |
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
11247 | 11242 |
11248 Handle<Object> hresult; | 11243 Handle<Object> hresult; |
11249 ASSIGN_RETURN_ON_EXCEPTION( | 11244 ASSIGN_RETURN_ON_EXCEPTION( |
11250 isolate, hresult, | 11245 isolate, hresult, |
11251 array->GetElementsAccessor()->SetLength(array, new_length_handle), | 11246 array->GetElementsAccessor()->SetLength(array, new_length_handle), |
11252 Object); | 11247 Object); |
11253 | 11248 |
11254 CHECK(array->length()->ToArrayIndex(&new_length)); | 11249 CHECK(array->length()->ToArrayIndex(&new_length)); |
11255 if (old_length == new_length) return hresult; | 11250 if (old_length == new_length) return hresult; |
11256 | 11251 |
11257 BeginPerformSplice(array); | 11252 RETURN_ON_EXCEPTION(isolate, BeginPerformSplice(array), Object); |
11258 | 11253 |
11259 for (int i = 0; i < indices.length(); ++i) { | 11254 for (int i = 0; i < indices.length(); ++i) { |
11260 // For deletions where the property was an accessor, old_values[i] | 11255 // For deletions where the property was an accessor, old_values[i] |
11261 // will be the hole, which instructs EnqueueChangeRecord to elide | 11256 // will be the hole, which instructs EnqueueChangeRecord to elide |
11262 // the "oldValue" property. | 11257 // the "oldValue" property. |
11263 RETURN_ON_EXCEPTION( | 11258 RETURN_ON_EXCEPTION( |
11264 isolate, | 11259 isolate, |
11265 JSObject::EnqueueChangeRecord( | 11260 JSObject::EnqueueChangeRecord( |
11266 array, "delete", isolate->factory()->Uint32ToString(indices[i]), | 11261 array, "delete", isolate->factory()->Uint32ToString(indices[i]), |
11267 old_values[i]), | 11262 old_values[i]), |
11268 Object); | 11263 Object); |
11269 } | 11264 } |
11270 RETURN_ON_EXCEPTION(isolate, | 11265 RETURN_ON_EXCEPTION(isolate, |
11271 JSObject::EnqueueChangeRecord( | 11266 JSObject::EnqueueChangeRecord( |
11272 array, "update", isolate->factory()->length_string(), | 11267 array, "update", isolate->factory()->length_string(), |
11273 old_length_handle), | 11268 old_length_handle), |
11274 Object); | 11269 Object); |
11275 | 11270 |
11276 EndPerformSplice(array); | 11271 RETURN_ON_EXCEPTION(isolate, EndPerformSplice(array), Object); |
11277 | 11272 |
11278 uint32_t index = Min(old_length, new_length); | 11273 uint32_t index = Min(old_length, new_length); |
11279 uint32_t add_count = new_length > old_length ? new_length - old_length : 0; | 11274 uint32_t add_count = new_length > old_length ? new_length - old_length : 0; |
11280 uint32_t delete_count = new_length < old_length ? old_length - new_length : 0; | 11275 uint32_t delete_count = new_length < old_length ? old_length - new_length : 0; |
11281 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); | 11276 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); |
11282 if (delete_count > 0) { | 11277 if (delete_count > 0) { |
11283 for (int i = indices.length() - 1; i >= 0; i--) { | 11278 for (int i = indices.length() - 1; i >= 0; i--) { |
11284 // Skip deletions where the property was an accessor, leaving holes | 11279 // Skip deletions where the property was an accessor, leaving holes |
11285 // in the array of old values. | 11280 // in the array of old values. |
11286 if (old_values[i]->IsTheHole()) continue; | 11281 if (old_values[i]->IsTheHole()) continue; |
11287 JSObject::SetElement( | 11282 JSObject::SetElement( |
11288 deleted, indices[i] - index, old_values[i], NONE, SLOPPY).Assert(); | 11283 deleted, indices[i] - index, old_values[i], NONE, SLOPPY).Assert(); |
11289 } | 11284 } |
11290 | 11285 |
11291 SetProperty(deleted, isolate->factory()->length_string(), | 11286 SetProperty(deleted, isolate->factory()->length_string(), |
11292 isolate->factory()->NewNumberFromUint(delete_count), | 11287 isolate->factory()->NewNumberFromUint(delete_count), |
11293 STRICT).Assert(); | 11288 STRICT).Assert(); |
11294 } | 11289 } |
11295 | 11290 |
11296 EnqueueSpliceRecord(array, index, deleted, add_count); | 11291 RETURN_ON_EXCEPTION( |
| 11292 isolate, EnqueueSpliceRecord(array, index, deleted, add_count), Object); |
11297 | 11293 |
11298 return hresult; | 11294 return hresult; |
11299 } | 11295 } |
11300 | 11296 |
11301 | 11297 |
11302 Handle<Map> Map::GetPrototypeTransition(Handle<Map> map, | 11298 Handle<Map> Map::GetPrototypeTransition(Handle<Map> map, |
11303 Handle<Object> prototype) { | 11299 Handle<Object> prototype) { |
11304 FixedArray* cache = map->GetPrototypeTransitions(); | 11300 FixedArray* cache = map->GetPrototypeTransitions(); |
11305 int number_of_transitions = map->NumberOfProtoTransitions(); | 11301 int number_of_transitions = map->NumberOfProtoTransitions(); |
11306 const int proto_offset = | 11302 const int proto_offset = |
(...skipping 1164 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
12471 if (object->IsJSArray() && | 12467 if (object->IsJSArray() && |
12472 !old_length_handle->SameValue( | 12468 !old_length_handle->SameValue( |
12473 Handle<JSArray>::cast(object)->length())) { | 12469 Handle<JSArray>::cast(object)->length())) { |
12474 new_length_handle = handle(Handle<JSArray>::cast(object)->length(), | 12470 new_length_handle = handle(Handle<JSArray>::cast(object)->length(), |
12475 isolate); | 12471 isolate); |
12476 uint32_t old_length = 0; | 12472 uint32_t old_length = 0; |
12477 uint32_t new_length = 0; | 12473 uint32_t new_length = 0; |
12478 CHECK(old_length_handle->ToArrayIndex(&old_length)); | 12474 CHECK(old_length_handle->ToArrayIndex(&old_length)); |
12479 CHECK(new_length_handle->ToArrayIndex(&new_length)); | 12475 CHECK(new_length_handle->ToArrayIndex(&new_length)); |
12480 | 12476 |
12481 BeginPerformSplice(Handle<JSArray>::cast(object)); | 12477 RETURN_ON_EXCEPTION( |
| 12478 isolate, BeginPerformSplice(Handle<JSArray>::cast(object)), Object); |
12482 RETURN_ON_EXCEPTION( | 12479 RETURN_ON_EXCEPTION( |
12483 isolate, EnqueueChangeRecord(object, "add", name, old_value), Object); | 12480 isolate, EnqueueChangeRecord(object, "add", name, old_value), Object); |
12484 RETURN_ON_EXCEPTION( | 12481 RETURN_ON_EXCEPTION( |
12485 isolate, EnqueueChangeRecord(object, "update", | 12482 isolate, EnqueueChangeRecord(object, "update", |
12486 isolate->factory()->length_string(), | 12483 isolate->factory()->length_string(), |
12487 old_length_handle), | 12484 old_length_handle), |
12488 Object); | 12485 Object); |
12489 EndPerformSplice(Handle<JSArray>::cast(object)); | 12486 RETURN_ON_EXCEPTION( |
| 12487 isolate, EndPerformSplice(Handle<JSArray>::cast(object)), Object); |
12490 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); | 12488 Handle<JSArray> deleted = isolate->factory()->NewJSArray(0); |
12491 EnqueueSpliceRecord(Handle<JSArray>::cast(object), old_length, deleted, | 12489 RETURN_ON_EXCEPTION( |
12492 new_length - old_length); | 12490 isolate, |
| 12491 EnqueueSpliceRecord(Handle<JSArray>::cast(object), old_length, |
| 12492 deleted, new_length - old_length), |
| 12493 Object); |
12493 } else { | 12494 } else { |
12494 RETURN_ON_EXCEPTION( | 12495 RETURN_ON_EXCEPTION( |
12495 isolate, EnqueueChangeRecord(object, "add", name, old_value), Object); | 12496 isolate, EnqueueChangeRecord(object, "add", name, old_value), Object); |
12496 } | 12497 } |
12497 } else if (old_value->IsTheHole()) { | 12498 } else if (old_value->IsTheHole()) { |
12498 RETURN_ON_EXCEPTION( | 12499 RETURN_ON_EXCEPTION( |
12499 isolate, EnqueueChangeRecord(object, "reconfigure", name, old_value), | 12500 isolate, EnqueueChangeRecord(object, "reconfigure", name, old_value), |
12500 Object); | 12501 Object); |
12501 } else { | 12502 } else { |
12502 Handle<Object> new_value = | 12503 Handle<Object> new_value = |
(...skipping 3932 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
16435 Handle<DependentCode> codes = | 16436 Handle<DependentCode> codes = |
16436 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16437 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
16437 DependentCode::kPropertyCellChangedGroup, | 16438 DependentCode::kPropertyCellChangedGroup, |
16438 info->object_wrapper()); | 16439 info->object_wrapper()); |
16439 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16440 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
16440 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16441 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
16441 cell, info->zone()); | 16442 cell, info->zone()); |
16442 } | 16443 } |
16443 | 16444 |
16444 } } // namespace v8::internal | 16445 } } // namespace v8::internal |
OLD | NEW |