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

Side by Side Diff: src/objects.h

Issue 227573002: Return MaybeHandle from SetElement and DeleteElement. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 8 months 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 | Annotate | Revision Log
« no previous file with comments | « src/liveedit.cc ('k') | src/objects.cc » ('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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 2033 matching lines...) Expand 10 before | Expand all | Expand 10 after
2044 static inline JSReceiver* cast(Object* obj); 2044 static inline JSReceiver* cast(Object* obj);
2045 2045
2046 // Implementation of [[Put]], ECMA-262 5th edition, section 8.12.5. 2046 // Implementation of [[Put]], ECMA-262 5th edition, section 8.12.5.
2047 MUST_USE_RESULT static MaybeHandle<Object> SetProperty( 2047 MUST_USE_RESULT static MaybeHandle<Object> SetProperty(
2048 Handle<JSReceiver> object, 2048 Handle<JSReceiver> object,
2049 Handle<Name> key, 2049 Handle<Name> key,
2050 Handle<Object> value, 2050 Handle<Object> value,
2051 PropertyAttributes attributes, 2051 PropertyAttributes attributes,
2052 StrictMode strict_mode, 2052 StrictMode strict_mode,
2053 StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED); 2053 StoreFromKeyed store_mode = MAY_BE_STORE_FROM_KEYED);
2054 static Handle<Object> SetElement(Handle<JSReceiver> object, 2054 MUST_USE_RESULT static MaybeHandle<Object> SetElement(
2055 uint32_t index, 2055 Handle<JSReceiver> object,
2056 Handle<Object> value, 2056 uint32_t index,
2057 PropertyAttributes attributes, 2057 Handle<Object> value,
2058 StrictMode strict_mode); 2058 PropertyAttributes attributes,
2059 StrictMode strict_mode);
2059 2060
2060 // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6. 2061 // Implementation of [[HasProperty]], ECMA-262 5th edition, section 8.12.6.
2061 static inline bool HasProperty(Handle<JSReceiver> object, Handle<Name> name); 2062 static inline bool HasProperty(Handle<JSReceiver> object, Handle<Name> name);
2062 static inline bool HasLocalProperty(Handle<JSReceiver>, Handle<Name> name); 2063 static inline bool HasLocalProperty(Handle<JSReceiver>, Handle<Name> name);
2063 static inline bool HasElement(Handle<JSReceiver> object, uint32_t index); 2064 static inline bool HasElement(Handle<JSReceiver> object, uint32_t index);
2064 static inline bool HasLocalElement(Handle<JSReceiver> object, uint32_t index); 2065 static inline bool HasLocalElement(Handle<JSReceiver> object, uint32_t index);
2065 2066
2066 // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7. 2067 // Implementation of [[Delete]], ECMA-262 5th edition, section 8.12.7.
2067 static Handle<Object> DeleteProperty(Handle<JSReceiver> object, 2068 MUST_USE_RESULT static MaybeHandle<Object> DeleteProperty(
2068 Handle<Name> name, 2069 Handle<JSReceiver> object,
2069 DeleteMode mode = NORMAL_DELETION); 2070 Handle<Name> name,
2070 static Handle<Object> DeleteElement(Handle<JSReceiver> object, 2071 DeleteMode mode = NORMAL_DELETION);
2071 uint32_t index, 2072 MUST_USE_RESULT static MaybeHandle<Object> DeleteElement(
2072 DeleteMode mode = NORMAL_DELETION); 2073 Handle<JSReceiver> object,
2074 uint32_t index,
2075 DeleteMode mode = NORMAL_DELETION);
2073 2076
2074 // Tests for the fast common case for property enumeration. 2077 // Tests for the fast common case for property enumeration.
2075 bool IsSimpleEnum(); 2078 bool IsSimpleEnum();
2076 2079
2077 // Returns the class name ([[Class]] property in the specification). 2080 // Returns the class name ([[Class]] property in the specification).
2078 String* class_name(); 2081 String* class_name();
2079 2082
2080 // Returns the constructor name (the name (possibly, inferred name) of the 2083 // Returns the constructor name (the name (possibly, inferred name) of the
2081 // function that was used to instantiate the object). 2084 // function that was used to instantiate the object).
2082 String* constructor_name(); 2085 String* constructor_name();
(...skipping 386 matching lines...) Expand 10 before | Expand all | Expand 10 after
2469 } 2472 }
2470 2473
2471 // These methods do not perform access checks! 2474 // These methods do not perform access checks!
2472 MUST_USE_RESULT static MaybeHandle<AccessorPair> GetLocalPropertyAccessorPair( 2475 MUST_USE_RESULT static MaybeHandle<AccessorPair> GetLocalPropertyAccessorPair(
2473 Handle<JSObject> object, 2476 Handle<JSObject> object,
2474 Handle<Name> name); 2477 Handle<Name> name);
2475 MUST_USE_RESULT static MaybeHandle<AccessorPair> GetLocalElementAccessorPair( 2478 MUST_USE_RESULT static MaybeHandle<AccessorPair> GetLocalElementAccessorPair(
2476 Handle<JSObject> object, 2479 Handle<JSObject> object,
2477 uint32_t index); 2480 uint32_t index);
2478 2481
2479 static Handle<Object> SetFastElement(Handle<JSObject> object, uint32_t index, 2482 MUST_USE_RESULT static MaybeHandle<Object> SetFastElement(
2480 Handle<Object> value,
2481 StrictMode strict_mode,
2482 bool check_prototype);
2483
2484 static Handle<Object> SetOwnElement(Handle<JSObject> object,
2485 uint32_t index,
2486 Handle<Object> value,
2487 StrictMode strict_mode);
2488
2489 // Empty handle is returned if the element cannot be set to the given value.
2490 static Handle<Object> SetElement(
2491 Handle<JSObject> object, 2483 Handle<JSObject> object,
2492 uint32_t index, 2484 uint32_t index,
2493 Handle<Object> value, 2485 Handle<Object> value,
2486 StrictMode strict_mode,
2487 bool check_prototype);
2488
2489 MUST_USE_RESULT static MaybeHandle<Object> SetOwnElement(
2490 Handle<JSObject> object,
2491 uint32_t index,
2492 Handle<Object> value,
2493 StrictMode strict_mode);
2494
2495 // Empty handle is returned if the element cannot be set to the given value.
2496 MUST_USE_RESULT static MaybeHandle<Object> SetElement(
2497 Handle<JSObject> object,
2498 uint32_t index,
2499 Handle<Object> value,
2494 PropertyAttributes attributes, 2500 PropertyAttributes attributes,
2495 StrictMode strict_mode, 2501 StrictMode strict_mode,
2496 bool check_prototype = true, 2502 bool check_prototype = true,
2497 SetPropertyMode set_mode = SET_PROPERTY); 2503 SetPropertyMode set_mode = SET_PROPERTY);
2498 2504
2499 // Returns the index'th element. 2505 // Returns the index'th element.
2500 // The undefined object if index is out of bounds. 2506 // The undefined object if index is out of bounds.
2501 static Handle<Object> GetElementWithInterceptor(Handle<JSObject> object, 2507 static Handle<Object> GetElementWithInterceptor(Handle<JSObject> object,
2502 Handle<Object> receiver, 2508 Handle<Object> receiver,
2503 uint32_t index); 2509 uint32_t index);
(...skipping 301 matching lines...) Expand 10 before | Expand all | Expand 10 after
2805 Handle<JSReceiver> receiver, 2811 Handle<JSReceiver> receiver,
2806 uint32_t index, 2812 uint32_t index,
2807 bool continue_search); 2813 bool continue_search);
2808 static Handle<Object> SetElementWithCallback( 2814 static Handle<Object> SetElementWithCallback(
2809 Handle<JSObject> object, 2815 Handle<JSObject> object,
2810 Handle<Object> structure, 2816 Handle<Object> structure,
2811 uint32_t index, 2817 uint32_t index,
2812 Handle<Object> value, 2818 Handle<Object> value,
2813 Handle<JSObject> holder, 2819 Handle<JSObject> holder,
2814 StrictMode strict_mode); 2820 StrictMode strict_mode);
2815 static Handle<Object> SetElementWithInterceptor( 2821 MUST_USE_RESULT static MaybeHandle<Object> SetElementWithInterceptor(
2816 Handle<JSObject> object, 2822 Handle<JSObject> object,
2817 uint32_t index, 2823 uint32_t index,
2818 Handle<Object> value, 2824 Handle<Object> value,
2819 PropertyAttributes attributes, 2825 PropertyAttributes attributes,
2820 StrictMode strict_mode, 2826 StrictMode strict_mode,
2821 bool check_prototype, 2827 bool check_prototype,
2822 SetPropertyMode set_mode); 2828 SetPropertyMode set_mode);
2823 static Handle<Object> SetElementWithoutInterceptor( 2829 MUST_USE_RESULT static MaybeHandle<Object> SetElementWithoutInterceptor(
2824 Handle<JSObject> object, 2830 Handle<JSObject> object,
2825 uint32_t index, 2831 uint32_t index,
2826 Handle<Object> value, 2832 Handle<Object> value,
2827 PropertyAttributes attributes, 2833 PropertyAttributes attributes,
2828 StrictMode strict_mode, 2834 StrictMode strict_mode,
2829 bool check_prototype, 2835 bool check_prototype,
2830 SetPropertyMode set_mode); 2836 SetPropertyMode set_mode);
2831 static Handle<Object> SetElementWithCallbackSetterInPrototypes( 2837 MUST_USE_RESULT
2838 static MaybeHandle<Object> SetElementWithCallbackSetterInPrototypes(
2832 Handle<JSObject> object, 2839 Handle<JSObject> object,
2833 uint32_t index, 2840 uint32_t index,
2834 Handle<Object> value, 2841 Handle<Object> value,
2835 bool* found, 2842 bool* found,
2836 StrictMode strict_mode); 2843 StrictMode strict_mode);
2837 static Handle<Object> SetDictionaryElement( 2844 MUST_USE_RESULT static MaybeHandle<Object> SetDictionaryElement(
2838 Handle<JSObject> object, 2845 Handle<JSObject> object,
2839 uint32_t index, 2846 uint32_t index,
2840 Handle<Object> value, 2847 Handle<Object> value,
2841 PropertyAttributes attributes, 2848 PropertyAttributes attributes,
2842 StrictMode strict_mode, 2849 StrictMode strict_mode,
2843 bool check_prototype, 2850 bool check_prototype,
2844 SetPropertyMode set_mode = SET_PROPERTY); 2851 SetPropertyMode set_mode = SET_PROPERTY);
2845 static Handle<Object> SetFastDoubleElement( 2852 MUST_USE_RESULT static MaybeHandle<Object> SetFastDoubleElement(
2846 Handle<JSObject> object, 2853 Handle<JSObject> object,
2847 uint32_t index, 2854 uint32_t index,
2848 Handle<Object> value, 2855 Handle<Object> value,
2849 StrictMode strict_mode, 2856 StrictMode strict_mode,
2850 bool check_prototype = true); 2857 bool check_prototype = true);
2851 2858
2852 // Searches the prototype chain for property 'name'. If it is found and 2859 // Searches the prototype chain for property 'name'. If it is found and
2853 // has a setter, invoke it and set '*done' to true. If it is found and is 2860 // has a setter, invoke it and set '*done' to true. If it is found and is
2854 // read-only, reject and set '*done' to true. Otherwise, set '*done' to 2861 // read-only, reject and set '*done' to true. Otherwise, set '*done' to
2855 // false. Can throw and return an empty handle with '*done==true'. 2862 // false. Can throw and return an empty handle with '*done==true'.
(...skipping 6943 matching lines...) Expand 10 before | Expand all | Expand 10 after
9799 Object* receiver, 9806 Object* receiver,
9800 Name* name); 9807 Name* name);
9801 MUST_USE_RESULT MaybeObject* GetElementWithHandler( 9808 MUST_USE_RESULT MaybeObject* GetElementWithHandler(
9802 Object* receiver, 9809 Object* receiver,
9803 uint32_t index); 9810 uint32_t index);
9804 9811
9805 // If the handler defines an accessor property with a setter, invoke it. 9812 // If the handler defines an accessor property with a setter, invoke it.
9806 // If it defines an accessor property without a setter, or a data property 9813 // If it defines an accessor property without a setter, or a data property
9807 // that is read-only, throw. In all these cases set '*done' to true, 9814 // that is read-only, throw. In all these cases set '*done' to true,
9808 // otherwise set it to false. 9815 // otherwise set it to false.
9809 static Handle<Object> SetPropertyViaPrototypesWithHandler( 9816 MUST_USE_RESULT
9817 static MaybeHandle<Object> SetPropertyViaPrototypesWithHandler(
9810 Handle<JSProxy> proxy, 9818 Handle<JSProxy> proxy,
9811 Handle<JSReceiver> receiver, 9819 Handle<JSReceiver> receiver,
9812 Handle<Name> name, 9820 Handle<Name> name,
9813 Handle<Object> value, 9821 Handle<Object> value,
9814 PropertyAttributes attributes, 9822 PropertyAttributes attributes,
9815 StrictMode strict_mode, 9823 StrictMode strict_mode,
9816 bool* done); 9824 bool* done);
9817 9825
9818 static PropertyAttributes GetPropertyAttributeWithHandler( 9826 static PropertyAttributes GetPropertyAttributeWithHandler(
9819 Handle<JSProxy> proxy, 9827 Handle<JSProxy> proxy,
9820 Handle<JSReceiver> receiver, 9828 Handle<JSReceiver> receiver,
9821 Handle<Name> name); 9829 Handle<Name> name);
9822 static PropertyAttributes GetElementAttributeWithHandler( 9830 static PropertyAttributes GetElementAttributeWithHandler(
9823 Handle<JSProxy> proxy, 9831 Handle<JSProxy> proxy,
9824 Handle<JSReceiver> receiver, 9832 Handle<JSReceiver> receiver,
9825 uint32_t index); 9833 uint32_t index);
9826 9834
9827 // Turn the proxy into an (empty) JSObject. 9835 // Turn the proxy into an (empty) JSObject.
9828 static void Fix(Handle<JSProxy> proxy); 9836 static void Fix(Handle<JSProxy> proxy);
9829 9837
9830 // Initializes the body after the handler slot. 9838 // Initializes the body after the handler slot.
9831 inline void InitializeBody(int object_size, Object* value); 9839 inline void InitializeBody(int object_size, Object* value);
9832 9840
9833 // Invoke a trap by name. If the trap does not exist on this's handler, 9841 // Invoke a trap by name. If the trap does not exist on this's handler,
9834 // but derived_trap is non-NULL, invoke that instead. May cause GC. 9842 // but derived_trap is non-NULL, invoke that instead. May cause GC.
9835 Handle<Object> CallTrap(const char* name, 9843 MUST_USE_RESULT static MaybeHandle<Object> CallTrap(
9836 Handle<Object> derived_trap, 9844 Handle<JSProxy> proxy,
9837 int argc, 9845 const char* name,
9838 Handle<Object> args[]); 9846 Handle<Object> derived_trap,
9847 int argc,
9848 Handle<Object> args[]);
9839 9849
9840 // Dispatched behavior. 9850 // Dispatched behavior.
9841 DECLARE_PRINTER(JSProxy) 9851 DECLARE_PRINTER(JSProxy)
9842 DECLARE_VERIFIER(JSProxy) 9852 DECLARE_VERIFIER(JSProxy)
9843 9853
9844 // Layout description. We add padding so that a proxy has the same 9854 // Layout description. We add padding so that a proxy has the same
9845 // size as a virgin JSObject. This is essential for becoming a JSObject 9855 // size as a virgin JSObject. This is essential for becoming a JSObject
9846 // upon freeze. 9856 // upon freeze.
9847 static const int kHandlerOffset = HeapObject::kHeaderSize; 9857 static const int kHandlerOffset = HeapObject::kHeaderSize;
9848 static const int kHashOffset = kHandlerOffset + kPointerSize; 9858 static const int kHashOffset = kHandlerOffset + kPointerSize;
9849 static const int kPaddingOffset = kHashOffset + kPointerSize; 9859 static const int kPaddingOffset = kHashOffset + kPointerSize;
9850 static const int kSize = JSObject::kHeaderSize; 9860 static const int kSize = JSObject::kHeaderSize;
9851 static const int kHeaderSize = kPaddingOffset; 9861 static const int kHeaderSize = kPaddingOffset;
9852 static const int kPaddingSize = kSize - kPaddingOffset; 9862 static const int kPaddingSize = kSize - kPaddingOffset;
9853 9863
9854 STATIC_CHECK(kPaddingSize >= 0); 9864 STATIC_CHECK(kPaddingSize >= 0);
9855 9865
9856 typedef FixedBodyDescriptor<kHandlerOffset, 9866 typedef FixedBodyDescriptor<kHandlerOffset,
9857 kPaddingOffset, 9867 kPaddingOffset,
9858 kSize> BodyDescriptor; 9868 kSize> BodyDescriptor;
9859 9869
9860 private: 9870 private:
9861 friend class JSReceiver; 9871 friend class JSReceiver;
9862 9872
9863 static Handle<Object> SetPropertyWithHandler(Handle<JSProxy> proxy, 9873 MUST_USE_RESULT static MaybeHandle<Object> SetPropertyWithHandler(
9864 Handle<JSReceiver> receiver, 9874 Handle<JSProxy> proxy,
9865 Handle<Name> name, 9875 Handle<JSReceiver> receiver,
9866 Handle<Object> value, 9876 Handle<Name> name,
9867 PropertyAttributes attributes, 9877 Handle<Object> value,
9868 StrictMode strict_mode); 9878 PropertyAttributes attributes,
9869 static Handle<Object> SetElementWithHandler(Handle<JSProxy> proxy, 9879 StrictMode strict_mode);
9870 Handle<JSReceiver> receiver, 9880 MUST_USE_RESULT static MaybeHandle<Object> SetElementWithHandler(
9871 uint32_t index, 9881 Handle<JSProxy> proxy,
9872 Handle<Object> value, 9882 Handle<JSReceiver> receiver,
9873 StrictMode strict_mode); 9883 uint32_t index,
9884 Handle<Object> value,
9885 StrictMode strict_mode);
9874 9886
9875 static bool HasPropertyWithHandler(Handle<JSProxy> proxy, Handle<Name> name); 9887 static bool HasPropertyWithHandler(Handle<JSProxy> proxy, Handle<Name> name);
9876 static bool HasElementWithHandler(Handle<JSProxy> proxy, uint32_t index); 9888 static bool HasElementWithHandler(Handle<JSProxy> proxy, uint32_t index);
9877 9889
9878 static Handle<Object> DeletePropertyWithHandler(Handle<JSProxy> proxy, 9890 MUST_USE_RESULT static MaybeHandle<Object> DeletePropertyWithHandler(
9879 Handle<Name> name, 9891 Handle<JSProxy> proxy,
9880 DeleteMode mode); 9892 Handle<Name> name,
9881 static Handle<Object> DeleteElementWithHandler(Handle<JSProxy> proxy, 9893 DeleteMode mode);
9882 uint32_t index, 9894 MUST_USE_RESULT static MaybeHandle<Object> DeleteElementWithHandler(
9883 DeleteMode mode); 9895 Handle<JSProxy> proxy,
9896 uint32_t index,
9897 DeleteMode mode);
9884 9898
9885 MUST_USE_RESULT Object* GetIdentityHash(); 9899 MUST_USE_RESULT Object* GetIdentityHash();
9886 9900
9887 static Handle<Object> GetOrCreateIdentityHash(Handle<JSProxy> proxy); 9901 static Handle<Object> GetOrCreateIdentityHash(Handle<JSProxy> proxy);
9888 9902
9889 DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy); 9903 DISALLOW_IMPLICIT_CONSTRUCTORS(JSProxy);
9890 }; 9904 };
9891 9905
9892 9906
9893 class JSFunctionProxy: public JSProxy { 9907 class JSFunctionProxy: public JSProxy {
(...skipping 1096 matching lines...) Expand 10 before | Expand all | Expand 10 after
10990 } else { 11004 } else {
10991 value &= ~(1 << bit_position); 11005 value &= ~(1 << bit_position);
10992 } 11006 }
10993 return value; 11007 return value;
10994 } 11008 }
10995 }; 11009 };
10996 11010
10997 } } // namespace v8::internal 11011 } } // namespace v8::internal
10998 11012
10999 #endif // V8_OBJECTS_H_ 11013 #endif // V8_OBJECTS_H_
OLDNEW
« no previous file with comments | « src/liveedit.cc ('k') | src/objects.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698