Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(920)

Side by Side Diff: src/objects.cc

Issue 1573143002: Do not leak private property names to proxy traps and interceptors. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Typo Created 4 years, 11 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « src/messages.h ('k') | test/mjsunit/harmony/private-symbols.js » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
OLDNEW
« no previous file with comments | « src/messages.h ('k') | test/mjsunit/harmony/private-symbols.js » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698