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