Chromium Code Reviews| 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 818 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 829 Handle<Name> name, | 829 Handle<Name> name, |
| 830 Handle<Object> receiver, | 830 Handle<Object> receiver, |
| 831 LanguageMode language_mode) { | 831 LanguageMode language_mode) { |
| 832 if (receiver->IsJSGlobalObject()) { | 832 if (receiver->IsJSGlobalObject()) { |
| 833 THROW_NEW_ERROR( | 833 THROW_NEW_ERROR( |
| 834 isolate, | 834 isolate, |
| 835 NewTypeError(MessageTemplate::kReadGlobalReferenceThroughProxy, name), | 835 NewTypeError(MessageTemplate::kReadGlobalReferenceThroughProxy, name), |
| 836 Object); | 836 Object); |
| 837 } | 837 } |
| 838 | 838 |
| 839 DCHECK(!name->IsPrivate()); | |
| 839 STACK_CHECK(MaybeHandle<Object>()); | 840 STACK_CHECK(MaybeHandle<Object>()); |
| 840 Handle<Name> trap_name = isolate->factory()->get_string(); | 841 Handle<Name> trap_name = isolate->factory()->get_string(); |
| 841 // 1. Assert: IsPropertyKey(P) is true. | 842 // 1. Assert: IsPropertyKey(P) is true. |
| 842 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 843 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
| 843 Handle<Object> handler(proxy->handler(), isolate); | 844 Handle<Object> handler(proxy->handler(), isolate); |
| 844 // 3. If handler is null, throw a TypeError exception. | 845 // 3. If handler is null, throw a TypeError exception. |
| 845 // 4. Assert: Type(handler) is Object. | 846 // 4. Assert: Type(handler) is Object. |
| 846 if (proxy->IsRevoked()) { | 847 if (proxy->IsRevoked()) { |
| 847 THROW_NEW_ERROR(isolate, | 848 THROW_NEW_ERROR(isolate, |
| 848 NewTypeError(MessageTemplate::kProxyRevoked, trap_name), | 849 NewTypeError(MessageTemplate::kProxyRevoked, trap_name), |
| (...skipping 3161 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4010 | 4011 |
| 4011 if (it->IsElement()) { | 4012 if (it->IsElement()) { |
| 4012 uint32_t index = it->index(); | 4013 uint32_t index = it->index(); |
| 4013 v8::IndexedPropertySetterCallback setter = | 4014 v8::IndexedPropertySetterCallback setter = |
| 4014 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); | 4015 v8::ToCData<v8::IndexedPropertySetterCallback>(interceptor->setter()); |
| 4015 LOG(isolate, | 4016 LOG(isolate, |
| 4016 ApiIndexedPropertyAccess("interceptor-indexed-set", *holder, index)); | 4017 ApiIndexedPropertyAccess("interceptor-indexed-set", *holder, index)); |
| 4017 result = args.Call(setter, index, v8::Utils::ToLocal(value)); | 4018 result = args.Call(setter, index, v8::Utils::ToLocal(value)); |
| 4018 } else { | 4019 } else { |
| 4019 Handle<Name> name = it->name(); | 4020 Handle<Name> name = it->name(); |
| 4021 DCHECK(!name->IsPrivate()); | |
| 4020 | 4022 |
| 4021 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | 4023 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 4022 return Just(false); | 4024 return Just(false); |
| 4023 } | 4025 } |
| 4024 | 4026 |
| 4025 v8::GenericNamedPropertySetterCallback setter = | 4027 v8::GenericNamedPropertySetterCallback setter = |
| 4026 v8::ToCData<v8::GenericNamedPropertySetterCallback>( | 4028 v8::ToCData<v8::GenericNamedPropertySetterCallback>( |
| 4027 interceptor->setter()); | 4029 interceptor->setter()); |
| 4028 LOG(it->isolate(), | 4030 LOG(it->isolate(), |
| 4029 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); | 4031 ApiNamedPropertyAccess("interceptor-named-set", *holder, *name)); |
| (...skipping 120 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4150 | 4152 |
| 4151 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, | 4153 Maybe<bool> Object::SetProperty(LookupIterator* it, Handle<Object> value, |
| 4152 LanguageMode language_mode, | 4154 LanguageMode language_mode, |
| 4153 StoreFromKeyed store_mode) { | 4155 StoreFromKeyed store_mode) { |
| 4154 bool found = false; | 4156 bool found = false; |
| 4155 Maybe<bool> result = | 4157 Maybe<bool> result = |
| 4156 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4158 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
| 4157 if (found) return result; | 4159 if (found) return result; |
| 4158 ShouldThrow should_throw = | 4160 ShouldThrow should_throw = |
| 4159 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4161 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4162 if (it->GetReceiver()->IsJSProxy() && it->GetName()->IsPrivate()) { | |
| 4163 RETURN_FAILURE(it->isolate(), should_throw, | |
| 4164 NewTypeError(MessageTemplate::kProxyPrivate)); | |
| 4165 } | |
| 4160 return AddDataProperty(it, value, NONE, should_throw, store_mode); | 4166 return AddDataProperty(it, value, NONE, should_throw, store_mode); |
| 4161 } | 4167 } |
| 4162 | 4168 |
| 4163 | 4169 |
| 4164 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, | 4170 Maybe<bool> Object::SetSuperProperty(LookupIterator* it, Handle<Object> value, |
| 4165 LanguageMode language_mode, | 4171 LanguageMode language_mode, |
| 4166 StoreFromKeyed store_mode) { | 4172 StoreFromKeyed store_mode) { |
| 4167 ShouldThrow should_throw = | 4173 ShouldThrow should_throw = |
| 4168 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4174 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4169 Isolate* isolate = it->isolate(); | 4175 Isolate* isolate = it->isolate(); |
| 4170 | 4176 |
| 4171 bool found = false; | 4177 bool found = false; |
| 4172 Maybe<bool> result = | 4178 Maybe<bool> result = |
| 4173 SetPropertyInternal(it, value, language_mode, store_mode, &found); | 4179 SetPropertyInternal(it, value, language_mode, store_mode, &found); |
| 4174 if (found) return result; | 4180 if (found) return result; |
| 4181 if (it->GetReceiver()->IsJSProxy() && it->GetName()->IsPrivate()) { | |
| 4182 RETURN_FAILURE(isolate, should_throw, | |
| 4183 NewTypeError(MessageTemplate::kProxyPrivate)); | |
| 4184 } | |
| 4175 | 4185 |
| 4176 // The property either doesn't exist on the holder or exists there as a data | 4186 // The property either doesn't exist on the holder or exists there as a data |
| 4177 // property. | 4187 // property. |
| 4178 | 4188 |
| 4179 if (!it->GetReceiver()->IsJSReceiver()) { | 4189 if (!it->GetReceiver()->IsJSReceiver()) { |
| 4180 return WriteToReadOnlyProperty(it, value, should_throw); | 4190 return WriteToReadOnlyProperty(it, value, should_throw); |
| 4181 } | 4191 } |
| 4182 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(it->GetReceiver()); | 4192 Handle<JSReceiver> receiver = Handle<JSReceiver>::cast(it->GetReceiver()); |
| 4183 | 4193 |
| 4184 LookupIterator::Configuration c = LookupIterator::OWN; | 4194 LookupIterator::Configuration c = LookupIterator::OWN; |
| (...skipping 641 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4826 | 4836 |
| 4827 void JSProxy::Revoke(Handle<JSProxy> proxy) { | 4837 void JSProxy::Revoke(Handle<JSProxy> proxy) { |
| 4828 Isolate* isolate = proxy->GetIsolate(); | 4838 Isolate* isolate = proxy->GetIsolate(); |
| 4829 if (!proxy->IsRevoked()) proxy->set_handler(isolate->heap()->null_value()); | 4839 if (!proxy->IsRevoked()) proxy->set_handler(isolate->heap()->null_value()); |
| 4830 DCHECK(proxy->IsRevoked()); | 4840 DCHECK(proxy->IsRevoked()); |
| 4831 } | 4841 } |
| 4832 | 4842 |
| 4833 | 4843 |
| 4834 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, | 4844 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, |
| 4835 Handle<Name> name) { | 4845 Handle<Name> name) { |
| 4846 DCHECK(!name->IsPrivate()); | |
| 4836 STACK_CHECK(Nothing<bool>()); | 4847 STACK_CHECK(Nothing<bool>()); |
| 4837 // 1. (Assert) | 4848 // 1. (Assert) |
| 4838 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 4849 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
| 4839 Handle<Object> handler(proxy->handler(), isolate); | 4850 Handle<Object> handler(proxy->handler(), isolate); |
| 4840 // 3. If handler is null, throw a TypeError exception. | 4851 // 3. If handler is null, throw a TypeError exception. |
| 4841 // 4. Assert: Type(handler) is Object. | 4852 // 4. Assert: Type(handler) is Object. |
| 4842 if (proxy->IsRevoked()) { | 4853 if (proxy->IsRevoked()) { |
| 4843 isolate->Throw(*isolate->factory()->NewTypeError( | 4854 isolate->Throw(*isolate->factory()->NewTypeError( |
| 4844 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); | 4855 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); |
| 4845 return Nothing<bool>(); | 4856 return Nothing<bool>(); |
| 4846 } | 4857 } |
| 4847 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. | 4858 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. |
| 4848 Handle<JSReceiver> target(proxy->target(), isolate); | 4859 Handle<JSReceiver> target(proxy->target(), isolate); |
| 4849 // 6. Let trap be ? GetMethod(handler, "has"). | 4860 // 6. Let trap be ? GetMethod(handler, "has"). |
| 4850 Handle<Object> trap; | 4861 Handle<Object> trap; |
| 4851 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 4862 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 4852 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler), | 4863 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler), |
| 4853 isolate->factory()->has_string()), | 4864 isolate->factory()->has_string()), |
| 4854 Nothing<bool>()); | 4865 Nothing<bool>()); |
| 4855 // 7. If trap is undefined, then | 4866 // 7. If trap is undefined, then |
| 4856 if (trap->IsUndefined()) { | 4867 if (trap->IsUndefined()) { |
| 4857 // 7a. Return target.[[HasProperty]](P). | 4868 // 7a. Return target.[[HasProperty]](P). |
| 4858 return JSReceiver::HasProperty(target, name); | 4869 return JSReceiver::HasProperty(target, name); |
| 4859 } | 4870 } |
| 4871 // Do not leak private property names. | |
| 4872 if (name->IsPrivate()) return Just(false); | |
|
Jakob Kummerow
2016/01/11 17:40:27
According to the DCHECK above, this can never be t
| |
| 4860 // 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)). | 4873 // 8. Let booleanTrapResult be ToBoolean(? Call(trap, handler, «target, P»)). |
| 4861 Handle<Object> trap_result_obj; | 4874 Handle<Object> trap_result_obj; |
| 4862 Handle<Object> args[] = {target, name}; | 4875 Handle<Object> args[] = {target, name}; |
| 4863 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 4876 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 4864 isolate, trap_result_obj, | 4877 isolate, trap_result_obj, |
| 4865 Execution::Call(isolate, trap, handler, arraysize(args), args), | 4878 Execution::Call(isolate, trap, handler, arraysize(args), args), |
| 4866 Nothing<bool>()); | 4879 Nothing<bool>()); |
| 4867 bool boolean_trap_result = trap_result_obj->BooleanValue(); | 4880 bool boolean_trap_result = trap_result_obj->BooleanValue(); |
| 4868 // 9. If booleanTrapResult is false, then: | 4881 // 9. If booleanTrapResult is false, then: |
| 4869 if (!boolean_trap_result) { | 4882 if (!boolean_trap_result) { |
| (...skipping 23 matching lines...) Expand all Loading... | |
| 4893 } | 4906 } |
| 4894 } | 4907 } |
| 4895 // 10. Return booleanTrapResult. | 4908 // 10. Return booleanTrapResult. |
| 4896 return Just(boolean_trap_result); | 4909 return Just(boolean_trap_result); |
| 4897 } | 4910 } |
| 4898 | 4911 |
| 4899 | 4912 |
| 4900 Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name, | 4913 Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name, |
| 4901 Handle<Object> value, Handle<Object> receiver, | 4914 Handle<Object> value, Handle<Object> receiver, |
| 4902 LanguageMode language_mode) { | 4915 LanguageMode language_mode) { |
| 4916 DCHECK(!name->IsPrivate()); | |
| 4903 Isolate* isolate = proxy->GetIsolate(); | 4917 Isolate* isolate = proxy->GetIsolate(); |
| 4904 STACK_CHECK(Nothing<bool>()); | 4918 STACK_CHECK(Nothing<bool>()); |
| 4905 Factory* factory = isolate->factory(); | 4919 Factory* factory = isolate->factory(); |
| 4906 Handle<String> trap_name = factory->set_string(); | 4920 Handle<String> trap_name = factory->set_string(); |
| 4907 ShouldThrow should_throw = | 4921 ShouldThrow should_throw = |
| 4908 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4922 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4909 | 4923 |
| 4910 if (proxy->IsRevoked()) { | 4924 if (proxy->IsRevoked()) { |
| 4911 isolate->Throw( | 4925 isolate->Throw( |
| 4912 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); | 4926 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); |
| (...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 4961 return Nothing<bool>(); | 4975 return Nothing<bool>(); |
| 4962 } | 4976 } |
| 4963 } | 4977 } |
| 4964 return Just(true); | 4978 return Just(true); |
| 4965 } | 4979 } |
| 4966 | 4980 |
| 4967 | 4981 |
| 4968 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, | 4982 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, |
| 4969 Handle<Name> name, | 4983 Handle<Name> name, |
| 4970 LanguageMode language_mode) { | 4984 LanguageMode language_mode) { |
| 4985 DCHECK(!name->IsPrivate()); | |
| 4971 ShouldThrow should_throw = | 4986 ShouldThrow should_throw = |
| 4972 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4987 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
| 4973 Isolate* isolate = proxy->GetIsolate(); | 4988 Isolate* isolate = proxy->GetIsolate(); |
| 4974 STACK_CHECK(Nothing<bool>()); | 4989 STACK_CHECK(Nothing<bool>()); |
| 4975 Factory* factory = isolate->factory(); | 4990 Factory* factory = isolate->factory(); |
| 4976 Handle<String> trap_name = factory->deleteProperty_string(); | 4991 Handle<String> trap_name = factory->deleteProperty_string(); |
| 4977 | 4992 |
| 4978 if (proxy->IsRevoked()) { | 4993 if (proxy->IsRevoked()) { |
| 4979 isolate->Throw( | 4994 isolate->Throw( |
| 4980 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); | 4995 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); |
| (...skipping 400 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 5381 v8::Local<v8::Integer> result; | 5396 v8::Local<v8::Integer> result; |
| 5382 if (it->IsElement()) { | 5397 if (it->IsElement()) { |
| 5383 uint32_t index = it->index(); | 5398 uint32_t index = it->index(); |
| 5384 v8::IndexedPropertyQueryCallback query = | 5399 v8::IndexedPropertyQueryCallback query = |
| 5385 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); | 5400 v8::ToCData<v8::IndexedPropertyQueryCallback>(interceptor->query()); |
| 5386 LOG(isolate, | 5401 LOG(isolate, |
| 5387 ApiIndexedPropertyAccess("interceptor-indexed-has", *holder, index)); | 5402 ApiIndexedPropertyAccess("interceptor-indexed-has", *holder, index)); |
| 5388 result = args.Call(query, index); | 5403 result = args.Call(query, index); |
| 5389 } else { | 5404 } else { |
| 5390 Handle<Name> name = it->name(); | 5405 Handle<Name> name = it->name(); |
| 5406 DCHECK(!name->IsPrivate()); | |
| 5391 v8::GenericNamedPropertyQueryCallback query = | 5407 v8::GenericNamedPropertyQueryCallback query = |
| 5392 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( | 5408 v8::ToCData<v8::GenericNamedPropertyQueryCallback>( |
| 5393 interceptor->query()); | 5409 interceptor->query()); |
| 5394 LOG(isolate, | 5410 LOG(isolate, |
| 5395 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); | 5411 ApiNamedPropertyAccess("interceptor-named-has", *holder, *name)); |
| 5396 result = args.Call(query, v8::Utils::ToLocal(name)); | 5412 result = args.Call(query, v8::Utils::ToLocal(name)); |
| 5397 } | 5413 } |
| 5398 if (!result.IsEmpty()) { | 5414 if (!result.IsEmpty()) { |
| 5399 DCHECK(result->IsInt32()); | 5415 DCHECK(result->IsInt32()); |
| 5400 return Just(static_cast<PropertyAttributes>( | 5416 return Just(static_cast<PropertyAttributes>( |
| 5401 result->Int32Value(reinterpret_cast<v8::Isolate*>(isolate) | 5417 result->Int32Value(reinterpret_cast<v8::Isolate*>(isolate) |
| 5402 ->GetCurrentContext()).FromJust())); | 5418 ->GetCurrentContext()).FromJust())); |
| 5403 } | 5419 } |
| 5404 } else if (!interceptor->getter()->IsUndefined()) { | 5420 } else if (!interceptor->getter()->IsUndefined()) { |
| 5405 // TODO(verwaest): Use GetPropertyWithInterceptor? | 5421 // TODO(verwaest): Use GetPropertyWithInterceptor? |
| 5406 v8::Local<v8::Value> result; | 5422 v8::Local<v8::Value> result; |
| 5407 if (it->IsElement()) { | 5423 if (it->IsElement()) { |
| 5408 uint32_t index = it->index(); | 5424 uint32_t index = it->index(); |
| 5409 v8::IndexedPropertyGetterCallback getter = | 5425 v8::IndexedPropertyGetterCallback getter = |
| 5410 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 5426 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 5411 LOG(isolate, ApiIndexedPropertyAccess("interceptor-indexed-get-has", | 5427 LOG(isolate, ApiIndexedPropertyAccess("interceptor-indexed-get-has", |
| 5412 *holder, index)); | 5428 *holder, index)); |
| 5413 result = args.Call(getter, index); | 5429 result = args.Call(getter, index); |
| 5414 } else { | 5430 } else { |
| 5415 Handle<Name> name = it->name(); | 5431 Handle<Name> name = it->name(); |
| 5416 | 5432 DCHECK(!name->IsPrivate()); |
| 5417 v8::GenericNamedPropertyGetterCallback getter = | 5433 v8::GenericNamedPropertyGetterCallback getter = |
| 5418 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 5434 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 5419 interceptor->getter()); | 5435 interceptor->getter()); |
| 5420 LOG(isolate, | 5436 LOG(isolate, |
| 5421 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); | 5437 ApiNamedPropertyAccess("interceptor-named-get-has", *holder, *name)); |
| 5422 result = args.Call(getter, v8::Utils::ToLocal(name)); | 5438 result = args.Call(getter, v8::Utils::ToLocal(name)); |
| 5423 } | 5439 } |
| 5424 if (!result.IsEmpty()) return Just(DONT_ENUM); | 5440 if (!result.IsEmpty()) return Just(DONT_ENUM); |
| 5425 } | 5441 } |
| 5426 | 5442 |
| (...skipping 723 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6150 uint32_t index = it->index(); | 6166 uint32_t index = it->index(); |
| 6151 v8::IndexedPropertyDeleterCallback deleter = | 6167 v8::IndexedPropertyDeleterCallback deleter = |
| 6152 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); | 6168 v8::ToCData<v8::IndexedPropertyDeleterCallback>(interceptor->deleter()); |
| 6153 LOG(isolate, | 6169 LOG(isolate, |
| 6154 ApiIndexedPropertyAccess("interceptor-indexed-delete", *holder, index)); | 6170 ApiIndexedPropertyAccess("interceptor-indexed-delete", *holder, index)); |
| 6155 result = args.Call(deleter, index); | 6171 result = args.Call(deleter, index); |
| 6156 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { | 6172 } else if (it->name()->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 6157 return Nothing<bool>(); | 6173 return Nothing<bool>(); |
| 6158 } else { | 6174 } else { |
| 6159 Handle<Name> name = it->name(); | 6175 Handle<Name> name = it->name(); |
| 6176 DCHECK(!name->IsPrivate()); | |
| 6160 v8::GenericNamedPropertyDeleterCallback deleter = | 6177 v8::GenericNamedPropertyDeleterCallback deleter = |
| 6161 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( | 6178 v8::ToCData<v8::GenericNamedPropertyDeleterCallback>( |
| 6162 interceptor->deleter()); | 6179 interceptor->deleter()); |
| 6163 LOG(isolate, | 6180 LOG(isolate, |
| 6164 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); | 6181 ApiNamedPropertyAccess("interceptor-named-delete", *holder, *name)); |
| 6165 result = args.Call(deleter, v8::Utils::ToLocal(name)); | 6182 result = args.Call(deleter, v8::Utils::ToLocal(name)); |
| 6166 } | 6183 } |
| 6167 | 6184 |
| 6168 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); | 6185 RETURN_VALUE_IF_SCHEDULED_EXCEPTION(isolate, Nothing<bool>()); |
| 6169 if (result.IsEmpty()) return Nothing<bool>(); | 6186 if (result.IsEmpty()) return Nothing<bool>(); |
| (...skipping 35 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 6205 | 6222 |
| 6206 Maybe<bool> JSReceiver::DeleteProperty(LookupIterator* it, | 6223 Maybe<bool> JSReceiver::DeleteProperty(LookupIterator* it, |
| 6207 LanguageMode language_mode) { | 6224 LanguageMode language_mode) { |
| 6208 Isolate* isolate = it->isolate(); | 6225 Isolate* isolate = it->isolate(); |
| 6209 | 6226 |
| 6210 if (it->state() == LookupIterator::JSPROXY) { | 6227 if (it->state() == LookupIterator::JSPROXY) { |
| 6211 return JSProxy::DeletePropertyOrElement(it->GetHolder<JSProxy>(), | 6228 return JSProxy::DeletePropertyOrElement(it->GetHolder<JSProxy>(), |
| 6212 it->GetName(), language_mode); | 6229 it->GetName(), language_mode); |
| 6213 } | 6230 } |
| 6214 | 6231 |
| 6232 if (it->GetReceiver()->IsJSProxy()) { | |
| 6233 DCHECK(it->state() == LookupIterator::NOT_FOUND); | |
| 6234 DCHECK(it->GetName()->IsPrivate()); | |
| 6235 return Just(true); | |
| 6236 } | |
| 6215 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); | 6237 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); |
| 6216 | 6238 |
| 6217 bool is_observed = | 6239 bool is_observed = |
| 6218 receiver->map()->is_observed() && | 6240 receiver->map()->is_observed() && |
| 6219 (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name())); | 6241 (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name())); |
| 6220 | 6242 |
| 6221 Handle<Object> old_value = it->factory()->the_hole_value(); | 6243 Handle<Object> old_value = it->factory()->the_hole_value(); |
| 6222 | 6244 |
| 6223 for (; it->IsFound(); it->Next()) { | 6245 for (; it->IsFound(); it->Next()) { |
| 6224 switch (it->state()) { | 6246 switch (it->state()) { |
| (...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7081 should_throw); | 7103 should_throw); |
| 7082 } | 7104 } |
| 7083 // 8. Let descObj be FromPropertyDescriptor(Desc). | 7105 // 8. Let descObj be FromPropertyDescriptor(Desc). |
| 7084 Handle<Object> desc_obj = desc->ToObject(isolate); | 7106 Handle<Object> desc_obj = desc->ToObject(isolate); |
| 7085 // 9. Let booleanTrapResult be | 7107 // 9. Let booleanTrapResult be |
| 7086 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). | 7108 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). |
| 7087 Handle<Name> property_name = | 7109 Handle<Name> property_name = |
| 7088 key->IsName() | 7110 key->IsName() |
| 7089 ? Handle<Name>::cast(key) | 7111 ? Handle<Name>::cast(key) |
| 7090 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); | 7112 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); |
| 7113 // Do not leak private property names. | |
| 7114 if (property_name->IsPrivate()) { | |
| 7115 RETURN_FAILURE(isolate, should_throw, | |
| 7116 NewTypeError(MessageTemplate::kProxyPrivate)); | |
| 7117 } | |
| 7091 Handle<Object> trap_result_obj; | 7118 Handle<Object> trap_result_obj; |
| 7092 Handle<Object> args[] = {target, property_name, desc_obj}; | 7119 Handle<Object> args[] = {target, property_name, desc_obj}; |
| 7093 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 7120 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
| 7094 isolate, trap_result_obj, | 7121 isolate, trap_result_obj, |
| 7095 Execution::Call(isolate, trap, handler, arraysize(args), args), | 7122 Execution::Call(isolate, trap, handler, arraysize(args), args), |
| 7096 Nothing<bool>()); | 7123 Nothing<bool>()); |
| 7097 // 10. If booleanTrapResult is false, return false. | 7124 // 10. If booleanTrapResult is false, return false. |
| 7098 if (!trap_result_obj->BooleanValue()) { | 7125 if (!trap_result_obj->BooleanValue()) { |
| 7099 RETURN_FAILURE(isolate, should_throw, | 7126 RETURN_FAILURE(isolate, should_throw, |
| 7100 NewTypeError(MessageTemplate::kProxyTrapReturnedFalsishFor, | 7127 NewTypeError(MessageTemplate::kProxyTrapReturnedFalsishFor, |
| (...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 7225 return Just(true); | 7252 return Just(true); |
| 7226 } | 7253 } |
| 7227 | 7254 |
| 7228 | 7255 |
| 7229 // ES6 9.5.5 | 7256 // ES6 9.5.5 |
| 7230 // static | 7257 // static |
| 7231 Maybe<bool> JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, | 7258 Maybe<bool> JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, |
| 7232 Handle<JSProxy> proxy, | 7259 Handle<JSProxy> proxy, |
| 7233 Handle<Name> name, | 7260 Handle<Name> name, |
| 7234 PropertyDescriptor* desc) { | 7261 PropertyDescriptor* desc) { |
| 7262 DCHECK(!name->IsPrivate()); | |
| 7235 STACK_CHECK(Nothing<bool>()); | 7263 STACK_CHECK(Nothing<bool>()); |
| 7264 | |
| 7236 Handle<String> trap_name = | 7265 Handle<String> trap_name = |
| 7237 isolate->factory()->getOwnPropertyDescriptor_string(); | 7266 isolate->factory()->getOwnPropertyDescriptor_string(); |
| 7238 // 1. (Assert) | 7267 // 1. (Assert) |
| 7239 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 7268 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
| 7240 Handle<Object> handler(proxy->handler(), isolate); | 7269 Handle<Object> handler(proxy->handler(), isolate); |
| 7241 // 3. If handler is null, throw a TypeError exception. | 7270 // 3. If handler is null, throw a TypeError exception. |
| 7242 // 4. Assert: Type(handler) is Object. | 7271 // 4. Assert: Type(handler) is Object. |
| 7243 if (proxy->IsRevoked()) { | 7272 if (proxy->IsRevoked()) { |
| 7244 isolate->Throw(*isolate->factory()->NewTypeError( | 7273 isolate->Throw(*isolate->factory()->NewTypeError( |
| 7245 MessageTemplate::kProxyRevoked, trap_name)); | 7274 MessageTemplate::kProxyRevoked, trap_name)); |
| (...skipping 2726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 9972 | 10001 |
| 9973 Handle<DescriptorArray> descriptors = | 10002 Handle<DescriptorArray> descriptors = |
| 9974 DescriptorArray::Allocate(desc->GetIsolate(), size, slack); | 10003 DescriptorArray::Allocate(desc->GetIsolate(), size, slack); |
| 9975 | 10004 |
| 9976 if (attributes != NONE) { | 10005 if (attributes != NONE) { |
| 9977 for (int i = 0; i < size; ++i) { | 10006 for (int i = 0; i < size; ++i) { |
| 9978 Object* value = desc->GetValue(i); | 10007 Object* value = desc->GetValue(i); |
| 9979 Name* key = desc->GetKey(i); | 10008 Name* key = desc->GetKey(i); |
| 9980 PropertyDetails details = desc->GetDetails(i); | 10009 PropertyDetails details = desc->GetDetails(i); |
| 9981 // Bulk attribute changes never affect private properties. | 10010 // Bulk attribute changes never affect private properties. |
| 9982 if (!key->IsSymbol() || !Symbol::cast(key)->is_private()) { | 10011 if (!key->IsPrivate()) { |
| 9983 int mask = DONT_DELETE | DONT_ENUM; | 10012 int mask = DONT_DELETE | DONT_ENUM; |
| 9984 // READ_ONLY is an invalid attribute for JS setters/getters. | 10013 // READ_ONLY is an invalid attribute for JS setters/getters. |
| 9985 if (details.type() != ACCESSOR_CONSTANT || !value->IsAccessorPair()) { | 10014 if (details.type() != ACCESSOR_CONSTANT || !value->IsAccessorPair()) { |
| 9986 mask |= READ_ONLY; | 10015 mask |= READ_ONLY; |
| 9987 } | 10016 } |
| 9988 details = details.CopyAddAttributes( | 10017 details = details.CopyAddAttributes( |
| 9989 static_cast<PropertyAttributes>(attributes & mask)); | 10018 static_cast<PropertyAttributes>(attributes & mask)); |
| 9990 } | 10019 } |
| 9991 Descriptor inner_desc( | 10020 Descriptor inner_desc( |
| 9992 handle(key), handle(value, desc->GetIsolate()), details); | 10021 handle(key), handle(value, desc->GetIsolate()), details); |
| (...skipping 6144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 16137 | 16166 |
| 16138 if (it->IsElement()) { | 16167 if (it->IsElement()) { |
| 16139 uint32_t index = it->index(); | 16168 uint32_t index = it->index(); |
| 16140 v8::IndexedPropertyGetterCallback getter = | 16169 v8::IndexedPropertyGetterCallback getter = |
| 16141 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 16170 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
| 16142 LOG(isolate, | 16171 LOG(isolate, |
| 16143 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); | 16172 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); |
| 16144 result = args.Call(getter, index); | 16173 result = args.Call(getter, index); |
| 16145 } else { | 16174 } else { |
| 16146 Handle<Name> name = it->name(); | 16175 Handle<Name> name = it->name(); |
| 16176 DCHECK(!name->IsPrivate()); | |
| 16147 | 16177 |
| 16148 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | 16178 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
| 16149 return isolate->factory()->undefined_value(); | 16179 return isolate->factory()->undefined_value(); |
| 16150 } | 16180 } |
| 16151 | 16181 |
| 16152 v8::GenericNamedPropertyGetterCallback getter = | 16182 v8::GenericNamedPropertyGetterCallback getter = |
| 16153 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 16183 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
| 16154 interceptor->getter()); | 16184 interceptor->getter()); |
| 16155 LOG(isolate, | 16185 LOG(isolate, |
| 16156 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 16186 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); |
| (...skipping 3451 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 19608 if (cell->value() != *new_value) { | 19638 if (cell->value() != *new_value) { |
| 19609 cell->set_value(*new_value); | 19639 cell->set_value(*new_value); |
| 19610 Isolate* isolate = cell->GetIsolate(); | 19640 Isolate* isolate = cell->GetIsolate(); |
| 19611 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19641 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
| 19612 isolate, DependentCode::kPropertyCellChangedGroup); | 19642 isolate, DependentCode::kPropertyCellChangedGroup); |
| 19613 } | 19643 } |
| 19614 } | 19644 } |
| 19615 | 19645 |
| 19616 } // namespace internal | 19646 } // namespace internal |
| 19617 } // namespace v8 | 19647 } // namespace v8 |
| OLD | NEW |