OLD | NEW |
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 892 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
903 THROW_NEW_ERROR(isolate, | 903 THROW_NEW_ERROR(isolate, |
904 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing, | 904 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing, |
905 handler, trap_name), | 905 handler, trap_name), |
906 Object); | 906 Object); |
907 } | 907 } |
908 // 13. Return handlerProto. | 908 // 13. Return handlerProto. |
909 return handler_proto; | 909 return handler_proto; |
910 } | 910 } |
911 | 911 |
912 | 912 |
913 bool JSProxy::IsRevoked(Handle<JSProxy> proxy) { | 913 bool JSProxy::IsRevoked() { |
914 // TODO(neis): Decide on how to represent revocation. For now, revocation is | 914 // TODO(neis): Decide on how to represent revocation. For now, revocation is |
915 // unsupported. | 915 // unsupported. |
916 DCHECK(proxy->target()->IsJSReceiver()); | 916 DCHECK(target()->IsJSReceiver()); |
917 DCHECK(proxy->handler()->IsJSReceiver()); | 917 DCHECK(handler()->IsJSReceiver()); |
918 return false; | 918 return false; |
919 } | 919 } |
920 | 920 |
921 | 921 |
922 MaybeHandle<Object> JSProxy::GetPropertyWithHandler(Handle<JSProxy> proxy, | 922 MaybeHandle<Object> JSProxy::GetPropertyWithHandler(Handle<JSProxy> proxy, |
923 Handle<Object> receiver, | 923 Handle<Object> receiver, |
924 Handle<Name> name) { | 924 Handle<Name> name) { |
925 Isolate* isolate = proxy->GetIsolate(); | 925 Isolate* isolate = proxy->GetIsolate(); |
926 | 926 |
927 // TODO(rossberg): adjust once there is a story for symbols vs proxies. | 927 // TODO(rossberg): adjust once there is a story for symbols vs proxies. |
(...skipping 3594 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4522 return Map::TransitionElementsTo(map, to_kind); | 4522 return Map::TransitionElementsTo(map, to_kind); |
4523 } | 4523 } |
4524 | 4524 |
4525 | 4525 |
4526 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, | 4526 Maybe<bool> JSProxy::HasProperty(Isolate* isolate, Handle<JSProxy> proxy, |
4527 Handle<Name> name) { | 4527 Handle<Name> name) { |
4528 // 1. (Assert) | 4528 // 1. (Assert) |
4529 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 4529 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
4530 Handle<Object> handler(proxy->handler(), isolate); | 4530 Handle<Object> handler(proxy->handler(), isolate); |
4531 // 3. If handler is null, throw a TypeError exception. | 4531 // 3. If handler is null, throw a TypeError exception. |
4532 if (JSProxy::IsRevoked(proxy)) { | 4532 if (proxy->IsRevoked()) { |
4533 isolate->Throw(*isolate->factory()->NewTypeError( | 4533 isolate->Throw(*isolate->factory()->NewTypeError( |
4534 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); | 4534 MessageTemplate::kProxyRevoked, isolate->factory()->has_string())); |
4535 return Nothing<bool>(); | 4535 return Nothing<bool>(); |
4536 } | 4536 } |
4537 // 4. Assert: Type(handler) is Object. | 4537 // 4. Assert: Type(handler) is Object. |
4538 DCHECK(handler->IsJSReceiver()); | 4538 DCHECK(handler->IsJSReceiver()); |
4539 DCHECK(proxy->target()->IsJSReceiver()); | 4539 DCHECK(proxy->target()->IsJSReceiver()); |
4540 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. | 4540 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. |
4541 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 4541 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
4542 // 6. Let trap be ? GetMethod(handler, "has"). | 4542 // 6. Let trap be ? GetMethod(handler, "has"). |
(...skipping 155 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4698 | 4698 |
4699 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, | 4699 Maybe<bool> JSProxy::DeletePropertyOrElement(Handle<JSProxy> proxy, |
4700 Handle<Name> name, | 4700 Handle<Name> name, |
4701 LanguageMode language_mode) { | 4701 LanguageMode language_mode) { |
4702 ShouldThrow should_throw = | 4702 ShouldThrow should_throw = |
4703 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; | 4703 is_sloppy(language_mode) ? DONT_THROW : THROW_ON_ERROR; |
4704 Isolate* isolate = proxy->GetIsolate(); | 4704 Isolate* isolate = proxy->GetIsolate(); |
4705 Factory* factory = isolate->factory(); | 4705 Factory* factory = isolate->factory(); |
4706 Handle<String> trap_name = factory->deleteProperty_string(); | 4706 Handle<String> trap_name = factory->deleteProperty_string(); |
4707 | 4707 |
4708 if (IsRevoked(proxy)) { | 4708 if (proxy->IsRevoked()) { |
4709 isolate->Throw( | 4709 isolate->Throw( |
4710 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); | 4710 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); |
4711 return Nothing<bool>(); | 4711 return Nothing<bool>(); |
4712 } | 4712 } |
4713 | 4713 |
4714 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 4714 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
4715 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); | 4715 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); |
4716 | 4716 |
4717 Handle<Object> trap; | 4717 Handle<Object> trap; |
4718 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), | 4718 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), |
(...skipping 24 matching lines...) Expand all Loading... |
4743 MessageTemplate::kProxyDeletePropertyViolatesInvariant, name)); | 4743 MessageTemplate::kProxyDeletePropertyViolatesInvariant, name)); |
4744 return Nothing<bool>(); | 4744 return Nothing<bool>(); |
4745 } | 4745 } |
4746 return Just(true); | 4746 return Just(true); |
4747 } | 4747 } |
4748 | 4748 |
4749 | 4749 |
4750 // static | 4750 // static |
4751 MaybeHandle<Context> JSProxy::GetFunctionRealm(Handle<JSProxy> proxy) { | 4751 MaybeHandle<Context> JSProxy::GetFunctionRealm(Handle<JSProxy> proxy) { |
4752 DCHECK(proxy->map()->is_constructor()); | 4752 DCHECK(proxy->map()->is_constructor()); |
4753 if (JSProxy::IsRevoked(proxy)) { | 4753 if (proxy->IsRevoked()) { |
4754 THROW_NEW_ERROR(proxy->GetIsolate(), | 4754 THROW_NEW_ERROR(proxy->GetIsolate(), |
4755 NewTypeError(MessageTemplate::kProxyRevoked), Context); | 4755 NewTypeError(MessageTemplate::kProxyRevoked), Context); |
4756 } | 4756 } |
4757 | 4757 |
4758 // TODO(verwaest): Get rid of JSFunctionProxies. | 4758 // TODO(verwaest): Get rid of JSFunctionProxies. |
4759 Object* target = proxy->IsJSFunctionProxy() | 4759 Object* target = proxy->IsJSFunctionProxy() |
4760 ? JSFunctionProxy::cast(*proxy)->construct_trap() | 4760 ? JSFunctionProxy::cast(*proxy)->construct_trap() |
4761 : proxy->target(); | 4761 : proxy->target(); |
4762 return JSReceiver::GetFunctionRealm(handle(JSReceiver::cast(target))); | 4762 return JSReceiver::GetFunctionRealm(handle(JSReceiver::cast(target))); |
4763 } | 4763 } |
(...skipping 34 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
4798 PropertyDescriptor desc; | 4798 PropertyDescriptor desc; |
4799 bool found = JSProxy::GetOwnPropertyDescriptor(it, &desc); | 4799 bool found = JSProxy::GetOwnPropertyDescriptor(it, &desc); |
4800 if (isolate->has_pending_exception()) return Nothing<PropertyAttributes>(); | 4800 if (isolate->has_pending_exception()) return Nothing<PropertyAttributes>(); |
4801 if (!found) return Just(ABSENT); | 4801 if (!found) return Just(ABSENT); |
4802 return Just(desc.ToAttributes()); | 4802 return Just(desc.ToAttributes()); |
4803 } | 4803 } |
4804 | 4804 |
4805 | 4805 |
4806 MaybeHandle<Object> JSProxy::GetTrap(Handle<JSProxy> proxy, | 4806 MaybeHandle<Object> JSProxy::GetTrap(Handle<JSProxy> proxy, |
4807 Handle<String> trap) { | 4807 Handle<String> trap) { |
4808 DCHECK(!IsRevoked(proxy)); | 4808 DCHECK(!proxy->IsRevoked()); |
4809 Isolate* isolate = proxy->GetIsolate(); | 4809 Isolate* isolate = proxy->GetIsolate(); |
4810 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); | 4810 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); |
4811 return Object::GetMethod(handler, trap); | 4811 return Object::GetMethod(handler, trap); |
4812 } | 4812 } |
4813 | 4813 |
4814 | 4814 |
4815 MaybeHandle<Object> JSProxy::CallTrap(Handle<JSProxy> proxy, | 4815 MaybeHandle<Object> JSProxy::CallTrap(Handle<JSProxy> proxy, |
4816 const char* name, | 4816 const char* name, |
4817 Handle<Object> derived, | 4817 Handle<Object> derived, |
4818 int argc, | 4818 int argc, |
(...skipping 1955 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6774 isolate->Throw(*isolate->factory()->NewTypeError( | 6774 isolate->Throw(*isolate->factory()->NewTypeError( |
6775 MessageTemplate::kStrictDeleteProperty, | 6775 MessageTemplate::kStrictDeleteProperty, |
6776 isolate->factory()->NewNumberFromUint(actual_new_len - 1), a)); | 6776 isolate->factory()->NewNumberFromUint(actual_new_len - 1), a)); |
6777 } | 6777 } |
6778 return success; | 6778 return success; |
6779 } | 6779 } |
6780 | 6780 |
6781 | 6781 |
6782 // ES6 9.5.6 | 6782 // ES6 9.5.6 |
6783 // static | 6783 // static |
6784 bool JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> object, | 6784 bool JSProxy::DefineOwnProperty(Isolate* isolate, Handle<JSProxy> proxy, |
6785 Handle<Object> key, PropertyDescriptor* desc, | 6785 Handle<Object> key, PropertyDescriptor* desc, |
6786 ShouldThrow should_throw) { | 6786 ShouldThrow should_throw) { |
| 6787 Handle<String> trap_name = isolate->factory()->defineProperty_string(); |
6787 // 1. Assert: IsPropertyKey(P) is true. | 6788 // 1. Assert: IsPropertyKey(P) is true. |
6788 DCHECK(key->IsName() || key->IsNumber()); | 6789 DCHECK(key->IsName() || key->IsNumber()); |
6789 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 6790 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
6790 Handle<Object> handler(object->handler(), isolate); | 6791 Handle<Object> handler(proxy->handler(), isolate); |
6791 // 3. If handler is null, throw a TypeError exception. | 6792 // 3. If handler is null, throw a TypeError exception. |
6792 // TODO(jkummerow): Use "IsRevoked()" instead once we have it. | 6793 if (proxy->IsRevoked()) { |
6793 if (handler->IsNull()) { | |
6794 isolate->Throw(*isolate->factory()->NewTypeError( | 6794 isolate->Throw(*isolate->factory()->NewTypeError( |
6795 MessageTemplate::kProxyHandlerNonObject)); | 6795 MessageTemplate::kProxyRevoked, trap_name)); |
6796 return false; | 6796 return false; |
6797 } | 6797 } |
6798 // 4. Assert: Type(handler) is Object. | 6798 // 4. Assert: Type(handler) is Object. |
6799 DCHECK(handler->IsJSReceiver()); | 6799 DCHECK(handler->IsJSReceiver()); |
6800 // If the handler is not null, the target can't be null either. | 6800 // If the handler is not null, the target can't be null either. |
6801 DCHECK(object->target()->IsSpecObject()); | 6801 DCHECK(proxy->target()->IsSpecObject()); |
6802 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. | 6802 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. |
6803 Handle<JSReceiver> target(JSReceiver::cast(object->target()), isolate); | 6803 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
6804 // 6. Let trap be ? GetMethod(handler, "defineProperty"). | 6804 // 6. Let trap be ? GetMethod(handler, "defineProperty"). |
6805 Handle<Object> trap; | 6805 Handle<Object> trap; |
6806 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 6806 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
6807 isolate, trap, | 6807 isolate, trap, |
6808 Object::GetMethod(Handle<JSReceiver>::cast(handler), | 6808 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false); |
6809 isolate->factory()->defineProperty_string()), | |
6810 false); | |
6811 // 7. If trap is undefined, then: | 6809 // 7. If trap is undefined, then: |
6812 if (trap->IsUndefined()) { | 6810 if (trap->IsUndefined()) { |
6813 // 7a. Return target.[[DefineOwnProperty]](P, Desc). | 6811 // 7a. Return target.[[DefineOwnProperty]](P, Desc). |
6814 return JSReceiver::DefineOwnProperty(isolate, target, key, desc, | 6812 return JSReceiver::DefineOwnProperty(isolate, target, key, desc, |
6815 should_throw); | 6813 should_throw); |
6816 } | 6814 } |
6817 // 8. Let descObj be FromPropertyDescriptor(Desc). | 6815 // 8. Let descObj be FromPropertyDescriptor(Desc). |
6818 Handle<Object> desc_obj = desc->ToObject(isolate); | 6816 Handle<Object> desc_obj = desc->ToObject(isolate); |
6819 // 9. Let booleanTrapResult be | 6817 // 9. Let booleanTrapResult be |
6820 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). | 6818 // ToBoolean(? Call(trap, handler, «target, P, descObj»)). |
(...skipping 140 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
6961 DCHECK(PropertyDescriptor::IsAccessorDescriptor(desc) != | 6959 DCHECK(PropertyDescriptor::IsAccessorDescriptor(desc) != |
6962 PropertyDescriptor::IsDataDescriptor(desc)); | 6960 PropertyDescriptor::IsDataDescriptor(desc)); |
6963 return true; | 6961 return true; |
6964 } | 6962 } |
6965 | 6963 |
6966 | 6964 |
6967 // ES6 9.5.5 | 6965 // ES6 9.5.5 |
6968 // static | 6966 // static |
6969 bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it, | 6967 bool JSProxy::GetOwnPropertyDescriptor(LookupIterator* it, |
6970 PropertyDescriptor* desc) { | 6968 PropertyDescriptor* desc) { |
6971 DCHECK(it->GetHolder<Object>()->IsJSProxy()); | 6969 Handle<JSProxy> proxy = it->GetHolder<JSProxy>(); |
6972 Isolate* isolate = it->isolate(); | 6970 Isolate* isolate = it->isolate(); |
| 6971 Handle<String> trap_name = |
| 6972 isolate->factory()->getOwnPropertyDescriptor_string(); |
6973 Handle<Name> property_name = it->GetName(); | 6973 Handle<Name> property_name = it->GetName(); |
6974 // 1. (Assert) | 6974 // 1. (Assert) |
6975 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 6975 // 2. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
6976 Handle<Object> handler(it->GetHolder<JSProxy>()->handler(), isolate); | 6976 Handle<Object> handler(proxy->handler(), isolate); |
6977 // 3. If handler is null, throw a TypeError exception. | 6977 // 3. If handler is null, throw a TypeError exception. |
6978 if (handler->IsNull()) { | 6978 if (proxy->IsRevoked()) { |
6979 isolate->Throw(*isolate->factory()->NewTypeError( | 6979 isolate->Throw(*isolate->factory()->NewTypeError( |
6980 MessageTemplate::kProxyHandlerNonObject)); | 6980 MessageTemplate::kProxyRevoked, trap_name)); |
6981 return false; | 6981 return false; |
6982 } | 6982 } |
6983 // 4. Assert: Type(handler) is Object. | 6983 // 4. Assert: Type(handler) is Object. |
6984 DCHECK(handler->IsSpecObject()); | 6984 DCHECK(handler->IsSpecObject()); |
6985 // If the handler is not null, the target can't be null either. | 6985 // If the handler is not null, the target can't be null either. |
6986 DCHECK(it->GetHolder<JSProxy>()->target()->IsSpecObject()); | 6986 DCHECK(it->GetHolder<JSProxy>()->target()->IsSpecObject()); |
6987 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. | 6987 // 5. Let target be the value of the [[ProxyTarget]] internal slot of O. |
6988 Handle<JSReceiver> target( | 6988 Handle<JSReceiver> target( |
6989 JSReceiver::cast(it->GetHolder<JSProxy>()->target()), isolate); | 6989 JSReceiver::cast(it->GetHolder<JSProxy>()->target()), isolate); |
6990 // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor"). | 6990 // 6. Let trap be ? GetMethod(handler, "getOwnPropertyDescriptor"). |
6991 Handle<Object> trap; | 6991 Handle<Object> trap; |
6992 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 6992 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
6993 isolate, trap, | 6993 isolate, trap, |
6994 Object::GetMethod(Handle<JSReceiver>::cast(handler), | 6994 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false); |
6995 isolate->factory()->getOwnPropertyDescriptor_string()), | |
6996 false); | |
6997 // 7. If trap is undefined, then | 6995 // 7. If trap is undefined, then |
6998 if (trap->IsUndefined()) { | 6996 if (trap->IsUndefined()) { |
6999 // 7a. Return target.[[GetOwnProperty]](P). | 6997 // 7a. Return target.[[GetOwnProperty]](P). |
7000 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, | 6998 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, |
7001 desc); | 6999 desc); |
7002 } | 7000 } |
7003 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»). | 7001 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»). |
7004 Handle<Object> trap_result_obj; | 7002 Handle<Object> trap_result_obj; |
7005 Handle<Object> args[] = {target, property_name}; | 7003 Handle<Object> args[] = {target, property_name}; |
7006 ASSIGN_RETURN_ON_EXCEPTION_VALUE( | 7004 ASSIGN_RETURN_ON_EXCEPTION_VALUE( |
(...skipping 219 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7226 should_throw); | 7224 should_throw); |
7227 } | 7225 } |
7228 | 7226 |
7229 | 7227 |
7230 Maybe<bool> JSProxy::PreventExtensions(Handle<JSProxy> proxy, | 7228 Maybe<bool> JSProxy::PreventExtensions(Handle<JSProxy> proxy, |
7231 ShouldThrow should_throw) { | 7229 ShouldThrow should_throw) { |
7232 Isolate* isolate = proxy->GetIsolate(); | 7230 Isolate* isolate = proxy->GetIsolate(); |
7233 Factory* factory = isolate->factory(); | 7231 Factory* factory = isolate->factory(); |
7234 Handle<String> trap_name = factory->preventExtensions_string(); | 7232 Handle<String> trap_name = factory->preventExtensions_string(); |
7235 | 7233 |
7236 if (IsRevoked(proxy)) { | 7234 if (proxy->IsRevoked()) { |
7237 isolate->Throw( | 7235 isolate->Throw( |
7238 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); | 7236 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); |
7239 return Nothing<bool>(); | 7237 return Nothing<bool>(); |
7240 } | 7238 } |
7241 | 7239 |
7242 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 7240 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
7243 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); | 7241 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); |
7244 | 7242 |
7245 Handle<Object> trap; | 7243 Handle<Object> trap; |
7246 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), | 7244 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), |
(...skipping 89 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
7336 } | 7334 } |
7337 return Just(JSObject::IsExtensible(Handle<JSObject>::cast(object))); | 7335 return Just(JSObject::IsExtensible(Handle<JSObject>::cast(object))); |
7338 } | 7336 } |
7339 | 7337 |
7340 | 7338 |
7341 Maybe<bool> JSProxy::IsExtensible(Handle<JSProxy> proxy) { | 7339 Maybe<bool> JSProxy::IsExtensible(Handle<JSProxy> proxy) { |
7342 Isolate* isolate = proxy->GetIsolate(); | 7340 Isolate* isolate = proxy->GetIsolate(); |
7343 Factory* factory = isolate->factory(); | 7341 Factory* factory = isolate->factory(); |
7344 Handle<String> trap_name = factory->isExtensible_string(); | 7342 Handle<String> trap_name = factory->isExtensible_string(); |
7345 | 7343 |
7346 if (IsRevoked(proxy)) { | 7344 if (proxy->IsRevoked()) { |
7347 isolate->Throw( | 7345 isolate->Throw( |
7348 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); | 7346 *factory->NewTypeError(MessageTemplate::kProxyRevoked, trap_name)); |
7349 return Nothing<bool>(); | 7347 return Nothing<bool>(); |
7350 } | 7348 } |
7351 | 7349 |
7352 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 7350 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
7353 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); | 7351 Handle<JSReceiver> handler(JSReceiver::cast(proxy->handler()), isolate); |
7354 | 7352 |
7355 Handle<Object> trap; | 7353 Handle<Object> trap; |
7356 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), | 7354 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, trap, GetTrap(proxy, trap_name), |
(...skipping 844 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8201 | 8199 |
8202 | 8200 |
8203 // ES6 9.5.11 | 8201 // ES6 9.5.11 |
8204 // Returns false in case of exception. | 8202 // Returns false in case of exception. |
8205 // static | 8203 // static |
8206 bool JSProxy::Enumerate(Isolate* isolate, Handle<JSReceiver> receiver, | 8204 bool JSProxy::Enumerate(Isolate* isolate, Handle<JSReceiver> receiver, |
8207 Handle<JSProxy> proxy, KeyAccumulator* accumulator) { | 8205 Handle<JSProxy> proxy, KeyAccumulator* accumulator) { |
8208 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 8206 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
8209 Handle<Object> handler(proxy->handler(), isolate); | 8207 Handle<Object> handler(proxy->handler(), isolate); |
8210 // 2. If handler is null, throw a TypeError exception. | 8208 // 2. If handler is null, throw a TypeError exception. |
8211 if (IsRevoked(proxy)) { | 8209 if (proxy->IsRevoked()) { |
8212 isolate->Throw(*isolate->factory()->NewTypeError( | 8210 isolate->Throw(*isolate->factory()->NewTypeError( |
8213 MessageTemplate::kProxyRevoked, | 8211 MessageTemplate::kProxyRevoked, |
8214 isolate->factory()->enumerate_string())); | 8212 isolate->factory()->enumerate_string())); |
8215 return false; | 8213 return false; |
8216 } | 8214 } |
8217 // 3. Assert: Type(handler) is Object. | 8215 // 3. Assert: Type(handler) is Object. |
8218 DCHECK(handler->IsJSReceiver()); | 8216 DCHECK(handler->IsJSReceiver()); |
8219 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O. | 8217 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O. |
8220 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 8218 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
8221 // 5. Let trap be ? GetMethod(handler, "enumerate"). | 8219 // 5. Let trap be ? GetMethod(handler, "enumerate"). |
(...skipping 87 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
8309 // Returns "false" in case of exception. | 8307 // Returns "false" in case of exception. |
8310 // TODO(jkummerow): |filter| and |enum_policy| are currently ignored. | 8308 // TODO(jkummerow): |filter| and |enum_policy| are currently ignored. |
8311 // static | 8309 // static |
8312 bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, | 8310 bool JSProxy::OwnPropertyKeys(Isolate* isolate, Handle<JSReceiver> receiver, |
8313 Handle<JSProxy> proxy, KeyFilter filter, | 8311 Handle<JSProxy> proxy, KeyFilter filter, |
8314 Enumerability enum_policy, | 8312 Enumerability enum_policy, |
8315 KeyAccumulator* accumulator) { | 8313 KeyAccumulator* accumulator) { |
8316 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. | 8314 // 1. Let handler be the value of the [[ProxyHandler]] internal slot of O. |
8317 Handle<Object> handler(proxy->handler(), isolate); | 8315 Handle<Object> handler(proxy->handler(), isolate); |
8318 // 2. If handler is null, throw a TypeError exception. | 8316 // 2. If handler is null, throw a TypeError exception. |
8319 if (IsRevoked(proxy)) { | 8317 if (proxy->IsRevoked()) { |
8320 isolate->Throw(*isolate->factory()->NewTypeError( | 8318 isolate->Throw(*isolate->factory()->NewTypeError( |
8321 MessageTemplate::kProxyRevoked, isolate->factory()->ownKeys_string())); | 8319 MessageTemplate::kProxyRevoked, isolate->factory()->ownKeys_string())); |
8322 return false; | 8320 return false; |
8323 } | 8321 } |
8324 // 3. Assert: Type(handler) is Object. | 8322 // 3. Assert: Type(handler) is Object. |
8325 DCHECK(handler->IsJSReceiver()); | 8323 DCHECK(handler->IsJSReceiver()); |
8326 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O. | 8324 // 4. Let target be the value of the [[ProxyTarget]] internal slot of O. |
8327 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); | 8325 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); |
8328 // 5. Let trap be ? GetMethod(handler, "ownKeys"). | 8326 // 5. Let trap be ? GetMethod(handler, "ownKeys"). |
8329 Handle<Object> trap; | 8327 Handle<Object> trap; |
(...skipping 10661 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
18991 if (cell->value() != *new_value) { | 18989 if (cell->value() != *new_value) { |
18992 cell->set_value(*new_value); | 18990 cell->set_value(*new_value); |
18993 Isolate* isolate = cell->GetIsolate(); | 18991 Isolate* isolate = cell->GetIsolate(); |
18994 cell->dependent_code()->DeoptimizeDependentCodeGroup( | 18992 cell->dependent_code()->DeoptimizeDependentCodeGroup( |
18995 isolate, DependentCode::kPropertyCellChangedGroup); | 18993 isolate, DependentCode::kPropertyCellChangedGroup); |
18996 } | 18994 } |
18997 } | 18995 } |
18998 | 18996 |
18999 } // namespace internal | 18997 } // namespace internal |
19000 } // namespace v8 | 18998 } // namespace v8 |
OLD | NEW |