@@ -758,16 +758,14 @@ MaybeHandle<Object> JSProxy::GetProperty(Isolate* isolate,
758758 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
759759 Handle<Object> handler(proxy->handler(), isolate);
760760 // 3. If handler is null, throw a TypeError exception.
761+ // 4. Assert: Type(handler) is Object.
761762 if (proxy->IsRevoked()) {
762763 THROW_NEW_ERROR(isolate,
763764 NewTypeError(MessageTemplate::kProxyRevoked, trap_name),
764765 Object);
765766 }
766- // 4. Assert: Type(handler) is Object.
767- DCHECK(handler->IsJSReceiver());
768- DCHECK(proxy->target()->IsJSReceiver());
769767 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
770- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
768+ Handle<JSReceiver> target(proxy->target(), isolate);
771769 // 6. Let trap be ? GetMethod(handler, "get").
772770 Handle<Object> trap;
773771 ASSIGN_RETURN_ON_EXCEPTION(
@@ -957,22 +955,22 @@ Handle<FixedArray> JSObject::EnsureWritableFastElements(
957955// static
958956MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) {
959957 Isolate* isolate = proxy->GetIsolate();
958+ Handle<String> trap_name = isolate->factory()->getPrototypeOf_string();
959+
960960 // 1. Let handler be the value of the [[ProxyHandler]] internal slot.
961- Handle<Object> raw_handler(proxy->handler(), isolate);
962961 // 2. If handler is null, throw a TypeError exception.
963962 // 3. Assert: Type(handler) is Object.
964- if (!raw_handler->IsJSReceiver()) {
965- // TODO(cbruni): Throw correct error message.
966- THROW_NEW_ERROR(
967- isolate, NewTypeError(MessageTemplate::kProxyHandlerNonObject), Object);
968- }
969- Handle<JSReceiver> handler = Handle<JSReceiver>::cast(raw_handler);
970963 // 4. Let target be the value of the [[ProxyTarget]] internal slot.
971- // TODO(cbruni): Change target type to JSReceiver by default.
972- Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
964+ if (proxy->IsRevoked()) {
965+ THROW_NEW_ERROR(isolate,
966+ NewTypeError(MessageTemplate::kProxyRevoked, trap_name),
967+ Object);
968+ }
969+ Handle<JSReceiver> target(proxy->target(), isolate);
970+ Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate);
971+
973972 // 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
974973 Handle<Object> trap;
975- Handle<String> trap_name = isolate->factory()->getPrototypeOf_string();
976974 ASSIGN_RETURN_ON_EXCEPTION(isolate, trap, GetMethod(handler, trap_name),
977975 Object);
978976 // 6. If trap is undefined, then return target.[[GetPrototypeOf]]().
@@ -1013,15 +1011,6 @@ MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) {
10131011}
10141012
10151013
1016- bool JSProxy::IsRevoked() const {
1017- // TODO(neis): Decide on how to represent revocation. For now, revocation is
1018- // unsupported.
1019- DCHECK(target()->IsJSReceiver());
1020- DCHECK(handler()->IsJSReceiver());
1021- return false;
1022- }
1023-
1024-
10251014MaybeHandle<Object> Object::GetPropertyWithAccessor(
10261015 LookupIterator* it, LanguageMode language_mode) {
10271016 Isolate* isolate = it->isolate();
@@ -4620,22 +4609,27 @@ Handle<Map> JSObject::GetElementsTransitionMap(Handle<JSObject> object,
46204609}
46214610
46224611
4612+ void JSProxy::Revoke(Handle<JSProxy> proxy) {
4613+ Isolate* isolate = proxy->GetIsolate();
4614+ if (!proxy->IsRevoked()) proxy->set_handler(isolate->heap()->null_value());
4615+ DCHECK(proxy->IsRevoked());
4616+ }
4617+
4618+
46234619Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy,
46244620 Handle<Name> name) {
46254621 // 1. (Assert)
46264622 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
46274623 Handle<Object> handler(proxy->handler(), isolate);
46284624 // 3. If handler is null, throw a TypeError exception.
4625+ // 4. Assert: Type(handler) is Object.
46294626 if (proxy->IsRevoked()) {
46304627 isolate->Throw(*isolate->factory()->NewTypeError(
46314628 MessageTemplate::kProxyRevoked, isolate->factory()->has_string()));
46324629 return Nothing<bool>();
46334630 }
4634- // 4. Assert: Type(handler) is Object.
4635- DCHECK(handler->IsJSReceiver());
4636- DCHECK(proxy->target()->IsJSReceiver());
46374631 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
4638- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
4632+ Handle<JSReceiver> target(proxy->target(), isolate);
46394633 // 6. Let trap be ? GetMethod(handler, "has").
46404634 Handle<Object> trap;
46414635 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -4700,8 +4694,7 @@ Maybe<bool> JSProxy::SetProperty(Handle<JSProxy> proxy, Handle<Name> name,
47004694 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
47014695 return Nothing<bool>();
47024696 }
4703-
4704- Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
4697+ Handle<JSReceiver> target(proxy->target(), isolate);
47054698 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate);
47064699
47074700 Handle<Object> trap;
@@ -4762,8 +4755,7 @@ Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy,
47624755 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
47634756 return Nothing<bool>();
47644757 }
4765-
4766- Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
4758+ Handle<JSReceiver> target(proxy->target(), isolate);
47674759 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate);
47684760
47694761 Handle<Object> trap;
@@ -6835,17 +6827,14 @@ bool JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy,
68356827 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
68366828 Handle<Object> handler(proxy->handler(), isolate);
68376829 // 3. If handler is null, throw a TypeError exception.
6830+ // 4. Assert: Type(handler) is Object.
68386831 if (proxy->IsRevoked()) {
68396832 isolate->Throw(*isolate->factory()->NewTypeError(
68406833 MessageTemplate::kProxyRevoked, trap_name));
68416834 return false;
68426835 }
6843- // 4. Assert: Type(handler) is Object.
6844- DCHECK(handler->IsJSReceiver());
6845- // If the handler is not null, the target can't be null either.
6846- DCHECK(proxy->target()->IsJSReceiver());
68476836 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
6848- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
6837+ Handle<JSReceiver> target(proxy->target(), isolate);
68496838 // 6. Let trap be ? GetMethod(handler, "defineProperty").
68506839 Handle<Object> trap;
68516840 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -7019,17 +7008,14 @@ bool JSProxy::GetOwnPropertyDescriptor(Isolate* isolate, Handle<JSProxy> proxy,
70197008 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
70207009 Handle<Object> handler(proxy->handler(), isolate);
70217010 // 3. If handler is null, throw a TypeError exception.
7011+ // 4. Assert: Type(handler) is Object.
70227012 if (proxy->IsRevoked()) {
70237013 isolate->Throw(*isolate->factory()->NewTypeError(
70247014 MessageTemplate::kProxyRevoked, trap_name));
70257015 return false;
70267016 }
7027- // 4. Assert: Type(handler) is Object.
7028- DCHECK(handler->IsJSReceiver());
7029- // If the handler is not null, the target can't be null either.
7030- DCHECK(proxy->target()->IsJSReceiver());
70317017 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O.
7032- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
7018+ Handle<JSReceiver> target(proxy->target(), isolate);
70337019 // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor").
70347020 Handle<Object> trap;
70357021 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -7277,8 +7263,7 @@ Maybe<bool> JSProxy::PreventExtensions(Handle<JSProxy> proxy,
72777263 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
72787264 return Nothing<bool>();
72797265 }
7280-
7281- Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
7266+ Handle<JSReceiver> target(proxy->target(), isolate);
72827267 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate);
72837268
72847269 Handle<Object> trap;
@@ -7387,8 +7372,7 @@ Maybe<bool> JSProxy::IsExtensible(Handle<JSProxy> proxy) {
73877372 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name));
73887373 return Nothing<bool>();
73897374 }
7390-
7391- Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
7375+ Handle<JSReceiver> target(proxy->target(), isolate);
73927376 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate);
73937377
73947378 Handle<Object> trap;
@@ -8296,16 +8280,15 @@ bool JSProxy::Enumerate(Isolate* isolate, Handle<JSReceiver> receiver,
82968280 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
82978281 Handle<Object> handler(proxy->handler(), isolate);
82988282 // 2. If handler is null, throw a TypeError exception.
8283+ // 3. Assert: Type(handler) is Object.
82998284 if (proxy->IsRevoked()) {
83008285 isolate->Throw(*isolate->factory()->NewTypeError(
83018286 MessageTemplate::kProxyRevoked,
83028287 isolate->factory()->enumerate_string()));
83038288 return false;
83048289 }
8305- // 3. Assert: Type(handler) is Object.
8306- DCHECK(handler->IsJSReceiver());
83078290 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
8308- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
8291+ Handle<JSReceiver> target(proxy->target(), isolate);
83098292 // 5. Let trap be ? GetMethod(handler, "enumerate").
83108293 Handle<Object> trap;
83118294 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -8402,15 +8385,14 @@ bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver,
84028385 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O.
84038386 Handle<Object> handler(proxy->handler(), isolate);
84048387 // 2. If handler is null, throw a TypeError exception.
8388+ // 3. Assert: Type(handler) is Object.
84058389 if (proxy->IsRevoked()) {
84068390 isolate->Throw(*isolate->factory()->NewTypeError(
84078391 MessageTemplate::kProxyRevoked, isolate->factory()->ownKeys_string()));
84088392 return false;
84098393 }
8410- // 3. Assert: Type(handler) is Object.
8411- DCHECK(handler->IsJSReceiver());
84128394 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O.
8413- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
8395+ Handle<JSReceiver> target(proxy->target(), isolate);
84148396 // 5. Let trap be ? GetMethod(handler, "ownKeys").
84158397 Handle<Object> trap;
84168398 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
@@ -14891,28 +14873,26 @@ Maybe<bool> JSProxy::SetPrototype(Handle<JSProxy> proxy, Handle<Object> value,
1489114873 bool from_javascript,
1489214874 ShouldThrow should_throw) {
1489314875 Isolate* isolate = proxy->GetIsolate();
14894- Handle<JSReceiver> handle;
1489514876 Handle<Name> trap_name = isolate->factory()->setPrototypeOf_string();
1489614877 // 1. Assert: Either Type(V) is Object or Type(V) is Null.
1489714878 DCHECK(value->IsJSReceiver() || value->IsNull());
1489814879 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O.
14899- Handle<Object> raw_handler (proxy->handler(), isolate);
14880+ Handle<Object> handler (proxy->handler(), isolate);
1490014881 // 3. If handler is null, throw a TypeError exception.
1490114882 // 4. Assert: Type(handler) is Object.
1490214883 if (proxy->IsRevoked()) {
14903- DCHECK(raw_handler->IsNull());
14904- DCHECK(proxy->target()->IsNull());
14905- isolate->Throw(
14906- *isolate->factory()->NewTypeError(MessageTemplate::kProxyRevoked));
14884+ isolate->Throw(*isolate->factory()->NewTypeError(
14885+ MessageTemplate::kProxyRevoked, trap_name));
1490714886 return Nothing<bool>();
1490814887 }
14909- Handle<JSReceiver> handler = Handle<JSReceiver>::cast(raw_handler);
1491014888 // 5. Let target be the value of the [[ProxyTarget]] internal slot.
14911- Handle<JSReceiver> target(JSReceiver::cast( proxy->target() ), isolate);
14889+ Handle<JSReceiver> target(proxy->target(), isolate);
1491214890 // 6. Let trap be ? GetMethod(handler, "getPrototypeOf").
1491314891 Handle<Object> trap;
1491414892 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
14915- isolate, trap, Object::GetMethod(handler, trap_name), Nothing<bool>());
14893+ isolate, trap,
14894+ Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name),
14895+ Nothing<bool>());
1491614896 // 7. If trap is undefined, then return target.[[SetPrototypeOf]]().
1491714897 if (trap->IsUndefined()) {
1491814898 return JSReceiver::SetPrototype(target, value, from_javascript,
0 commit comments