OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 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 "src/v8.h" | 5 #include "src/v8.h" |
6 | 6 |
7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
8 #include "src/deoptimizer.h" | 8 #include "src/deoptimizer.h" |
9 #include "src/lookup.h" | 9 #include "src/lookup.h" |
10 #include "src/lookup-inl.h" | 10 #include "src/lookup-inl.h" |
(...skipping 113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
124 // Can only be called when the receiver is a JSObject. JSProxy has to be | 124 // Can only be called when the receiver is a JSObject. JSProxy has to be |
125 // handled via a trap. Adding properties to primitive values is not | 125 // handled via a trap. Adding properties to primitive values is not |
126 // observable. | 126 // observable. |
127 Handle<JSObject> receiver = GetStoreTarget(); | 127 Handle<JSObject> receiver = GetStoreTarget(); |
128 | 128 |
129 if (!isolate()->IsInternallyUsedPropertyName(name()) && | 129 if (!isolate()->IsInternallyUsedPropertyName(name()) && |
130 !receiver->map()->is_extensible()) { | 130 !receiver->map()->is_extensible()) { |
131 return; | 131 return; |
132 } | 132 } |
133 | 133 |
134 transition_map_ = Map::TransitionToDataProperty( | 134 auto transition = Map::TransitionToDataProperty( |
135 handle(receiver->map(), isolate_), name_, value, attributes, store_mode); | 135 handle(receiver->map(), isolate_), name_, value, attributes, store_mode); |
136 state_ = TRANSITION; | 136 state_ = TRANSITION; |
| 137 transition_ = transition; |
| 138 |
| 139 if (receiver->IsGlobalObject()) { |
| 140 // Install a property cell. |
| 141 InternalizeName(); |
| 142 auto cell = GlobalObject::EnsurePropertyCell( |
| 143 Handle<GlobalObject>::cast(receiver), name()); |
| 144 DCHECK(cell->value()->IsTheHole()); |
| 145 transition_ = cell; |
| 146 } else if (transition->GetBackPointer()->IsMap()) { |
| 147 property_details_ = transition->GetLastDescriptorDetails(); |
| 148 has_property_ = true; |
| 149 } |
137 } | 150 } |
138 | 151 |
139 | 152 |
140 void LookupIterator::ApplyTransitionToDataProperty() { | 153 void LookupIterator::ApplyTransitionToDataProperty() { |
141 DCHECK_EQ(TRANSITION, state_); | 154 DCHECK_EQ(TRANSITION, state_); |
142 | 155 |
143 Handle<JSObject> receiver = GetStoreTarget(); | 156 Handle<JSObject> receiver = GetStoreTarget(); |
| 157 if (receiver->IsGlobalObject()) return; |
144 holder_ = receiver; | 158 holder_ = receiver; |
145 holder_map_ = transition_map_; | 159 holder_map_ = transition_map(); |
146 JSObject::MigrateToMap(receiver, holder_map_); | 160 JSObject::MigrateToMap(receiver, holder_map_); |
147 ReloadPropertyInformation(); | 161 ReloadPropertyInformation(); |
148 } | 162 } |
149 | 163 |
150 | 164 |
151 void LookupIterator::TransitionToAccessorProperty( | 165 void LookupIterator::TransitionToAccessorProperty( |
152 AccessorComponent component, Handle<Object> accessor, | 166 AccessorComponent component, Handle<Object> accessor, |
153 PropertyAttributes attributes) { | 167 PropertyAttributes attributes) { |
154 DCHECK(!accessor->IsNull()); | 168 DCHECK(!accessor->IsNull()); |
155 // Can only be called when the receiver is a JSObject. JSProxy has to be | 169 // Can only be called when the receiver is a JSObject. JSProxy has to be |
(...skipping 181 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
337 } | 351 } |
338 return false; | 352 return false; |
339 } | 353 } |
340 | 354 |
341 | 355 |
342 void LookupIterator::InternalizeName() { | 356 void LookupIterator::InternalizeName() { |
343 if (name_->IsUniqueName()) return; | 357 if (name_->IsUniqueName()) return; |
344 name_ = factory()->InternalizeString(Handle<String>::cast(name_)); | 358 name_ = factory()->InternalizeString(Handle<String>::cast(name_)); |
345 } | 359 } |
346 } } // namespace v8::internal | 360 } } // namespace v8::internal |
OLD | NEW |