| 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 5351 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5362 return JSObject::cast(context->extension())->ReferencesObject(obj); | 5362 return JSObject::cast(context->extension())->ReferencesObject(obj); |
| 5363 } | 5363 } |
| 5364 } | 5364 } |
| 5365 | 5365 |
| 5366 // No references to object. | 5366 // No references to object. |
| 5367 return false; | 5367 return false; |
| 5368 } | 5368 } |
| 5369 | 5369 |
| 5370 | 5370 |
| 5371 MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { | 5371 MaybeHandle<Object> JSObject::PreventExtensions(Handle<JSObject> object) { |
| 5372 if (!object->map()->is_extensible()) return object; |
| 5373 |
| 5374 if (!object->HasSloppyArgumentsElements() && !object->map()->is_observed()) { |
| 5375 return PreventExtensionsWithTransition<NONE>(object); |
| 5376 } |
| 5377 |
| 5372 Isolate* isolate = object->GetIsolate(); | 5378 Isolate* isolate = object->GetIsolate(); |
| 5373 | 5379 |
| 5374 if (!object->map()->is_extensible()) return object; | |
| 5375 | |
| 5376 if (object->IsAccessCheckNeeded() && | 5380 if (object->IsAccessCheckNeeded() && |
| 5377 !isolate->MayNamedAccess( | 5381 !isolate->MayNamedAccess( |
| 5378 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { | 5382 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { |
| 5379 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); | 5383 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); |
| 5380 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5384 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 5381 return isolate->factory()->false_value(); | 5385 return isolate->factory()->false_value(); |
| 5382 } | 5386 } |
| 5383 | 5387 |
| 5384 if (object->IsJSGlobalProxy()) { | 5388 if (object->IsJSGlobalProxy()) { |
| 5385 PrototypeIterator iter(isolate, object); | 5389 PrototypeIterator iter(isolate, object); |
| (...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5419 RETURN_ON_EXCEPTION( | 5423 RETURN_ON_EXCEPTION( |
| 5420 isolate, | 5424 isolate, |
| 5421 EnqueueChangeRecord(object, "preventExtensions", Handle<Name>(), | 5425 EnqueueChangeRecord(object, "preventExtensions", Handle<Name>(), |
| 5422 isolate->factory()->the_hole_value()), | 5426 isolate->factory()->the_hole_value()), |
| 5423 Object); | 5427 Object); |
| 5424 } | 5428 } |
| 5425 return object; | 5429 return object; |
| 5426 } | 5430 } |
| 5427 | 5431 |
| 5428 | 5432 |
| 5429 template<typename Dictionary> | 5433 Handle<SeededNumberDictionary> JSObject::GetNormalizedElementDictionary( |
| 5430 static void FreezeDictionary(Dictionary* dictionary) { | 5434 Handle<JSObject> object) { |
| 5435 DCHECK(!object->elements()->IsDictionary()); |
| 5436 Isolate* isolate = object->GetIsolate(); |
| 5437 int length = object->IsJSArray() |
| 5438 ? Smi::cast(Handle<JSArray>::cast(object)->length())->value() |
| 5439 : object->elements()->length(); |
| 5440 if (length > 0) { |
| 5441 int capacity = 0; |
| 5442 int used = 0; |
| 5443 object->GetElementsCapacityAndUsage(&capacity, &used); |
| 5444 Handle<SeededNumberDictionary> new_element_dictionary = |
| 5445 SeededNumberDictionary::New(isolate, used); |
| 5446 |
| 5447 // Move elements to a dictionary; avoid calling NormalizeElements to avoid |
| 5448 // unnecessary transitions. |
| 5449 return CopyFastElementsToDictionary(handle(object->elements()), length, |
| 5450 new_element_dictionary); |
| 5451 } |
| 5452 // No existing elements, use a pre-allocated empty backing store |
| 5453 return isolate->factory()->empty_slow_element_dictionary(); |
| 5454 } |
| 5455 |
| 5456 |
| 5457 template <typename Dictionary> |
| 5458 static void ApplyAttributesToDictionary(Dictionary* dictionary, |
| 5459 const PropertyAttributes attributes) { |
| 5431 int capacity = dictionary->Capacity(); | 5460 int capacity = dictionary->Capacity(); |
| 5432 for (int i = 0; i < capacity; i++) { | 5461 for (int i = 0; i < capacity; i++) { |
| 5433 Object* k = dictionary->KeyAt(i); | 5462 Object* k = dictionary->KeyAt(i); |
| 5434 if (dictionary->IsKey(k) && | 5463 if (dictionary->IsKey(k) && |
| 5435 !(k->IsSymbol() && Symbol::cast(k)->is_private())) { | 5464 !(k->IsSymbol() && Symbol::cast(k)->is_private())) { |
| 5436 PropertyDetails details = dictionary->DetailsAt(i); | 5465 PropertyDetails details = dictionary->DetailsAt(i); |
| 5437 int attrs = DONT_DELETE; | 5466 int attrs = attributes; |
| 5438 // READ_ONLY is an invalid attribute for JS setters/getters. | 5467 // READ_ONLY is an invalid attribute for JS setters/getters. |
| 5439 if (details.type() == CALLBACKS) { | 5468 if ((attributes & READ_ONLY) && details.type() == CALLBACKS) { |
| 5440 Object* v = dictionary->ValueAt(i); | 5469 Object* v = dictionary->ValueAt(i); |
| 5441 if (v->IsPropertyCell()) v = PropertyCell::cast(v)->value(); | 5470 if (v->IsPropertyCell()) v = PropertyCell::cast(v)->value(); |
| 5442 if (!v->IsAccessorPair()) attrs |= READ_ONLY; | 5471 if (v->IsAccessorPair()) attrs &= ~READ_ONLY; |
| 5443 } else { | |
| 5444 attrs |= READ_ONLY; | |
| 5445 } | 5472 } |
| 5446 details = details.CopyAddAttributes( | 5473 details = details.CopyAddAttributes( |
| 5447 static_cast<PropertyAttributes>(attrs)); | 5474 static_cast<PropertyAttributes>(attrs)); |
| 5448 dictionary->DetailsAtPut(i, details); | 5475 dictionary->DetailsAtPut(i, details); |
| 5449 } | 5476 } |
| 5450 } | 5477 } |
| 5451 } | 5478 } |
| 5452 | 5479 |
| 5453 | 5480 |
| 5454 MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) { | 5481 template <PropertyAttributes attrs> |
| 5455 // Freezing sloppy arguments should be handled elsewhere. | 5482 MaybeHandle<Object> JSObject::PreventExtensionsWithTransition( |
| 5483 Handle<JSObject> object) { |
| 5484 STATIC_ASSERT(attrs == NONE || attrs == SEALED || attrs == FROZEN); |
| 5485 |
| 5486 // Sealing/freezing sloppy arguments should be handled elsewhere. |
| 5456 DCHECK(!object->HasSloppyArgumentsElements()); | 5487 DCHECK(!object->HasSloppyArgumentsElements()); |
| 5457 DCHECK(!object->map()->is_observed()); | 5488 DCHECK(!object->map()->is_observed()); |
| 5458 | 5489 |
| 5459 if (object->map()->is_frozen()) return object; | |
| 5460 | |
| 5461 Isolate* isolate = object->GetIsolate(); | 5490 Isolate* isolate = object->GetIsolate(); |
| 5462 if (object->IsAccessCheckNeeded() && | 5491 if (object->IsAccessCheckNeeded() && |
| 5463 !isolate->MayNamedAccess( | 5492 !isolate->MayNamedAccess( |
| 5464 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { | 5493 object, isolate->factory()->undefined_value(), v8::ACCESS_KEYS)) { |
| 5465 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); | 5494 isolate->ReportFailedAccessCheck(object, v8::ACCESS_KEYS); |
| 5466 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); | 5495 RETURN_EXCEPTION_IF_SCHEDULED_EXCEPTION(isolate, Object); |
| 5467 return isolate->factory()->false_value(); | 5496 return isolate->factory()->false_value(); |
| 5468 } | 5497 } |
| 5469 | 5498 |
| 5470 if (object->IsJSGlobalProxy()) { | 5499 if (object->IsJSGlobalProxy()) { |
| 5471 PrototypeIterator iter(isolate, object); | 5500 PrototypeIterator iter(isolate, object); |
| 5472 if (iter.IsAtEnd()) return object; | 5501 if (iter.IsAtEnd()) return object; |
| 5473 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); | 5502 DCHECK(PrototypeIterator::GetCurrent(iter)->IsJSGlobalObject()); |
| 5474 return Freeze(Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); | 5503 return PreventExtensionsWithTransition<attrs>( |
| 5504 Handle<JSObject>::cast(PrototypeIterator::GetCurrent(iter))); |
| 5475 } | 5505 } |
| 5476 | 5506 |
| 5477 // It's not possible to freeze objects with external array elements | 5507 // It's not possible to seal or freeze objects with external array elements |
| 5478 if (object->HasExternalArrayElements() || | 5508 if (object->HasExternalArrayElements() || |
| 5479 object->HasFixedTypedArrayElements()) { | 5509 object->HasFixedTypedArrayElements()) { |
| 5480 THROW_NEW_ERROR(isolate, | 5510 THROW_NEW_ERROR(isolate, |
| 5481 NewTypeError("cant_prevent_ext_external_array_elements", | 5511 NewTypeError("cant_prevent_ext_external_array_elements", |
| 5482 HandleVector(&object, 1)), | 5512 HandleVector(&object, 1)), |
| 5483 Object); | 5513 Object); |
| 5484 } | 5514 } |
| 5485 | 5515 |
| 5486 Handle<SeededNumberDictionary> new_element_dictionary; | 5516 Handle<SeededNumberDictionary> new_element_dictionary; |
| 5487 if (!object->elements()->IsDictionary()) { | 5517 if (!object->elements()->IsDictionary()) { |
| 5488 int length = object->IsJSArray() | 5518 new_element_dictionary = GetNormalizedElementDictionary(object); |
| 5489 ? Smi::cast(Handle<JSArray>::cast(object)->length())->value() | 5519 } |
| 5490 : object->elements()->length(); | |
| 5491 if (length > 0) { | |
| 5492 int capacity = 0; | |
| 5493 int used = 0; | |
| 5494 object->GetElementsCapacityAndUsage(&capacity, &used); | |
| 5495 new_element_dictionary = SeededNumberDictionary::New(isolate, used); | |
| 5496 | 5520 |
| 5497 // Move elements to a dictionary; avoid calling NormalizeElements to avoid | 5521 Handle<Symbol> transition_marker; |
| 5498 // unnecessary transitions. | 5522 if (attrs == NONE) { |
| 5499 new_element_dictionary = CopyFastElementsToDictionary( | 5523 transition_marker = isolate->factory()->nonextensible_symbol(); |
| 5500 handle(object->elements()), length, new_element_dictionary); | 5524 } else if (attrs == SEALED) { |
| 5501 } else { | 5525 transition_marker = isolate->factory()->sealed_symbol(); |
| 5502 // No existing elements, use a pre-allocated empty backing store | 5526 } else { |
| 5503 new_element_dictionary = | 5527 DCHECK(attrs == FROZEN); |
| 5504 isolate->factory()->empty_slow_element_dictionary(); | 5528 transition_marker = isolate->factory()->frozen_symbol(); |
| 5505 } | |
| 5506 } | 5529 } |
| 5507 | 5530 |
| 5508 Handle<Map> old_map(object->map(), isolate); | 5531 Handle<Map> old_map(object->map(), isolate); |
| 5509 int transition_index = | 5532 int transition_index = old_map->SearchSpecialTransition(*transition_marker); |
| 5510 old_map->SearchSpecialTransition(isolate->heap()->frozen_symbol()); | |
| 5511 if (transition_index != TransitionArray::kNotFound) { | 5533 if (transition_index != TransitionArray::kNotFound) { |
| 5512 Handle<Map> transition_map(old_map->GetTransition(transition_index)); | 5534 Handle<Map> transition_map(old_map->GetTransition(transition_index)); |
| 5513 DCHECK(transition_map->has_dictionary_elements()); | 5535 DCHECK(transition_map->has_dictionary_elements()); |
| 5514 DCHECK(transition_map->is_frozen()); | |
| 5515 DCHECK(!transition_map->is_extensible()); | 5536 DCHECK(!transition_map->is_extensible()); |
| 5516 JSObject::MigrateToMap(object, transition_map); | 5537 JSObject::MigrateToMap(object, transition_map); |
| 5517 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { | 5538 } else if (object->HasFastProperties() && old_map->CanHaveMoreTransitions()) { |
| 5518 // Create a new descriptor array with fully-frozen properties | 5539 // Create a new descriptor array with the appropriate property attributes |
| 5519 Handle<Map> new_map = Map::CopyForFreeze(old_map); | 5540 Handle<Map> new_map = Map::CopyForPreventExtensions( |
| 5541 old_map, attrs, transition_marker, "CopyForPreventExtensions"); |
| 5520 JSObject::MigrateToMap(object, new_map); | 5542 JSObject::MigrateToMap(object, new_map); |
| 5521 } else { | 5543 } else { |
| 5522 DCHECK(old_map->is_dictionary_map() || !old_map->is_prototype_map()); | 5544 DCHECK(old_map->is_dictionary_map() || !old_map->is_prototype_map()); |
| 5523 // Slow path: need to normalize properties for safety | 5545 // Slow path: need to normalize properties for safety |
| 5524 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0, "SlowFreeze"); | 5546 NormalizeProperties(object, CLEAR_INOBJECT_PROPERTIES, 0, |
| 5547 "SlowPreventExtensions"); |
| 5525 | 5548 |
| 5526 // Create a new map, since other objects with this map may be extensible. | 5549 // Create a new map, since other objects with this map may be extensible. |
| 5527 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. | 5550 // TODO(adamk): Extend the NormalizedMapCache to handle non-extensible maps. |
| 5528 Handle<Map> new_map = Map::Copy(handle(object->map()), "SlowCopyForFreeze"); | 5551 Handle<Map> new_map = |
| 5529 new_map->freeze(); | 5552 Map::Copy(handle(object->map()), "SlowCopyForPreventExtensions"); |
| 5530 new_map->set_is_extensible(false); | 5553 new_map->set_is_extensible(false); |
| 5531 new_map->set_elements_kind(DICTIONARY_ELEMENTS); | 5554 new_map->set_elements_kind(DICTIONARY_ELEMENTS); |
| 5532 JSObject::MigrateToMap(object, new_map); | 5555 JSObject::MigrateToMap(object, new_map); |
| 5533 | 5556 |
| 5534 // Freeze dictionary-mode properties | 5557 if (attrs != NONE) { |
| 5535 FreezeDictionary(object->property_dictionary()); | 5558 ApplyAttributesToDictionary(object->property_dictionary(), attrs); |
| 5559 } |
| 5536 } | 5560 } |
| 5537 | 5561 |
| 5538 DCHECK(object->map()->has_dictionary_elements()); | 5562 DCHECK(object->map()->has_dictionary_elements()); |
| 5539 if (!new_element_dictionary.is_null()) { | 5563 if (!new_element_dictionary.is_null()) { |
| 5540 object->set_elements(*new_element_dictionary); | 5564 object->set_elements(*new_element_dictionary); |
| 5541 } | 5565 } |
| 5542 | 5566 |
| 5543 if (object->elements() != isolate->heap()->empty_slow_element_dictionary()) { | 5567 if (object->elements() != isolate->heap()->empty_slow_element_dictionary()) { |
| 5544 SeededNumberDictionary* dictionary = object->element_dictionary(); | 5568 SeededNumberDictionary* dictionary = object->element_dictionary(); |
| 5545 // Make sure we never go back to the fast case | 5569 // Make sure we never go back to the fast case |
| 5546 dictionary->set_requires_slow_elements(); | 5570 dictionary->set_requires_slow_elements(); |
| 5547 // Freeze all elements in the dictionary | 5571 if (attrs != NONE) { |
| 5548 FreezeDictionary(dictionary); | 5572 ApplyAttributesToDictionary(dictionary, attrs); |
| 5573 } |
| 5549 } | 5574 } |
| 5550 | 5575 |
| 5551 return object; | 5576 return object; |
| 5552 } | 5577 } |
| 5553 | 5578 |
| 5554 | 5579 |
| 5580 MaybeHandle<Object> JSObject::Freeze(Handle<JSObject> object) { |
| 5581 return PreventExtensionsWithTransition<FROZEN>(object); |
| 5582 } |
| 5583 |
| 5584 |
| 5585 MaybeHandle<Object> JSObject::Seal(Handle<JSObject> object) { |
| 5586 return PreventExtensionsWithTransition<SEALED>(object); |
| 5587 } |
| 5588 |
| 5589 |
| 5555 void JSObject::SetObserved(Handle<JSObject> object) { | 5590 void JSObject::SetObserved(Handle<JSObject> object) { |
| 5556 DCHECK(!object->IsJSGlobalProxy()); | 5591 DCHECK(!object->IsJSGlobalProxy()); |
| 5557 DCHECK(!object->IsJSGlobalObject()); | 5592 DCHECK(!object->IsJSGlobalObject()); |
| 5558 Isolate* isolate = object->GetIsolate(); | 5593 Isolate* isolate = object->GetIsolate(); |
| 5559 Handle<Map> new_map; | 5594 Handle<Map> new_map; |
| 5560 Handle<Map> old_map(object->map(), isolate); | 5595 Handle<Map> old_map(object->map(), isolate); |
| 5561 DCHECK(!old_map->is_observed()); | 5596 DCHECK(!old_map->is_observed()); |
| 5562 int transition_index = | 5597 int transition_index = |
| 5563 old_map->SearchSpecialTransition(isolate->heap()->observed_symbol()); | 5598 old_map->SearchSpecialTransition(isolate->heap()->observed_symbol()); |
| 5564 if (transition_index != TransitionArray::kNotFound) { | 5599 if (transition_index != TransitionArray::kNotFound) { |
| (...skipping 1454 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 7019 | 7054 |
| 7020 // Adjust the map with the extra inobject properties. | 7055 // Adjust the map with the extra inobject properties. |
| 7021 copy->set_inobject_properties(inobject_properties); | 7056 copy->set_inobject_properties(inobject_properties); |
| 7022 copy->set_unused_property_fields(inobject_properties); | 7057 copy->set_unused_property_fields(inobject_properties); |
| 7023 copy->set_instance_size(new_instance_size); | 7058 copy->set_instance_size(new_instance_size); |
| 7024 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); | 7059 copy->set_visitor_id(StaticVisitorBase::GetVisitorId(*copy)); |
| 7025 return copy; | 7060 return copy; |
| 7026 } | 7061 } |
| 7027 | 7062 |
| 7028 | 7063 |
| 7029 Handle<Map> Map::CopyForFreeze(Handle<Map> map) { | 7064 Handle<Map> Map::CopyForPreventExtensions(Handle<Map> map, |
| 7065 PropertyAttributes attrs_to_add, |
| 7066 Handle<Symbol> transition_marker, |
| 7067 const char* reason) { |
| 7030 int num_descriptors = map->NumberOfOwnDescriptors(); | 7068 int num_descriptors = map->NumberOfOwnDescriptors(); |
| 7031 Isolate* isolate = map->GetIsolate(); | 7069 Isolate* isolate = map->GetIsolate(); |
| 7032 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes( | 7070 Handle<DescriptorArray> new_desc = DescriptorArray::CopyUpToAddAttributes( |
| 7033 handle(map->instance_descriptors(), isolate), num_descriptors, FROZEN); | 7071 handle(map->instance_descriptors(), isolate), num_descriptors, |
| 7072 attrs_to_add); |
| 7034 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(), | 7073 Handle<LayoutDescriptor> new_layout_descriptor(map->GetLayoutDescriptor(), |
| 7035 isolate); | 7074 isolate); |
| 7036 Handle<Map> new_map = CopyReplaceDescriptors( | 7075 Handle<Map> new_map = CopyReplaceDescriptors( |
| 7037 map, new_desc, new_layout_descriptor, INSERT_TRANSITION, | 7076 map, new_desc, new_layout_descriptor, INSERT_TRANSITION, |
| 7038 isolate->factory()->frozen_symbol(), "CopyForFreeze", SPECIAL_TRANSITION); | 7077 transition_marker, reason, SPECIAL_TRANSITION); |
| 7039 new_map->freeze(); | |
| 7040 new_map->set_is_extensible(false); | 7078 new_map->set_is_extensible(false); |
| 7041 new_map->set_elements_kind(DICTIONARY_ELEMENTS); | 7079 new_map->set_elements_kind(DICTIONARY_ELEMENTS); |
| 7042 return new_map; | 7080 return new_map; |
| 7043 } | 7081 } |
| 7044 | 7082 |
| 7045 | 7083 |
| 7046 bool DescriptorArray::CanHoldValue(int descriptor, Object* value) { | 7084 bool DescriptorArray::CanHoldValue(int descriptor, Object* value) { |
| 7047 PropertyDetails details = GetDetails(descriptor); | 7085 PropertyDetails details = GetDetails(descriptor); |
| 7048 switch (details.type()) { | 7086 switch (details.type()) { |
| 7049 case FIELD: | 7087 case FIELD: |
| (...skipping 2334 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 9384 } | 9422 } |
| 9385 | 9423 |
| 9386 | 9424 |
| 9387 static bool CheckEquivalent(Map* first, Map* second) { | 9425 static bool CheckEquivalent(Map* first, Map* second) { |
| 9388 return | 9426 return |
| 9389 first->constructor() == second->constructor() && | 9427 first->constructor() == second->constructor() && |
| 9390 first->prototype() == second->prototype() && | 9428 first->prototype() == second->prototype() && |
| 9391 first->instance_type() == second->instance_type() && | 9429 first->instance_type() == second->instance_type() && |
| 9392 first->bit_field() == second->bit_field() && | 9430 first->bit_field() == second->bit_field() && |
| 9393 first->bit_field2() == second->bit_field2() && | 9431 first->bit_field2() == second->bit_field2() && |
| 9394 first->is_frozen() == second->is_frozen() && | |
| 9395 first->has_instance_call_handler() == second->has_instance_call_handler(); | 9432 first->has_instance_call_handler() == second->has_instance_call_handler(); |
| 9396 } | 9433 } |
| 9397 | 9434 |
| 9398 | 9435 |
| 9399 bool Map::EquivalentToForTransition(Map* other) { | 9436 bool Map::EquivalentToForTransition(Map* other) { |
| 9400 return CheckEquivalent(this, other); | 9437 return CheckEquivalent(this, other); |
| 9401 } | 9438 } |
| 9402 | 9439 |
| 9403 | 9440 |
| 9404 bool Map::EquivalentToForNormalization(Map* other, | 9441 bool Map::EquivalentToForNormalization(Map* other, |
| (...skipping 7490 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 16895 Handle<DependentCode> codes = | 16932 Handle<DependentCode> codes = |
| 16896 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), | 16933 DependentCode::Insert(handle(cell->dependent_code(), info->isolate()), |
| 16897 DependentCode::kPropertyCellChangedGroup, | 16934 DependentCode::kPropertyCellChangedGroup, |
| 16898 info->object_wrapper()); | 16935 info->object_wrapper()); |
| 16899 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); | 16936 if (*codes != cell->dependent_code()) cell->set_dependent_code(*codes); |
| 16900 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( | 16937 info->dependencies(DependentCode::kPropertyCellChangedGroup)->Add( |
| 16901 cell, info->zone()); | 16938 cell, info->zone()); |
| 16902 } | 16939 } |
| 16903 | 16940 |
| 16904 } } // namespace v8::internal | 16941 } } // namespace v8::internal |
| OLD | NEW |