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

Side by Side Diff: src/objects.cc

Issue 1476403004: Remove Object::IsSpecObject, use Object::IsJSReceiver instead. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Rebase. 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
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('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 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 840 matching lines...) Expand 10 before | Expand all | Expand 10 after
851 851
852 852
853 // ES6 9.5.1 853 // ES6 9.5.1
854 // static 854 // static
855 MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) { 855 MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) {
856 Isolate* isolate = proxy->GetIsolate(); 856 Isolate* isolate = proxy->GetIsolate();
857 // 1. Let handler be the value of the [[ProxyHandler]] internal slot. 857 // 1. Let handler be the value of the [[ProxyHandler]] internal slot.
858 Handle<Object> raw_handler(proxy->handler(), isolate); 858 Handle<Object> raw_handler(proxy->handler(), isolate);
859 // 2. If handler is null, throw a TypeError exception. 859 // 2. If handler is null, throw a TypeError exception.
860 // 3. Assert: Type(handler) is Object. 860 // 3. Assert: Type(handler) is Object.
861 if (!raw_handler->IsSpecObject()) { 861 if (!raw_handler->IsJSReceiver()) {
862 // TODO(cbruni): Throw correct error message. 862 // TODO(cbruni): Throw correct error message.
863 THROW_NEW_ERROR( 863 THROW_NEW_ERROR(
864 isolate, NewTypeError(MessageTemplate::kProxyHandlerNonObject), Object); 864 isolate, NewTypeError(MessageTemplate::kProxyHandlerNonObject), Object);
865 } 865 }
866 Handle<JSReceiver> handler = Handle<JSReceiver>::cast(raw_handler); 866 Handle<JSReceiver> handler = Handle<JSReceiver>::cast(raw_handler);
867 // 4. Let target be the value of the [[ProxyTarget]] internal slot. 867 // 4. Let target be the value of the [[ProxyTarget]] internal slot.
868 // TODO(cbruni): Change target type to JSReceiver by default. 868 // TODO(cbruni): Change target type to JSReceiver by default.
869 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate); 869 Handle<JSReceiver> target(JSReceiver::cast(proxy->target()), isolate);
870 // 5. Let trap be ? GetMethod(handler, "getPrototypeOf"). 870 // 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
871 Handle<Object> trap; 871 Handle<Object> trap;
872 Handle<String> trap_name = isolate->factory()->getPrototypeOf_string(); 872 Handle<String> trap_name = isolate->factory()->getPrototypeOf_string();
873 ASSIGN_RETURN_ON_EXCEPTION(isolate, trap, GetMethod(handler, trap_name), 873 ASSIGN_RETURN_ON_EXCEPTION(isolate, trap, GetMethod(handler, trap_name),
874 Object); 874 Object);
875 // 6. If trap is undefined, then return target.[[GetPrototypeOf]](). 875 // 6. If trap is undefined, then return target.[[GetPrototypeOf]]().
876 if (trap->IsUndefined()) { 876 if (trap->IsUndefined()) {
877 return Object::GetPrototype(isolate, target); 877 return Object::GetPrototype(isolate, target);
878 } 878 }
879 // 7. Let handlerProto be ? Call(trap, handler, «target»). 879 // 7. Let handlerProto be ? Call(trap, handler, «target»).
880 Handle<Object> argv[] = {target}; 880 Handle<Object> argv[] = {target};
881 Handle<Object> handler_proto; 881 Handle<Object> handler_proto;
882 ASSIGN_RETURN_ON_EXCEPTION( 882 ASSIGN_RETURN_ON_EXCEPTION(
883 isolate, handler_proto, 883 isolate, handler_proto,
884 Execution::Call(isolate, trap, handler, arraysize(argv), argv), Object); 884 Execution::Call(isolate, trap, handler, arraysize(argv), argv), Object);
885 // 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError. 885 // 8. If Type(handlerProto) is neither Object nor Null, throw a TypeError.
886 if (!(handler_proto->IsSpecObject() || handler_proto->IsNull())) { 886 if (!(handler_proto->IsJSReceiver() || handler_proto->IsNull())) {
887 THROW_NEW_ERROR(isolate, 887 THROW_NEW_ERROR(isolate,
888 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing, 888 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing,
889 handler, trap_name), 889 handler, trap_name),
890 Object); 890 Object);
891 } 891 }
892 // 9. Let extensibleTarget be ? IsExtensible(target). 892 // 9. Let extensibleTarget be ? IsExtensible(target).
893 Maybe<bool> is_extensible = JSReceiver::IsExtensible(target); 893 Maybe<bool> is_extensible = JSReceiver::IsExtensible(target);
894 if (is_extensible.IsNothing()) return MaybeHandle<Object>(); 894 if (is_extensible.IsNothing()) return MaybeHandle<Object>();
895 // 10. If extensibleTarget is true, return handlerProto. 895 // 10. If extensibleTarget is true, return handlerProto.
896 if (is_extensible.FromJust()) return handler_proto; 896 if (is_extensible.FromJust()) return handler_proto;
(...skipping 5182 matching lines...) Expand 10 before | Expand all | Expand 10 after
6079 return Object::ToString(isolate, key); 6079 return Object::ToString(isolate, key);
6080 } 6080 }
6081 6081
6082 6082
6083 // ES6 19.1.2.4 6083 // ES6 19.1.2.4
6084 // static 6084 // static
6085 Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object, 6085 Object* JSReceiver::DefineProperty(Isolate* isolate, Handle<Object> object,
6086 Handle<Object> key, 6086 Handle<Object> key,
6087 Handle<Object> attributes) { 6087 Handle<Object> attributes) {
6088 // 1. If Type(O) is not Object, throw a TypeError exception. 6088 // 1. If Type(O) is not Object, throw a TypeError exception.
6089 if (!object->IsSpecObject()) { 6089 if (!object->IsJSReceiver()) {
6090 Handle<String> fun_name = 6090 Handle<String> fun_name =
6091 isolate->factory()->InternalizeUtf8String("Object.defineProperty"); 6091 isolate->factory()->InternalizeUtf8String("Object.defineProperty");
6092 THROW_NEW_ERROR_RETURN_FAILURE( 6092 THROW_NEW_ERROR_RETURN_FAILURE(
6093 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name)); 6093 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name));
6094 } 6094 }
6095 // 2. Let key be ToPropertyKey(P). 6095 // 2. Let key be ToPropertyKey(P).
6096 // 3. ReturnIfAbrupt(key). 6096 // 3. ReturnIfAbrupt(key).
6097 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, ToPropertyKey(isolate, key)); 6097 ASSIGN_RETURN_FAILURE_ON_EXCEPTION(isolate, key, ToPropertyKey(isolate, key));
6098 // 4. Let desc be ToPropertyDescriptor(Attributes). 6098 // 4. Let desc be ToPropertyDescriptor(Attributes).
6099 // 5. ReturnIfAbrupt(desc). 6099 // 5. ReturnIfAbrupt(desc).
(...skipping 10 matching lines...) Expand all
6110 // 8. Return O. 6110 // 8. Return O.
6111 return *object; 6111 return *object;
6112 } 6112 }
6113 6113
6114 6114
6115 // ES6 19.1.2.3.1 6115 // ES6 19.1.2.3.1
6116 // static 6116 // static
6117 Object* JSReceiver::DefineProperties(Isolate* isolate, Handle<Object> object, 6117 Object* JSReceiver::DefineProperties(Isolate* isolate, Handle<Object> object,
6118 Handle<Object> properties) { 6118 Handle<Object> properties) {
6119 // 1. If Type(O) is not Object, throw a TypeError exception. 6119 // 1. If Type(O) is not Object, throw a TypeError exception.
6120 if (!object->IsSpecObject()) { 6120 if (!object->IsJSReceiver()) {
6121 Handle<String> fun_name = 6121 Handle<String> fun_name =
6122 isolate->factory()->InternalizeUtf8String("Object.defineProperties"); 6122 isolate->factory()->InternalizeUtf8String("Object.defineProperties");
6123 THROW_NEW_ERROR_RETURN_FAILURE( 6123 THROW_NEW_ERROR_RETURN_FAILURE(
6124 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name)); 6124 isolate, NewTypeError(MessageTemplate::kCalledOnNonObject, fun_name));
6125 } 6125 }
6126 // 2. Let props be ToObject(Properties). 6126 // 2. Let props be ToObject(Properties).
6127 // 3. ReturnIfAbrupt(props). 6127 // 3. ReturnIfAbrupt(props).
6128 Handle<JSReceiver> props; 6128 Handle<JSReceiver> props;
6129 if (!Object::ToObject(isolate, properties).ToHandle(&props)) { 6129 if (!Object::ToObject(isolate, properties).ToHandle(&props)) {
6130 THROW_NEW_ERROR_RETURN_FAILURE( 6130 THROW_NEW_ERROR_RETURN_FAILURE(
(...skipping 660 matching lines...) Expand 10 before | Expand all | Expand 10 after
6791 Handle<Object> handler(proxy->handler(), isolate); 6791 Handle<Object> handler(proxy->handler(), isolate);
6792 // 3. If handler is null, throw a TypeError exception. 6792 // 3. If handler is null, throw a TypeError exception.
6793 if (proxy->IsRevoked()) { 6793 if (proxy->IsRevoked()) {
6794 isolate->Throw(*isolate->factory()->NewTypeError( 6794 isolate->Throw(*isolate->factory()->NewTypeError(
6795 MessageTemplate::kProxyRevoked, trap_name)); 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(proxy->target()->IsSpecObject()); 6801 DCHECK(proxy->target()->IsJSReceiver());
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(proxy->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), trap_name), false); 6808 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false);
6809 // 7. If trap is undefined, then: 6809 // 7. If trap is undefined, then:
6810 if (trap->IsUndefined()) { 6810 if (trap->IsUndefined()) {
6811 // 7a. Return target.[[DefineOwnProperty]](P, Desc). 6811 // 7a. Return target.[[DefineOwnProperty]](P, Desc).
(...skipping 162 matching lines...) Expand 10 before | Expand all | Expand 10 after
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(proxy->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 (proxy->IsRevoked()) { 6978 if (proxy->IsRevoked()) {
6979 isolate->Throw(*isolate->factory()->NewTypeError( 6979 isolate->Throw(*isolate->factory()->NewTypeError(
6980 MessageTemplate::kProxyRevoked, trap_name)); 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->IsJSReceiver());
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()->IsJSReceiver());
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), trap_name), false); 6994 Object::GetMethod(Handle<JSReceiver>::cast(handler), trap_name), false);
6995 // 7. If trap is undefined, then 6995 // 7. If trap is undefined, then
6996 if (trap->IsUndefined()) { 6996 if (trap->IsUndefined()) {
6997 // 7a. Return target.[[GetOwnProperty]](P). 6997 // 7a. Return target.[[GetOwnProperty]](P).
6998 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, 6998 return JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name,
6999 desc); 6999 desc);
7000 } 7000 }
7001 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»). 7001 // 8. Let trapResultObj be ? Call(trap, handler, «target, P»).
7002 Handle<Object> trap_result_obj; 7002 Handle<Object> trap_result_obj;
7003 Handle<Object> args[] = {target, property_name}; 7003 Handle<Object> args[] = {target, property_name};
7004 ASSIGN_RETURN_ON_EXCEPTION_VALUE( 7004 ASSIGN_RETURN_ON_EXCEPTION_VALUE(
7005 isolate, trap_result_obj, 7005 isolate, trap_result_obj,
7006 Execution::Call(isolate, trap, handler, arraysize(args), args), false); 7006 Execution::Call(isolate, trap, handler, arraysize(args), args), false);
7007 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a 7007 // 9. If Type(trapResultObj) is neither Object nor Undefined, throw a
7008 // TypeError exception. 7008 // TypeError exception.
7009 if (!trap_result_obj->IsSpecObject() && !trap_result_obj->IsUndefined()) { 7009 if (!trap_result_obj->IsJSReceiver() && !trap_result_obj->IsUndefined()) {
7010 isolate->Throw(*isolate->factory()->NewTypeError( 7010 isolate->Throw(*isolate->factory()->NewTypeError(
7011 MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj, 7011 MessageTemplate::kProxyHandlerReturned, handler, trap_result_obj,
7012 property_name)); 7012 property_name));
7013 return false; 7013 return false;
7014 } 7014 }
7015 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P). 7015 // 10. Let targetDesc be ? target.[[GetOwnProperty]](P).
7016 PropertyDescriptor target_desc; 7016 PropertyDescriptor target_desc;
7017 JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name, 7017 JSReceiver::GetOwnPropertyDescriptor(isolate, target, property_name,
7018 &target_desc); 7018 &target_desc);
7019 if (isolate->has_pending_exception()) return false; 7019 if (isolate->has_pending_exception()) return false;
(...skipping 11969 matching lines...) Expand 10 before | Expand all | Expand 10 after
18989 if (cell->value() != *new_value) { 18989 if (cell->value() != *new_value) {
18990 cell->set_value(*new_value); 18990 cell->set_value(*new_value);
18991 Isolate* isolate = cell->GetIsolate(); 18991 Isolate* isolate = cell->GetIsolate();
18992 cell->dependent_code()->DeoptimizeDependentCodeGroup( 18992 cell->dependent_code()->DeoptimizeDependentCodeGroup(
18993 isolate, DependentCode::kPropertyCellChangedGroup); 18993 isolate, DependentCode::kPropertyCellChangedGroup);
18994 } 18994 }
18995 } 18995 }
18996 18996
18997 } // namespace internal 18997 } // namespace internal
18998 } // namespace v8 18998 } // namespace v8
OLDNEW
« no previous file with comments | « src/objects.h ('k') | src/objects-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698