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

Side by Side Diff: src/objects.cc

Issue 1417063011: [runtime] support new Proxy() instead of Proxy.create and install getPrototypeOf trap (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: adding proxy trap strings Created 5 years, 1 month 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 827 matching lines...) Expand 10 before | Expand all | Expand 10 after
838 Handle<FixedArray> elems(FixedArray::cast(object->elements()), isolate); 838 Handle<FixedArray> elems(FixedArray::cast(object->elements()), isolate);
839 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems; 839 if (elems->map() != isolate->heap()->fixed_cow_array_map()) return elems;
840 Handle<FixedArray> writable_elems = isolate->factory()->CopyFixedArrayWithMap( 840 Handle<FixedArray> writable_elems = isolate->factory()->CopyFixedArrayWithMap(
841 elems, isolate->factory()->fixed_array_map()); 841 elems, isolate->factory()->fixed_array_map());
842 object->set_elements(*writable_elems); 842 object->set_elements(*writable_elems);
843 isolate->counters()->cow_arrays_converted()->Increment(); 843 isolate->counters()->cow_arrays_converted()->Increment();
844 return writable_elems; 844 return writable_elems;
845 } 845 }
846 846
847 847
848 // static
Jakob Kummerow 2015/11/12 12:04:24 Please also mention the spec chapter: // ES6 9.5.1
849 MaybeHandle<Object> JSProxy::GetPrototype(Handle<JSProxy> proxy) {
850 Isolate* isolate = proxy->GetIsolate();
851 // 1. Let handler be the value of the [[ProxyHandler]] internal slot.
852 Handle<Object> raw_handler(proxy->handler(), isolate);
853 // 2. If handler is null, throw a TypeError exception.
Jakob Kummerow 2015/11/12 12:04:24 nit: drop a space before "If"
854 // 3. Assert: Type(handler) is Object.
855 if (!raw_handler->IsSpecObject()) {
856 // TODO(cbruni): throw correct error message
Jakob Kummerow 2015/11/12 12:04:24 nit: comments, including TODOs, should begin capit
857 THROW_NEW_ERROR(
858 isolate, NewTypeError(MessageTemplate::kProxyHandlerNonObject), Object);
859 }
860 Handle<JSReceiver> handler = Handle<JSReceiver>::cast(raw_handler);
861 // 4. Let target be the value of the [[ProxyTarget]] internal slot.
862 // TODO(cbruni): Probably change the type of target to JSObject directly
Jakob Kummerow 2015/11/12 12:04:24 Can a target not be another Proxy? :-)
Camillo Bruni 2015/11/12 20:20:55 changed to JSReceiver
863 Handle<JSObject> target(JSObject::cast(proxy->target()), isolate);
864 // 5. Let trap be ? GetMethod(handler, "getPrototypeOf").
865 Handle<Object> trap;
866 Handle<String> trap_name = isolate->factory()->getPrototypeOf_string();
867 ASSIGN_RETURN_ON_EXCEPTION(isolate, trap, GetMethod(handler, trap_name),
868 Object);
869 // 6. If trap is undefined, then return target.[[GetPrototypeOf]]().
870 if (trap->IsUndefined()) {
871 return Object::GetPrototype(isolate, target);
872 }
873 // 7. Let handlerProto be ? Call(trap, handler, «target»).
874 Handle<Object> argv[] = {target};
875 Handle<Object> handler_proto;
876 ASSIGN_RETURN_ON_EXCEPTION(
877 isolate, handler_proto,
878 Execution::Call(isolate, trap, handler, arraysize(argv), argv), Object);
879 // 8. If Type(handlerProto) is either Object nor Null, throw a TypeError.
Jakob Kummerow 2015/11/12 12:04:24 s/either/neither/
880 if (!handler_proto->IsSpecObject() || !handler_proto->IsNull()) {
Jakob Kummerow 2015/11/12 12:04:24 s/||/&&/
881 THROW_NEW_ERROR(isolate,
882 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing,
883 handler, trap_name),
884 Object);
885 }
886 // 9. Let extensibleTarget be ? IsExtensible(target).
887 // 10. If extensibleTarget is true, return handlerProto.
888 if (JSObject::IsExtensible(target)) return handler_proto;
889 // 11. Let targetProto be ? target.[[GetPrototypeOf]]().
890 Handle<Object> target_proto;
891 ASSIGN_RETURN_ON_EXCEPTION(isolate, handler_proto,
892 Object::GetPrototype(isolate, target), Object);
893 // 12. If SameValue(handlerProto, targetProto) is false, throw a TypeError.
894 if (!handler_proto->SameValue(*target_proto)) {
895 THROW_NEW_ERROR(isolate,
896 NewTypeError(MessageTemplate::kProxyHandlerTrapMissing,
897 handler, trap_name),
898 Object);
899 }
900 // 13. Return handlerProto.
901 return handler_proto;
902 }
903
Jakob Kummerow 2015/11/12 12:04:24 nit: two blank lines
848 MaybeHandle<Object> JSProxy::GetPropertyWithHandler(Handle<JSProxy> proxy, 904 MaybeHandle<Object> JSProxy::GetPropertyWithHandler(Handle<JSProxy> proxy,
849 Handle<Object> receiver, 905 Handle<Object> receiver,
850 Handle<Name> name) { 906 Handle<Name> name) {
851 Isolate* isolate = proxy->GetIsolate(); 907 Isolate* isolate = proxy->GetIsolate();
852 908
853 // TODO(rossberg): adjust once there is a story for symbols vs proxies. 909 // TODO(rossberg): adjust once there is a story for symbols vs proxies.
854 if (name->IsSymbol()) return isolate->factory()->undefined_value(); 910 if (name->IsSymbol()) return isolate->factory()->undefined_value();
855 911
856 Handle<Object> args[] = { receiver, name }; 912 Handle<Object> args[] = { receiver, name };
857 return CallTrap( 913 return CallTrap(
(...skipping 7196 matching lines...) Expand 10 before | Expand all | Expand 10 after
8054 } 8110 }
8055 8111
8056 return result; 8112 return result;
8057 } 8113 }
8058 8114
8059 8115
8060 Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) { 8116 Handle<Map> Map::CopyDropDescriptors(Handle<Map> map) {
8061 Handle<Map> result = RawCopy(map, map->instance_size()); 8117 Handle<Map> result = RawCopy(map, map->instance_size());
8062 8118
8063 // Please note instance_type and instance_size are set when allocated. 8119 // Please note instance_type and instance_size are set when allocated.
8064 result->SetInObjectProperties(map->GetInObjectProperties()); 8120 if (map->IsJSObjectMap()) {
8065 result->set_unused_property_fields(map->unused_property_fields()); 8121 result->SetInObjectProperties(map->GetInObjectProperties());
8066 8122 result->set_unused_property_fields(map->unused_property_fields());
8123 }
8067 result->ClearCodeCache(map->GetHeap()); 8124 result->ClearCodeCache(map->GetHeap());
8068 map->NotifyLeafMapLayoutChange(); 8125 map->NotifyLeafMapLayoutChange();
8069 return result; 8126 return result;
8070 } 8127 }
8071 8128
8072 8129
8073 Handle<Map> Map::ShareDescriptor(Handle<Map> map, 8130 Handle<Map> Map::ShareDescriptor(Handle<Map> map,
8074 Handle<DescriptorArray> descriptors, 8131 Handle<DescriptorArray> descriptors,
8075 Descriptor* descriptor) { 8132 Descriptor* descriptor) {
8076 // Sanity check. This path is only to be taken if the map owns its descriptor 8133 // Sanity check. This path is only to be taken if the map owns its descriptor
(...skipping 5838 matching lines...) Expand 10 before | Expand all | Expand 10 after
13915 13972
13916 13973
13917 Maybe<bool> JSObject::SetPrototype(Handle<JSObject> object, 13974 Maybe<bool> JSObject::SetPrototype(Handle<JSObject> object,
13918 Handle<Object> value, bool from_javascript, 13975 Handle<Object> value, bool from_javascript,
13919 ShouldThrow should_throw) { 13976 ShouldThrow should_throw) {
13920 Isolate* isolate = object->GetIsolate(); 13977 Isolate* isolate = object->GetIsolate();
13921 13978
13922 const bool observed = from_javascript && object->map()->is_observed(); 13979 const bool observed = from_javascript && object->map()->is_observed();
13923 Handle<Object> old_value; 13980 Handle<Object> old_value;
13924 if (observed) { 13981 if (observed) {
13925 old_value = Object::GetPrototype(isolate, object); 13982 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, old_value,
13983 Object::GetPrototype(isolate, object),
13984 Nothing<bool>());
13926 } 13985 }
13927 13986
13928 Maybe<bool> result = 13987 Maybe<bool> result =
13929 SetPrototypeUnobserved(object, value, from_javascript, should_throw); 13988 SetPrototypeUnobserved(object, value, from_javascript, should_throw);
13930 MAYBE_RETURN(result, Nothing<bool>()); 13989 MAYBE_RETURN(result, Nothing<bool>());
13931 13990
13932 if (result.FromJust() && observed) { 13991 if (result.FromJust() && observed) {
13933 Handle<Object> new_value = Object::GetPrototype(isolate, object); 13992 Handle<Object> new_value;
13993 ASSIGN_RETURN_ON_EXCEPTION_VALUE(isolate, new_value,
13994 Object::GetPrototype(isolate, object),
13995 Nothing<bool>());
13934 if (!new_value->SameValue(*old_value)) { 13996 if (!new_value->SameValue(*old_value)) {
13935 RETURN_ON_EXCEPTION_VALUE( 13997 RETURN_ON_EXCEPTION_VALUE(
13936 isolate, JSObject::EnqueueChangeRecord( 13998 isolate, JSObject::EnqueueChangeRecord(
13937 object, "setPrototype", 13999 object, "setPrototype",
13938 isolate->factory()->proto_string(), old_value), 14000 isolate->factory()->proto_string(), old_value),
13939 Nothing<bool>()); 14001 Nothing<bool>());
13940 } 14002 }
13941 } 14003 }
13942 14004
13943 return result; 14005 return result;
(...skipping 3938 matching lines...) Expand 10 before | Expand all | Expand 10 after
17882 if (cell->value() != *new_value) { 17944 if (cell->value() != *new_value) {
17883 cell->set_value(*new_value); 17945 cell->set_value(*new_value);
17884 Isolate* isolate = cell->GetIsolate(); 17946 Isolate* isolate = cell->GetIsolate();
17885 cell->dependent_code()->DeoptimizeDependentCodeGroup( 17947 cell->dependent_code()->DeoptimizeDependentCodeGroup(
17886 isolate, DependentCode::kPropertyCellChangedGroup); 17948 isolate, DependentCode::kPropertyCellChangedGroup);
17887 } 17949 }
17888 } 17950 }
17889 17951
17890 } // namespace internal 17952 } // namespace internal
17891 } // namespace v8 17953 } // namespace v8
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698