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::kIllegalInvocation)); | |
rossberg
2016/01/11 15:43:21
Nit: Maybe use a more explicit error message?
| |
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::kIllegalInvocation)); | |
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); | |
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()) { | |
rossberg
2016/01/11 15:43:21
Nit: maybe put a short explanatory comment here.
| |
6233 DCHECK(it->GetName()->IsPrivate()); | |
6234 return Just(true); | |
6235 } | |
6215 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); | 6236 Handle<JSObject> receiver = Handle<JSObject>::cast(it->GetReceiver()); |
6216 | 6237 |
6217 bool is_observed = | 6238 bool is_observed = |
6218 receiver->map()->is_observed() && | 6239 receiver->map()->is_observed() && |
6219 (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name())); | 6240 (it->IsElement() || !isolate->IsInternallyUsedPropertyName(it->name())); |
6220 | 6241 |
6221 Handle<Object> old_value = it->factory()->the_hole_value(); | 6242 Handle<Object> old_value = it->factory()->the_hole_value(); |
6222 | 6243 |
6223 for (; it->IsFound(); it->Next()) { | 6244 for (; it->IsFound(); it->Next()) { |
6224 switch (it->state()) { | 6245 switch (it->state()) { |
(...skipping 856 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7081 should_throw); | 7102 should_throw); |
7082 } | 7103 } |
7083 // 8. Let descObj be FromPropertyDescriptor(Desc). | 7104 // 8. Let descObj be FromPropertyDescriptor(Desc). |
7084 Handle<Object> desc_obj = desc->ToObject(isolate); | 7105 Handle<Object> desc_obj = desc->ToObject(isolate); |
7085 // 9. Let booleanTrapResult be | 7106 // 9. Let booleanTrapResult be |
7086 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). | 7107 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). |
7087 Handle<Name> property_name = | 7108 Handle<Name> property_name = |
7088 key->IsName() | 7109 key->IsName() |
7089 ? Handle<Name>::cast(key) | 7110 ? Handle<Name>::cast(key) |
7090 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); | 7111 : Handle<Name>::cast(isolate->factory()->NumberToString(key)); |
7112 // Do not leak private property names. | |
7113 if (property_name->IsPrivate()) { | |
7114 RETURN_FAILURE(isolate, should_throw, | |
7115 NewTypeError(MessageTemplate::kIllegalInvocation)); | |
7116 } | |
7091 Handle<Object> trap_result_obj; | 7117 Handle<Object> trap_result_obj; |
7092 Handle<Object> args[] = {target, property_name, desc_obj}; | 7118 Handle<Object> args[] = {target, property_name, desc_obj}; |
7093 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 7119 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
7094 isolate, trap_result_obj, | 7120 isolate, trap_result_obj, |
7095 Execution::Call(isolate, trap, handler, arraysize(args), args), | 7121 Execution::Call(isolate, trap, handler, arraysize(args), args), |
7096 Nothing<bool>()); | 7122 Nothing<bool>()); |
7097 // 10. If booleanTrapResult is false, return false. | 7123 // 10. If booleanTrapResult is false, return false. |
7098 if (!trap_result_obj->BooleanValue()) { | 7124 if (!trap_result_obj->BooleanValue()) { |
7099 RETURN_FAILURE(isolate, should_throw, | 7125 RETURN_FAILURE(isolate, should_throw, |
7100 NewTypeError(MessageTemplate::kProxyTrapReturnedFalsishFor, | 7126 NewTypeError(MessageTemplate::kProxyTrapReturnedFalsishFor, |
(...skipping 124 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
7225 return Just(true); | 7251 return Just(true); |
7226 } | 7252 } |
7227 | 7253 |
7228 | 7254 |
7229 // ES6 9.5.5 | 7255 // ES6 9.5.5 |
7230 // static | 7256 // static |
7231 Maybe<bool> JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, | 7257 Maybe<bool> JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, |
7232 Handle<JSProxy> proxy, | 7258 Handle<JSProxy> proxy, |
7233 Handle<Name> name, | 7259 Handle<Name> name, |
7234 PropertyDescriptor* desc) { | 7260 PropertyDescriptor* desc) { |
7261 DCHECK(!name->IsPrivate()); | |
7235 STACK_CHECK(Nothing<bool>()); | 7262 STACK_CHECK(Nothing<bool>()); |
7263 | |
7236 Handle<String> trap_name = | 7264 Handle<String> trap_name = |
7237 isolate->factory()->getOwnPropertyDescriptor_string(); | 7265 isolate->factory()->getOwnPropertyDescriptor_string(); |
7238 // 1. (Assert) | 7266 // 1. (Assert) |
7239 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 7267 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
7240 Handle<Object> handler(proxy->handler(), isolate); | 7268 Handle<Object> handler(proxy->handler(), isolate); |
7241 // 3. If handler is null, throw a TypeError exception. | 7269 // 3. If handler is null, throw a TypeError exception. |
7242 // 4. Assert: Type(handler) is Object. | 7270 // 4. Assert: Type(handler) is Object. |
7243 if (proxy->IsRevoked()) { | 7271 if (proxy->IsRevoked()) { |
7244 isolate->Throw(*isolate->factory()->NewTypeError( | 7272 isolate->Throw(*isolate->factory()->NewTypeError( |
7245 MessageTemplate::kProxyRevoked, trap_name)); | 7273 MessageTemplate::kProxyRevoked, trap_name)); |
(...skipping 2726 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
9972 | 10000 |
9973 Handle<DescriptorArray> descriptors = | 10001 Handle<DescriptorArray> descriptors = |
9974 DescriptorArray::Allocate(desc->GetIsolate(), size, slack); | 10002 DescriptorArray::Allocate(desc->GetIsolate(), size, slack); |
9975 | 10003 |
9976 if (attributes != NONE) { | 10004 if (attributes != NONE) { |
9977 for (int i = 0; i < size; ++i) { | 10005 for (int i = 0; i < size; ++i) { |
9978 Object* value = desc->GetValue(i); | 10006 Object* value = desc->GetValue(i); |
9979 Name* key = desc->GetKey(i); | 10007 Name* key = desc->GetKey(i); |
9980 PropertyDetails details = desc->GetDetails(i); | 10008 PropertyDetails details = desc->GetDetails(i); |
9981 // Bulk attribute changes never affect private properties. | 10009 // Bulk attribute changes never affect private properties. |
9982 if (!key->IsSymbol() || !Symbol::cast(key)->is_private()) { | 10010 if (!key->IsPrivate()) { |
9983 int mask = DONT_DELETE | DONT_ENUM; | 10011 int mask = DONT_DELETE | DONT_ENUM; |
9984 // READ_ONLY is an invalid attribute for JS setters/getters. | 10012 // READ_ONLY is an invalid attribute for JS setters/getters. |
9985 if (details.type() != ACCESSOR_CONSTANT || !value->IsAccessorPair()) { | 10013 if (details.type() != ACCESSOR_CONSTANT || !value->IsAccessorPair()) { |
9986 mask |= READ_ONLY; | 10014 mask |= READ_ONLY; |
9987 } | 10015 } |
9988 details = details.CopyAddAttributes( | 10016 details = details.CopyAddAttributes( |
9989 static_cast<PropertyAttributes>(attributes & mask)); | 10017 static_cast<PropertyAttributes>(attributes & mask)); |
9990 } | 10018 } |
9991 Descriptor inner_desc( | 10019 Descriptor inner_desc( |
9992 handle(key), handle(value, desc->GetIsolate()), details); | 10020 handle(key), handle(value, desc->GetIsolate()), details); |
(...skipping 6144 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
16137 | 16165 |
16138 if (it->IsElement()) { | 16166 if (it->IsElement()) { |
16139 uint32_t index = it->index(); | 16167 uint32_t index = it->index(); |
16140 v8::IndexedPropertyGetterCallback getter = | 16168 v8::IndexedPropertyGetterCallback getter = |
16141 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); | 16169 v8::ToCData<v8::IndexedPropertyGetterCallback>(interceptor->getter()); |
16142 LOG(isolate, | 16170 LOG(isolate, |
16143 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); | 16171 ApiIndexedPropertyAccess("interceptor-indexed-get", *holder, index)); |
16144 result = args.Call(getter, index); | 16172 result = args.Call(getter, index); |
16145 } else { | 16173 } else { |
16146 Handle<Name> name = it->name(); | 16174 Handle<Name> name = it->name(); |
16175 DCHECK(!name->IsPrivate()); | |
16147 | 16176 |
16148 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { | 16177 if (name->IsSymbol() && !interceptor->can_intercept_symbols()) { |
16149 return isolate->factory()->undefined_value(); | 16178 return isolate->factory()->undefined_value(); |
16150 } | 16179 } |
16151 | 16180 |
16152 v8::GenericNamedPropertyGetterCallback getter = | 16181 v8::GenericNamedPropertyGetterCallback getter = |
16153 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( | 16182 v8::ToCData<v8::GenericNamedPropertyGetterCallback>( |
16154 interceptor->getter()); | 16183 interceptor->getter()); |
16155 LOG(isolate, | 16184 LOG(isolate, |
16156 ApiNamedPropertyAccess("interceptor-named-get", *holder, *name)); | 16185 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) { | 19637 if (cell->value() != *new_value) { |
19609 cell->set_value(*new_value); | 19638 cell->set_value(*new_value); |
19610 Isolate* isolate = cell->GetIsolate(); | 19639 Isolate* isolate = cell->GetIsolate(); |
19611 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 19640 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
19612 isolate, DependentCode::kPropertyCellChangedGroup); | 19641 isolate, DependentCode::kPropertyCellChangedGroup); |
19613 } | 19642 } |
19614 } | 19643 } |
19615 | 19644 |
19616 } // namespace internal | 19645 } // namespace internal |
19617 } // namespace v8 | 19646 } // namespace v8 |
OLD | NEW |