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

Side by Side Diff: src/objects.cc

Issue 1492923002: [proxies] do not leak private symbols to proxy traps (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: More tests + cleanup fix Created 5 years 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
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 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 705 matching lines...) Expand 10 before | Expand all | Expand 10 after
716 return ReadAbsentProperty(it, language_mode); 716 return ReadAbsentProperty(it, language_mode);
717 } 717 }
718 718
719 719
720 // static 720 // static
721 MaybeHandle<Object> JSProxy::GetProperty(Isolate* isolate, 721 MaybeHandle<Object> JSProxy::GetProperty(Isolate* isolate,
722 Handle<JSProxy> proxy, 722 Handle<JSProxy> proxy,
723 Handle<Name> name, 723 Handle<Name> name,
724 Handle<Object> receiver, 724 Handle<Object> receiver,
725 LanguageMode language_mode) { 725 LanguageMode language_mode) {
726 // Do not delegate to trap for internal slots
727 if (name->IsPrivate()) return isolate->factory()->undefined_value();
728
726 Handle<Name> trap_name = isolate->factory()->get_string(); 729 Handle<Name> trap_name = isolate->factory()->get_string();
727 // 1. Assert: IsPropertyKey(P) is true. 730 // 1. Assert: IsPropertyKey(P) is true.
728 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 731 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
729 Handle<Object> handler(proxy->handler(), isolate); 732 Handle<Object> handler(proxy->handler(), isolate);
730 // 3. If handler is null, throw a TypeError exception. 733 // 3. If handler is null, throw a TypeError exception.
731 if (proxy->IsRevoked()) { 734 if (proxy->IsRevoked()) {
732 THROW_NEW_ERROR(isolate, 735 THROW_NEW_ERROR(isolate,
733 NewTypeError(MessageTemplate::kProxyRevoked, trap_name), 736 NewTypeError(MessageTemplate::kProxyRevoked, trap_name),
734 Object); 737 Object);
735 } 738 }
739
736 // 4. Assert: Type(handler) is Object. 740 // 4. Assert: Type(handler) is Object.
737 DCHECK(handler->IsJSReceiver()); 741 DCHECK(handler->IsJSReceiver());
738 DCHECK(proxy->target()->IsJSReceiver()); 742 DCHECK(proxy->target()->IsJSReceiver());
739 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. 743 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
740 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); 744 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
741 // 6. Let trap be ? GetMethod(handler, "get"). 745 // 6. Let trap be ? GetMethod(handler, "get").
742 Handle<Object> trap; 746 Handle<Object> trap;
743 ASSIGN_RETURN_ON_EXCEPTION( 747 ASSIGN_RETURN_ON_EXCEPTION(
744 isolate, trap, 748 isolate, trap,
745 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), Object); 749 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), Object);
(...skipping 3821 matching lines...) Expand 10 before | Expand all | Expand 10 after
4567 4571
4568 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object, 4572 Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object,
4569 ElementsKind to_kind) { 4573 ElementsKind to_kind) {
4570 Handle<Map> map(object->map()); 4574 Handle<Map> map(object->map());
4571 return Map::TransitionElementsTo(map, to_kind); 4575 return Map::TransitionElementsTo(map, to_kind);
4572 } 4576 }
4573 4577
4574 4578
4575 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, 4579 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy,
4576 Handle<Name> name) { 4580 Handle<Name> name) {
4581 // Do not delegate to trap for internal slots
4582 if (name->IsPrivate()) return Just(false);
4583
4577 // 1. (Assert) 4584 // 1. (Assert)
4578 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 4585 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
4579 Handle<Object> handler(proxy->handler(), isolate); 4586 Handle<Object> handler(proxy->handler(), isolate);
4580 // 3. If handler is null, throw a TypeError exception. 4587 // 3. If handler is null, throw a TypeError exception.
4581 if (proxy->IsRevoked()) { 4588 if (proxy->IsRevoked()) {
4582 isolate->Throw(*isolate->factory()->NewTypeError( 4589 isolate->Throw(*isolate->factory()->NewTypeError(
4583 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); 4590 MessageTemplate::kProxyRevoked, isolate->factory()->has_string()));
4584 return Nothing<bool>(); 4591 return Nothing<bool>();
4585 } 4592 }
4593
4586 // 4. Assert: Type(handler) is Object. 4594 // 4. Assert: Type(handler) is Object.
4587 DCHECK(handler->IsJSReceiver()); 4595 DCHECK(handler->IsJSReceiver());
4588 DCHECK(proxy->target()->IsJSReceiver()); 4596 DCHECK(proxy->target()->IsJSReceiver());
4589 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. 4597 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
4590 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); 4598 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
4591 // 6. Let trap be ? GetMethod(handler, "has"). 4599 // 6. Let trap be ? GetMethod(handler, "has").
4592 Handle<Object> trap; 4600 Handle<Object> trap;
4593 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 4601 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
4594 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler), 4602 isolate, trap, Object::GetMethod(Handle<JSReceiver>::cast(handler),
4595 isolate->factory()->has_string()), 4603 isolate->factory()->has_string()),
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
4634 } 4642 }
4635 } 4643 }
4636 // 10. Return booleanTrapResult. 4644 // 10. Return booleanTrapResult.
4637 return Just(boolean_trap_result); 4645 return Just(boolean_trap_result);
4638 } 4646 }
4639 4647
4640 4648
4641 Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name, 4649 Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name,
4642 Handle<Object> value, Handle<Object> receiver, 4650 Handle<Object> value, Handle<Object> receiver,
4643 LanguageMode language_mode) { 4651 LanguageMode language_mode) {
4652 // Do not delegate to trap for internal slots
4653 if (name->IsPrivate()) return Just(false);
4654
4644 Isolate* isolate = proxy->GetIsolate(); 4655 Isolate* isolate = proxy->GetIsolate();
4645 Factory* factory = isolate->factory(); 4656 Factory* factory = isolate->factory();
4646 Handle<String> trap_name = factory->set_string(); 4657 Handle<String> trap_name = factory->set_string();
4647 ShouldThrow should_throw = 4658 ShouldThrow should_throw =
4648 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; 4659 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR;
4649 4660
4650 if (proxy->IsRevoked()) { 4661 if (proxy->IsRevoked()) {
4651 isolate->Throw( 4662 isolate->Throw(
4652 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); 4663 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
4653 return Nothing<bool>(); 4664 return Nothing<bool>();
(...skipping 42 matching lines...) Expand 10 before | Expand all | Expand 10 after
4696 return Nothing<bool>(); 4707 return Nothing<bool>();
4697 } 4708 }
4698 } 4709 }
4699 return Just(true); 4710 return Just(true);
4700 } 4711 }
4701 4712
4702 4713
4703 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, 4714 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy,
4704 Handle<Name> name, 4715 Handle<Name> name,
4705 LanguageMode language_mode) { 4716 LanguageMode language_mode) {
4717 // Do not delegate to trap for internal slots
4718 if (name->IsPrivate()) return Just(true);
4719
4706 ShouldThrow should_throw = 4720 ShouldThrow should_throw =
4707 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; 4721 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR;
4708 Isolate* isolate = proxy->GetIsolate(); 4722 Isolate* isolate = proxy->GetIsolate();
4709 Factory* factory = isolate->factory(); 4723 Factory* factory = isolate->factory();
4710 Handle<String> trap_name = factory->deleteProperty_string(); 4724 Handle<String> trap_name = factory->deleteProperty_string();
4711 4725
4712 if (proxy->IsRevoked()) { 4726 if (proxy->IsRevoked()) {
4713 isolate->Throw( 4727 isolate->Throw(
4714 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); 4728 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
4715 return Nothing<bool>(); 4729 return Nothing<bool>();
(...skipping 2083 matching lines...) Expand 10 before | Expand all | Expand 10 after
6799 } 6813 }
6800 return success; 6814 return success;
6801 } 6815 }
6802 6816
6803 6817
6804 // ES6 9.5.6 6818 // ES6 9.5.6
6805 // static 6819 // static
6806 bool JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy, 6820 bool JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy,
6807 Handle<Object> key, PropertyDescriptor* desc, 6821 Handle<Object> key, PropertyDescriptor* desc,
6808 ShouldThrow should_throw) { 6822 ShouldThrow should_throw) {
6823 // Do not delegate to trap for internal slots
6824 if (key->IsSymbol() && Symbol::cast(*key)->is_private()) return false;
6825
6809 Handle<String> trap_name = isolate->factory()->defineProperty_string(); 6826 Handle<String> trap_name = isolate->factory()->defineProperty_string();
6810 // 1. Assert: IsPropertyKey(P) is true. 6827 // 1. Assert: IsPropertyKey(P) is true.
6811 DCHECK(key->IsName() || key->IsNumber()); 6828 DCHECK(key->IsName() || key->IsNumber());
6812 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 6829 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
6813 Handle<Object> handler(proxy->handler(), isolate); 6830 Handle<Object> handler(proxy->handler(), isolate);
6814 // 3. If handler is null, throw a TypeError exception. 6831 // 3. If handler is null, throw a TypeError exception.
6815 if (proxy->IsRevoked()) { 6832 if (proxy->IsRevoked()) {
6816 isolate->Throw(*isolate->factory()->NewTypeError( 6833 isolate->Throw(*isolate->factory()->NewTypeError(
6817 MessageTemplate::kProxyRevoked, trap_name)); 6834 MessageTemplate::kProxyRevoked, trap_name));
6818 return false; 6835 return false;
6819 } 6836 }
6837
6820 // 4. Assert: Type(handler) is Object. 6838 // 4. Assert: Type(handler) is Object.
6821 DCHECK(handler->IsJSReceiver()); 6839 DCHECK(handler->IsJSReceiver());
6822 // If the handler is not null, the target can't be null either. 6840 // If the handler is not null, the target can't be null either.
6823 DCHECK(proxy->target()->IsJSReceiver()); 6841 DCHECK(proxy->target()->IsJSReceiver());
6824 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. 6842 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
6825 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); 6843 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
6826 // 6. Let trap be ? GetMethod(handler, "defineProperty"). 6844 // 6. Let trap be ? GetMethod(handler, "defineProperty").
6827 Handle<Object> trap; 6845 Handle<Object> trap;
6828 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 6846 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
6829 isolate, trap, 6847 isolate, trap,
(...skipping 153 matching lines...) Expand 10 before | Expand all | Expand 10 after
6983 PropertyDescriptor::IsDataDescriptor(desc)); 7001 PropertyDescriptor::IsDataDescriptor(desc));
6984 return true; 7002 return true;
6985 } 7003 }
6986 7004
6987 7005
6988 // ES6 9.5.5 7006 // ES6 9.5.5
6989 // static 7007 // static
6990 bool JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, Handle<JSProxy> proxy, 7008 bool JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, Handle<JSProxy> proxy,
6991 Handle<Name> name, 7009 Handle<Name> name,
6992 PropertyDescriptor* desc) { 7010 PropertyDescriptor* desc) {
7011 // Do not delegate to trap for internal slots
7012 if (name->IsPrivate()) return false;
7013
6993 Handle<String> trap_name = 7014 Handle<String> trap_name =
6994 isolate->factory()->getOwnPropertyDescriptor_string(); 7015 isolate->factory()->getOwnPropertyDescriptor_string();
6995 // 1. (Assert) 7016 // 1. (Assert)
6996 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. 7017 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
6997 Handle<Object> handler(proxy->handler(), isolate); 7018 Handle<Object> handler(proxy->handler(), isolate);
6998 // 3. If handler is null, throw a TypeError exception. 7019 // 3. If handler is null, throw a TypeError exception.
6999 if (proxy->IsRevoked()) { 7020 if (proxy->IsRevoked()) {
7000 isolate->Throw(*isolate->factory()->NewTypeError( 7021 isolate->Throw(*isolate->factory()->NewTypeError(
7001 MessageTemplate::kProxyRevoked, trap_name)); 7022 MessageTemplate::kProxyRevoked, trap_name));
7002 return false; 7023 return false;
(...skipping 12052 matching lines...) Expand 10 before | Expand all | Expand 10 after
19055 if (cell->value() != *new_value) { 19076 if (cell->value() != *new_value) {
19056 cell->set_value(*new_value); 19077 cell->set_value(*new_value);
19057 Isolate* isolate = cell->GetIsolate(); 19078 Isolate* isolate = cell->GetIsolate();
19058 cell->dependent_code()->DeoptimizeDependentCodeGroup( 19079 cell->dependent_code()->DeoptimizeDependentCodeGroup(
19059 isolate, DependentCode::kPropertyCellChangedGroup); 19080 isolate, DependentCode::kPropertyCellChangedGroup);
19060 } 19081 }
19061 } 19082 }
19062 19083
19063 } // namespace internal 19084 } // namespace internal
19064 } // namespace v8 19085 } // namespace v8
OLDNEW
« no previous file with comments | « no previous file | test/mjsunit/harmony/proxies-define-property.js » ('j') | test/mjsunit/harmony/proxies-define-property.js » ('J')

Powered by Google App Engine
This is Rietveld 408576698