| OLD | NEW |
| 1 // Copyright 2013 the V8 project authors. All rights reserved. | 1 // Copyright 2013 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 4000 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4011 | 4011 |
| 4012 // From this point on everything needs to be handlified. | 4012 // From this point on everything needs to be handlified. |
| 4013 HandleScope scope(isolate); | 4013 HandleScope scope(isolate); |
| 4014 Handle<JSObject> self(this); | 4014 Handle<JSObject> self(this); |
| 4015 Handle<Name> name(name_raw); | 4015 Handle<Name> name(name_raw); |
| 4016 Handle<Object> value(value_raw, isolate); | 4016 Handle<Object> value(value_raw, isolate); |
| 4017 | 4017 |
| 4018 Handle<Object> old_value(isolate->heap()->the_hole_value(), isolate); | 4018 Handle<Object> old_value(isolate->heap()->the_hole_value(), isolate); |
| 4019 PropertyAttributes old_attributes = ABSENT; | 4019 PropertyAttributes old_attributes = ABSENT; |
| 4020 bool is_observed = FLAG_harmony_observation && self->map()->is_observed(); | 4020 bool is_observed = FLAG_harmony_observation && self->map()->is_observed(); |
| 4021 if (is_observed) { | 4021 if (is_observed && lookup.IsProperty()) { |
| 4022 if (lookup.IsDataProperty()) old_value = Object::GetProperty(self, name); | 4022 if (lookup.IsDataProperty()) old_value = Object::GetProperty(self, name); |
| 4023 old_attributes = lookup.GetAttributes(); | 4023 old_attributes = lookup.GetAttributes(); |
| 4024 } | 4024 } |
| 4025 | 4025 |
| 4026 // Check of IsReadOnly removed from here in clone. | 4026 // Check of IsReadOnly removed from here in clone. |
| 4027 MaybeObject* result = *value; | 4027 MaybeObject* result = *value; |
| 4028 switch (lookup.type()) { | 4028 switch (lookup.type()) { |
| 4029 case NORMAL: { | 4029 case NORMAL: { |
| 4030 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); | 4030 PropertyDetails details = PropertyDetails(attributes, NORMAL, 0); |
| 4031 result = self->SetNormalizedProperty(*name, *value, details); | 4031 result = self->SetNormalizedProperty(*name, *value, details); |
| (...skipping 1518 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 5550 // Make sure we never go back to the fast case | 5550 // Make sure we never go back to the fast case |
| 5551 dictionary->set_requires_slow_elements(); | 5551 dictionary->set_requires_slow_elements(); |
| 5552 // Freeze all elements in the dictionary | 5552 // Freeze all elements in the dictionary |
| 5553 FreezeDictionary(dictionary); | 5553 FreezeDictionary(dictionary); |
| 5554 } | 5554 } |
| 5555 | 5555 |
| 5556 return this; | 5556 return this; |
| 5557 } | 5557 } |
| 5558 | 5558 |
| 5559 | 5559 |
| 5560 MUST_USE_RESULT MaybeObject* JSObject::SetObserved(Isolate* isolate) { |
| 5561 if (map()->is_observed()) |
| 5562 return isolate->heap()->undefined_value(); |
| 5563 |
| 5564 Heap* heap = isolate->heap(); |
| 5565 |
| 5566 if (!HasExternalArrayElements()) { |
| 5567 // Go to dictionary mode, so that we don't skip map checks. |
| 5568 MaybeObject* maybe = NormalizeElements(); |
| 5569 if (maybe->IsFailure()) return maybe; |
| 5570 ASSERT(!HasFastElements()); |
| 5571 } |
| 5572 |
| 5573 LookupResult result(isolate); |
| 5574 map()->LookupTransition(this, heap->observed_symbol(), &result); |
| 5575 |
| 5576 Map* new_map; |
| 5577 if (result.IsTransition()) { |
| 5578 new_map = result.GetTransitionTarget(); |
| 5579 ASSERT(new_map->is_observed()); |
| 5580 } else if (map()->CanHaveMoreTransitions()) { |
| 5581 MaybeObject* maybe_new_map = map()->CopyForObserved(); |
| 5582 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 5583 } else { |
| 5584 MaybeObject* maybe_copy = map()->Copy(); |
| 5585 if (!maybe_copy->To(&new_map)) return maybe_copy; |
| 5586 new_map->set_is_observed(true); |
| 5587 } |
| 5588 set_map(new_map); |
| 5589 |
| 5590 return heap->undefined_value(); |
| 5591 } |
| 5592 |
| 5593 |
| 5560 MUST_USE_RESULT MaybeObject* JSObject::DeepCopy(Isolate* isolate) { | 5594 MUST_USE_RESULT MaybeObject* JSObject::DeepCopy(Isolate* isolate) { |
| 5561 StackLimitCheck check(isolate); | 5595 StackLimitCheck check(isolate); |
| 5562 if (check.HasOverflowed()) return isolate->StackOverflow(); | 5596 if (check.HasOverflowed()) return isolate->StackOverflow(); |
| 5563 | 5597 |
| 5564 if (map()->is_deprecated()) { | 5598 if (map()->is_deprecated()) { |
| 5565 MaybeObject* maybe_failure = MigrateInstance(); | 5599 MaybeObject* maybe_failure = MigrateInstance(); |
| 5566 if (maybe_failure->IsFailure()) return maybe_failure; | 5600 if (maybe_failure->IsFailure()) return maybe_failure; |
| 5567 } | 5601 } |
| 5568 | 5602 |
| 5569 Heap* heap = isolate->heap(); | 5603 Heap* heap = isolate->heap(); |
| (...skipping 1103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 6673 if (insert_transition) { | 6707 if (insert_transition) { |
| 6674 MaybeObject* added_elements = set_elements_transition_map(new_map); | 6708 MaybeObject* added_elements = set_elements_transition_map(new_map); |
| 6675 if (added_elements->IsFailure()) return added_elements; | 6709 if (added_elements->IsFailure()) return added_elements; |
| 6676 new_map->SetBackPointer(this); | 6710 new_map->SetBackPointer(this); |
| 6677 } | 6711 } |
| 6678 | 6712 |
| 6679 return new_map; | 6713 return new_map; |
| 6680 } | 6714 } |
| 6681 | 6715 |
| 6682 | 6716 |
| 6717 MaybeObject* Map::CopyForObserved() { |
| 6718 ASSERT(!is_observed()); |
| 6719 |
| 6720 // In case the map owned its own descriptors, share the descriptors and |
| 6721 // transfer ownership to the new map. |
| 6722 Map* new_map; |
| 6723 MaybeObject* maybe_new_map; |
| 6724 if (owns_descriptors()) { |
| 6725 maybe_new_map = CopyDropDescriptors(); |
| 6726 } else { |
| 6727 maybe_new_map = Copy(); |
| 6728 } |
| 6729 if (!maybe_new_map->To(&new_map)) return maybe_new_map; |
| 6730 |
| 6731 TransitionArray* transitions; |
| 6732 MaybeObject* maybe_transitions = AddTransition(GetHeap()->observed_symbol(), |
| 6733 new_map, |
| 6734 FULL_TRANSITION); |
| 6735 if (!maybe_transitions->To(&transitions)) return maybe_transitions; |
| 6736 set_transitions(transitions); |
| 6737 |
| 6738 new_map->set_is_observed(true); |
| 6739 |
| 6740 if (owns_descriptors()) { |
| 6741 new_map->InitializeDescriptors(instance_descriptors()); |
| 6742 set_owns_descriptors(false); |
| 6743 } |
| 6744 |
| 6745 new_map->SetBackPointer(this); |
| 6746 return new_map; |
| 6747 } |
| 6748 |
| 6749 |
| 6683 MaybeObject* Map::CopyWithPreallocatedFieldDescriptors() { | 6750 MaybeObject* Map::CopyWithPreallocatedFieldDescriptors() { |
| 6684 if (pre_allocated_property_fields() == 0) return CopyDropDescriptors(); | 6751 if (pre_allocated_property_fields() == 0) return CopyDropDescriptors(); |
| 6685 | 6752 |
| 6686 // If the map has pre-allocated properties always start out with a descriptor | 6753 // If the map has pre-allocated properties always start out with a descriptor |
| 6687 // array describing these properties. | 6754 // array describing these properties. |
| 6688 ASSERT(constructor()->IsJSFunction()); | 6755 ASSERT(constructor()->IsJSFunction()); |
| 6689 JSFunction* ctor = JSFunction::cast(constructor()); | 6756 JSFunction* ctor = JSFunction::cast(constructor()); |
| 6690 Map* map = ctor->initial_map(); | 6757 Map* map = ctor->initial_map(); |
| 6691 DescriptorArray* descriptors = map->instance_descriptors(); | 6758 DescriptorArray* descriptors = map->instance_descriptors(); |
| 6692 | 6759 |
| (...skipping 9188 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 15881 | 15948 |
| 15882 void PropertyCell::AddDependentCode(Handle<Code> code) { | 15949 void PropertyCell::AddDependentCode(Handle<Code> code) { |
| 15883 Handle<DependentCode> codes = DependentCode::Insert( | 15950 Handle<DependentCode> codes = DependentCode::Insert( |
| 15884 Handle<DependentCode>(dependent_code()), | 15951 Handle<DependentCode>(dependent_code()), |
| 15885 DependentCode::kPropertyCellChangedGroup, code); | 15952 DependentCode::kPropertyCellChangedGroup, code); |
| 15886 if (*codes != dependent_code()) set_dependent_code(*codes); | 15953 if (*codes != dependent_code()) set_dependent_code(*codes); |
| 15887 } | 15954 } |
| 15888 | 15955 |
| 15889 | 15956 |
| 15890 } } // namespace v8::internal | 15957 } } // namespace v8::internal |
| OLD | NEW |