OLD | NEW |
1 // Copyright 2015 the V8 project authors. All rights reserved. | 1 // Copyright 2015 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/objects.h" | 5 #include "src/objects.h" |
6 | 6 |
7 #include <cmath> | 7 #include <cmath> |
8 #include <iomanip> | 8 #include <iomanip> |
9 #include <sstream> | 9 #include <sstream> |
10 | 10 |
(...skipping 1543 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1554 Simd128Value* a = Simd128Value::cast(this); | 1554 Simd128Value* a = Simd128Value::cast(this); |
1555 Simd128Value* b = Simd128Value::cast(other); | 1555 Simd128Value* b = Simd128Value::cast(other); |
1556 return a->map() == b->map() && a->BitwiseEquals(b); | 1556 return a->map() == b->map() && a->BitwiseEquals(b); |
1557 } | 1557 } |
1558 return false; | 1558 return false; |
1559 } | 1559 } |
1560 | 1560 |
1561 | 1561 |
1562 MaybeHandle<Object> Object::ArraySpeciesConstructor( | 1562 MaybeHandle<Object> Object::ArraySpeciesConstructor( |
1563 Isolate* isolate, Handle<Object> original_array) { | 1563 Isolate* isolate, Handle<Object> original_array) { |
1564 Handle<Context> native_context = isolate->native_context(); | |
1565 Handle<Object> default_species = isolate->array_function(); | 1564 Handle<Object> default_species = isolate->array_function(); |
1566 if (!FLAG_harmony_species) { | 1565 if (!FLAG_harmony_species) { |
1567 return default_species; | 1566 return default_species; |
1568 } | 1567 } |
1569 if (original_array->IsJSArray() && | 1568 if (original_array->IsJSArray() && |
1570 Handle<JSArray>::cast(original_array)->HasArrayPrototype(isolate) && | 1569 Handle<JSArray>::cast(original_array)->HasArrayPrototype(isolate) && |
1571 isolate->IsArraySpeciesLookupChainIntact()) { | 1570 isolate->IsArraySpeciesLookupChainIntact()) { |
1572 return default_species; | 1571 return default_species; |
1573 } | 1572 } |
1574 Handle<Object> constructor = isolate->factory()->undefined_value(); | 1573 Handle<Object> constructor = isolate->factory()->undefined_value(); |
1575 Maybe<bool> is_array = Object::IsArray(original_array); | 1574 Maybe<bool> is_array = Object::IsArray(original_array); |
1576 MAYBE_RETURN_NULL(is_array); | 1575 MAYBE_RETURN_NULL(is_array); |
1577 if (is_array.FromJust()) { | 1576 if (is_array.FromJust()) { |
1578 ASSIGN_RETURN_ON_EXCEPTION( | 1577 ASSIGN_RETURN_ON_EXCEPTION( |
1579 isolate, constructor, | 1578 isolate, constructor, |
1580 Object::GetProperty(original_array, | 1579 Object::GetProperty(original_array, |
1581 isolate->factory()->constructor_string()), | 1580 isolate->factory()->constructor_string()), |
1582 Object); | 1581 Object); |
1583 if (constructor->IsConstructor()) { | 1582 if (constructor->IsConstructor()) { |
1584 Handle<Context> constructor_context; | 1583 Handle<Context> constructor_context; |
1585 ASSIGN_RETURN_ON_EXCEPTION( | 1584 ASSIGN_RETURN_ON_EXCEPTION( |
1586 isolate, constructor_context, | 1585 isolate, constructor_context, |
1587 JSReceiver::GetFunctionRealm(Handle<JSReceiver>::cast(constructor)), | 1586 JSReceiver::GetFunctionRealm(Handle<JSReceiver>::cast(constructor)), |
1588 Object); | 1587 Object); |
1589 if (*constructor_context != *native_context && | 1588 if (*constructor_context != *isolate->native_context() && |
1590 *constructor == constructor_context->array_function()) { | 1589 *constructor == constructor_context->array_function()) { |
1591 constructor = isolate->factory()->undefined_value(); | 1590 constructor = isolate->factory()->undefined_value(); |
1592 } | 1591 } |
1593 } | 1592 } |
1594 if (constructor->IsJSReceiver()) { | 1593 if (constructor->IsJSReceiver()) { |
1595 ASSIGN_RETURN_ON_EXCEPTION( | 1594 ASSIGN_RETURN_ON_EXCEPTION( |
1596 isolate, constructor, | 1595 isolate, constructor, |
1597 JSReceiver::GetProperty(Handle<JSReceiver>::cast(constructor), | 1596 JSReceiver::GetProperty(Handle<JSReceiver>::cast(constructor), |
1598 isolate->factory()->species_symbol()), | 1597 isolate->factory()->species_symbol()), |
1599 Object); | 1598 Object); |
(...skipping 2547 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4147 MAYBE_RETURN_NULL(SetProperty(&it, value, language_mode, store_mode)); | 4146 MAYBE_RETURN_NULL(SetProperty(&it, value, language_mode, store_mode)); |
4148 return value; | 4147 return value; |
4149 } | 4148 } |
4150 | 4149 |
4151 | 4150 |
4152 Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, | 4151 Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, |
4153 Handle<Object> value, | 4152 Handle<Object> value, |
4154 LanguageMode language_mode, | 4153 LanguageMode language_mode, |
4155 StoreFromKeyed store_mode, | 4154 StoreFromKeyed store_mode, |
4156 bool* found) { | 4155 bool* found) { |
| 4156 it->UpdateProtector(); |
4157 DCHECK(it->IsFound()); | 4157 DCHECK(it->IsFound()); |
4158 ShouldThrow should_throw = | 4158 ShouldThrow should_throw = |
4159 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4159 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
4160 | 4160 |
4161 // Make sure that the top context does not change when doing callbacks or | 4161 // Make sure that the top context does not change when doing callbacks or |
4162 // interceptor calls. | 4162 // interceptor calls. |
4163 AssertNoContextChange ncc(it->isolate()); | 4163 AssertNoContextChange ncc(it->isolate()); |
4164 | 4164 |
4165 do { | 4165 do { |
4166 switch (it->state()) { | 4166 switch (it->state()) { |
(...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4229 } while (it->IsFound()); | 4229 } while (it->IsFound()); |
4230 | 4230 |
4231 *found = false; | 4231 *found = false; |
4232 return Nothing<bool>(); | 4232 return Nothing<bool>(); |
4233 } | 4233 } |
4234 | 4234 |
4235 | 4235 |
4236 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, | 4236 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, |
4237 LanguageMode language_mode, | 4237 LanguageMode language_mode, |
4238 StoreFromKeyed store_mode) { | 4238 StoreFromKeyed store_mode) { |
4239 it->UpdateProtector(); | |
4240 if (it->IsFound()) { | 4239 if (it->IsFound()) { |
4241 bool found = true; | 4240 bool found = true; |
4242 Maybe<bool> result = | 4241 Maybe<bool> result = |
4243 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4242 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
4244 if (found) return result; | 4243 if (found) return result; |
4245 } | 4244 } |
4246 | 4245 |
4247 // If the receiver is the JSGlobalObject, the store was contextual. In case | 4246 // If the receiver is the JSGlobalObject, the store was contextual. In case |
4248 // the property did not exist yet on the global object itself, we have to | 4247 // the property did not exist yet on the global object itself, we have to |
4249 // throw a reference error in strict mode. In sloppy mode, we continue. | 4248 // throw a reference error in strict mode. In sloppy mode, we continue. |
4250 if (is_strict(language_mode) && it->GetReceiver()->IsJSGlobalObject()) { | 4249 if (is_strict(language_mode) && it->GetReceiver()->IsJSGlobalObject()) { |
4251 it->isolate()->Throw(*it->isolate()->factory()->NewReferenceError( | 4250 it->isolate()->Throw(*it->isolate()->factory()->NewReferenceError( |
4252 MessageTemplate::kNotDefined, it->name())); | 4251 MessageTemplate::kNotDefined, it->name())); |
4253 return Nothing<bool>(); | 4252 return Nothing<bool>(); |
4254 } | 4253 } |
4255 | 4254 |
4256 ShouldThrow should_throw = | 4255 ShouldThrow should_throw = |
4257 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4256 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
4258 return AddDataProperty(it, value, NONE, should_throw, store_mode); | 4257 return AddDataProperty(it, value, NONE, should_throw, store_mode); |
4259 } | 4258 } |
4260 | 4259 |
4261 | 4260 |
4262 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, | 4261 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, |
4263 LanguageMode language_mode, | 4262 LanguageMode language_mode, |
4264 StoreFromKeyed store_mode) { | 4263 StoreFromKeyed store_mode) { |
4265 Isolate* isolate = it->isolate(); | 4264 Isolate* isolate = it->isolate(); |
4266 | 4265 |
4267 it->UpdateProtector(); | |
4268 if (it->IsFound()) { | 4266 if (it->IsFound()) { |
4269 bool found = true; | 4267 bool found = true; |
4270 Maybe<bool> result = | 4268 Maybe<bool> result = |
4271 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4269 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
4272 if (found) return result; | 4270 if (found) return result; |
4273 } | 4271 } |
4274 | 4272 |
| 4273 it->UpdateProtector(); |
| 4274 |
4275 // The property either doesn't exist on the holder or exists there as a data | 4275 // The property either doesn't exist on the holder or exists there as a data |
4276 // property. | 4276 // property. |
4277 | 4277 |
4278 ShouldThrow should_throw = | 4278 ShouldThrow should_throw = |
4279 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4279 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
4280 | 4280 |
4281 if (!it->GetReceiver()->IsJSReceiver()) { | 4281 if (!it->GetReceiver()->IsJSReceiver()) { |
4282 return WriteToReadOnlyProperty(it, value, should_throw); | 4282 return WriteToReadOnlyProperty(it, value, should_throw); |
4283 } | 4283 } |
4284 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(it->GetReceiver()); | 4284 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(it->GetReceiver()); |
(...skipping 200 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4485 if (FLAG_trace_js_array_abuse && !array->HasFixedTypedArrayElements()) { | 4485 if (FLAG_trace_js_array_abuse && !array->HasFixedTypedArrayElements()) { |
4486 CheckArrayAbuse(array, "elements write", it->index(), false); | 4486 CheckArrayAbuse(array, "elements write", it->index(), false); |
4487 } | 4487 } |
4488 } | 4488 } |
4489 | 4489 |
4490 Maybe<bool> result = JSObject::AddDataElement(receiver, it->index(), value, | 4490 Maybe<bool> result = JSObject::AddDataElement(receiver, it->index(), value, |
4491 attributes, should_throw); | 4491 attributes, should_throw); |
4492 JSObject::ValidateElements(receiver); | 4492 JSObject::ValidateElements(receiver); |
4493 return result; | 4493 return result; |
4494 } else { | 4494 } else { |
| 4495 it->UpdateProtector(); |
4495 // Migrate to the most up-to-date map that will be able to store |value| | 4496 // Migrate to the most up-to-date map that will be able to store |value| |
4496 // under it->name() with |attributes|. | 4497 // under it->name() with |attributes|. |
4497 it->PrepareTransitionToDataProperty(receiver, value, attributes, | 4498 it->PrepareTransitionToDataProperty(receiver, value, attributes, |
4498 store_mode); | 4499 store_mode); |
4499 DCHECK_EQ(LookupIterator::TRANSITION, it->state()); | 4500 DCHECK_EQ(LookupIterator::TRANSITION, it->state()); |
4500 it->ApplyTransitionToDataProperty(receiver); | 4501 it->ApplyTransitionToDataProperty(receiver); |
4501 | 4502 |
4502 // TODO(verwaest): Encapsulate dictionary handling better. | 4503 // TODO(verwaest): Encapsulate dictionary handling better. |
4503 if (receiver->map()->is_dictionary_map()) { | 4504 if (receiver->map()->is_dictionary_map()) { |
4504 // TODO(dcarney): just populate TransitionPropertyCell here? | 4505 // TODO(dcarney): just populate TransitionPropertyCell here? |
(...skipping 13768 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18273 if (cell->value() != *new_value) { | 18274 if (cell->value() != *new_value) { |
18274 cell->set_value(*new_value); | 18275 cell->set_value(*new_value); |
18275 Isolate* isolate = cell->GetIsolate(); | 18276 Isolate* isolate = cell->GetIsolate(); |
18276 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18277 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18277 isolate, DependentCode::kPropertyCellChangedGroup); | 18278 isolate, DependentCode::kPropertyCellChangedGroup); |
18278 } | 18279 } |
18279 } | 18280 } |
18280 | 18281 |
18281 } // namespace internal | 18282 } // namespace internal |
18282 } // namespace v8 | 18283 } // namespace v8 |
OLD | NEW |