| 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 4113 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4124 MAYBE_RETURN_NULL(SetProperty(&it, value, language_mode, store_mode)); | 4124 MAYBE_RETURN_NULL(SetProperty(&it, value, language_mode, store_mode)); |
| 4125 return value; | 4125 return value; |
| 4126 } | 4126 } |
| 4127 | 4127 |
| 4128 | 4128 |
| 4129 Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, | 4129 Maybe<bool> Object::SetPropertyInternal(LookupIterator* it, |
| 4130 Handle<Object> value, | 4130 Handle<Object> value, |
| 4131 LanguageMode language_mode, | 4131 LanguageMode language_mode, |
| 4132 StoreFromKeyed store_mode, | 4132 StoreFromKeyed store_mode, |
| 4133 bool* found) { | 4133 bool* found) { |
| 4134 it->UpdateProtector(); | 4134 DCHECK(it->IsFound()); |
| 4135 ShouldThrow should_throw = | 4135 ShouldThrow should_throw = |
| 4136 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4136 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4137 | 4137 |
| 4138 // Make sure that the top context does not change when doing callbacks or | 4138 // Make sure that the top context does not change when doing callbacks or |
| 4139 // interceptor calls. | 4139 // interceptor calls. |
| 4140 AssertNoContextChange ncc(it->isolate()); | 4140 AssertNoContextChange ncc(it->isolate()); |
| 4141 | 4141 |
| 4142 for (; it->IsFound(); it->Next()) { | 4142 do { |
| 4143 switch (it->state()) { | 4143 switch (it->state()) { |
| 4144 case LookupIterator::NOT_FOUND: | 4144 case LookupIterator::NOT_FOUND: |
| 4145 UNREACHABLE(); | 4145 UNREACHABLE(); |
| 4146 | 4146 |
| 4147 case LookupIterator::ACCESS_CHECK: | 4147 case LookupIterator::ACCESS_CHECK: |
| 4148 if (it->HasAccess()) break; | 4148 if (it->HasAccess()) break; |
| 4149 // Check whether it makes sense to reuse the lookup iterator. Here it | 4149 // Check whether it makes sense to reuse the lookup iterator. Here it |
| 4150 // might still call into setters up the prototype chain. | 4150 // might still call into setters up the prototype chain. |
| 4151 return JSObject::SetPropertyWithFailedAccessCheck(it, value, | 4151 return JSObject::SetPropertyWithFailedAccessCheck(it, value, |
| 4152 should_throw); | 4152 should_throw); |
| (...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4195 return WriteToReadOnlyProperty(it, value, should_throw); | 4195 return WriteToReadOnlyProperty(it, value, should_throw); |
| 4196 } | 4196 } |
| 4197 if (it->HolderIsReceiverOrHiddenPrototype()) { | 4197 if (it->HolderIsReceiverOrHiddenPrototype()) { |
| 4198 return SetDataProperty(it, value); | 4198 return SetDataProperty(it, value); |
| 4199 } | 4199 } |
| 4200 // Fall through. | 4200 // Fall through. |
| 4201 case LookupIterator::TRANSITION: | 4201 case LookupIterator::TRANSITION: |
| 4202 *found = false; | 4202 *found = false; |
| 4203 return Nothing<bool>(); | 4203 return Nothing<bool>(); |
| 4204 } | 4204 } |
| 4205 } | 4205 it->Next(); |
| 4206 } while (it->IsFound()); |
| 4206 | 4207 |
| 4207 *found = false; | 4208 *found = false; |
| 4208 return Nothing<bool>(); | 4209 return Nothing<bool>(); |
| 4209 } | 4210 } |
| 4210 | 4211 |
| 4211 | 4212 |
| 4212 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, | 4213 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, |
| 4213 LanguageMode language_mode, | 4214 LanguageMode language_mode, |
| 4214 StoreFromKeyed store_mode) { | 4215 StoreFromKeyed store_mode) { |
| 4215 bool found = true; | 4216 it->UpdateProtector(); |
| 4216 Maybe<bool> result = | 4217 if (it->IsFound()) { |
| 4217 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4218 bool found = true; |
| 4218 if (found) return result; | 4219 Maybe<bool> result = |
| 4220 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
| 4221 if (found) return result; |
| 4222 } |
| 4219 | 4223 |
| 4220 // If the receiver is the JSGlobalObject, the store was contextual. In case | 4224 // If the receiver is the JSGlobalObject, the store was contextual. In case |
| 4221 // the property did not exist yet on the global object itself, we have to | 4225 // the property did not exist yet on the global object itself, we have to |
| 4222 // throw a reference error in strict mode. In sloppy mode, we continue. | 4226 // throw a reference error in strict mode. In sloppy mode, we continue. |
| 4223 if (is_strict(language_mode) && it->GetReceiver()->IsJSGlobalObject()) { | 4227 if (is_strict(language_mode) && it->GetReceiver()->IsJSGlobalObject()) { |
| 4224 it->isolate()->Throw(*it->isolate()->factory()->NewReferenceError( | 4228 it->isolate()->Throw(*it->isolate()->factory()->NewReferenceError( |
| 4225 MessageTemplate::kNotDefined, it->name())); | 4229 MessageTemplate::kNotDefined, it->name())); |
| 4226 return Nothing<bool>(); | 4230 return Nothing<bool>(); |
| 4227 } | 4231 } |
| 4228 | 4232 |
| 4229 ShouldThrow should_throw = | 4233 ShouldThrow should_throw = |
| 4230 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4234 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4231 return AddDataProperty(it, value, NONE, should_throw, store_mode); | 4235 return AddDataProperty(it, value, NONE, should_throw, store_mode); |
| 4232 } | 4236 } |
| 4233 | 4237 |
| 4234 | 4238 |
| 4235 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, | 4239 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, |
| 4236 LanguageMode language_mode, | 4240 LanguageMode language_mode, |
| 4237 StoreFromKeyed store_mode) { | 4241 StoreFromKeyed store_mode) { |
| 4238 Isolate* isolate = it->isolate(); | 4242 Isolate* isolate = it->isolate(); |
| 4239 | 4243 |
| 4240 bool found = true; | 4244 it->UpdateProtector(); |
| 4241 Maybe<bool> result = | 4245 if (it->IsFound()) { |
| 4242 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4246 bool found = true; |
| 4243 if (found) return result; | 4247 Maybe<bool> result = |
| 4248 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
| 4249 if (found) return result; |
| 4250 } |
| 4244 | 4251 |
| 4245 // The property either doesn't exist on the holder or exists there as a data | 4252 // The property either doesn't exist on the holder or exists there as a data |
| 4246 // property. | 4253 // property. |
| 4247 | 4254 |
| 4248 ShouldThrow should_throw = | 4255 ShouldThrow should_throw = |
| 4249 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4256 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4250 | 4257 |
| 4251 if (!it->GetReceiver()->IsJSReceiver()) { | 4258 if (!it->GetReceiver()->IsJSReceiver()) { |
| 4252 return WriteToReadOnlyProperty(it, value, should_throw); | 4259 return WriteToReadOnlyProperty(it, value, should_throw); |
| 4253 } | 4260 } |
| (...skipping 54 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 4308 return JSReceiver::DefineOwnProperty(isolate, receiver, it->GetName(), | 4315 return JSReceiver::DefineOwnProperty(isolate, receiver, it->GetName(), |
| 4309 &value_desc, should_throw); | 4316 &value_desc, should_throw); |
| 4310 } | 4317 } |
| 4311 | 4318 |
| 4312 case LookupIterator::NOT_FOUND: | 4319 case LookupIterator::NOT_FOUND: |
| 4313 case LookupIterator::TRANSITION: | 4320 case LookupIterator::TRANSITION: |
| 4314 UNREACHABLE(); | 4321 UNREACHABLE(); |
| 4315 } | 4322 } |
| 4316 } | 4323 } |
| 4317 | 4324 |
| 4318 return JSObject::AddDataProperty(&own_lookup, value, NONE, should_throw, | 4325 return AddDataProperty(&own_lookup, value, NONE, should_throw, store_mode); |
| 4319 store_mode); | |
| 4320 } | 4326 } |
| 4321 | 4327 |
| 4322 MaybeHandle<Object> Object::ReadAbsentProperty(LookupIterator* it) { | 4328 MaybeHandle<Object> Object::ReadAbsentProperty(LookupIterator* it) { |
| 4323 return it->isolate()->factory()->undefined_value(); | 4329 return it->isolate()->factory()->undefined_value(); |
| 4324 } | 4330 } |
| 4325 | 4331 |
| 4326 MaybeHandle<Object> Object::ReadAbsentProperty(Isolate* isolate, | 4332 MaybeHandle<Object> Object::ReadAbsentProperty(Isolate* isolate, |
| 4327 Handle<Object> receiver, | 4333 Handle<Object> receiver, |
| 4328 Handle<Object> name) { | 4334 Handle<Object> name) { |
| 4329 return isolate->factory()->undefined_value(); | 4335 return isolate->factory()->undefined_value(); |
| (...skipping 15435 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 19765 if (cell->value() != *new_value) { | 19771 if (cell->value() != *new_value) { |
| 19766 cell->set_value(*new_value); | 19772 cell->set_value(*new_value); |
| 19767 Isolate* isolate = cell->GetIsolate(); | 19773 Isolate* isolate = cell->GetIsolate(); |
| 19768 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19774 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19769 isolate, DependentCode::kPropertyCellChangedGroup); | 19775 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19770 } | 19776 } |
| 19771 } | 19777 } |
| 19772 | 19778 |
| 19773 } // namespace internal | 19779 } // namespace internal |
| 19774 } // namespace v8 | 19780 } // namespace v8 |
| OLD | NEW |