Index: src/objects.h |
diff --git a/src/objects.h b/src/objects.h |
index 12413123c09c2a922da3f76a7fbe3679a3dd0609..1dc3865fd6009b6bf15e901c4b75cbabb1ca3f9a 100644 |
--- a/src/objects.h |
+++ b/src/objects.h |
@@ -111,7 +111,10 @@ |
// - Foreign |
// - SharedFunctionInfo |
// - Struct |
+// - DeclaredAccessorDescriptor |
// - AccessorInfo |
+// - DeclaredAccessorInfo |
+// - ExecutableAccessorInfo |
// - AccessorPair |
// - AccessCheckInfo |
// - InterceptorInfo |
@@ -288,7 +291,9 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits; |
V(EXTERNAL_PIXEL_ARRAY_TYPE) \ |
V(FILLER_TYPE) \ |
\ |
- V(ACCESSOR_INFO_TYPE) \ |
+ V(DECLARED_ACCESSOR_DESCRIPTOR_TYPE) \ |
+ V(DECLARED_ACCESSOR_INFO_TYPE) \ |
+ V(EXECUTABLE_ACCESSOR_INFO_TYPE) \ |
V(ACCESSOR_PAIR_TYPE) \ |
V(ACCESS_CHECK_INFO_TYPE) \ |
V(INTERCEPTOR_INFO_TYPE) \ |
@@ -441,7 +446,11 @@ const int kStubMinorKeyBits = kBitsPerInt - kSmiTagSize - kStubMajorKeyBits; |
// type tags, elements in this list have to be added to the INSTANCE_TYPE_LIST |
// manually. |
#define STRUCT_LIST_ALL(V) \ |
- V(ACCESSOR_INFO, AccessorInfo, accessor_info) \ |
+ V(DECLARED_ACCESSOR_DESCRIPTOR, \ |
+ DeclaredAccessorDescriptor, \ |
+ declared_accessor_descriptor) \ |
+ V(DECLARED_ACCESSOR_INFO, DeclaredAccessorInfo, declared_accessor_info) \ |
+ V(EXECUTABLE_ACCESSOR_INFO, ExecutableAccessorInfo, executable_accessor_info)\ |
V(ACCESSOR_PAIR, AccessorPair, accessor_pair) \ |
V(ACCESS_CHECK_INFO, AccessCheckInfo, access_check_info) \ |
V(INTERCEPTOR_INFO, InterceptorInfo, interceptor_info) \ |
@@ -598,7 +607,9 @@ enum InstanceType { |
FILLER_TYPE, // LAST_DATA_TYPE |
// Structs. |
- ACCESSOR_INFO_TYPE, |
+ DECLARED_ACCESSOR_DESCRIPTOR_TYPE, |
+ DECLARED_ACCESSOR_INFO_TYPE, |
+ EXECUTABLE_ACCESSOR_INFO_TYPE, |
ACCESSOR_PAIR_TYPE, |
ACCESS_CHECK_INFO_TYPE, |
INTERCEPTOR_INFO_TYPE, |
@@ -926,6 +937,7 @@ class Object : public MaybeObject { |
inline bool IsFixedArrayBase(); |
inline bool IsExternal(); |
+ inline bool IsAccessorInfo(); |
// Returns true if this object is an instance of the specified |
// function template. |
@@ -8324,20 +8336,8 @@ class JSRegExpResult: public JSArray { |
}; |
-// An accessor must have a getter, but can have no setter. |
-// |
-// When setting a property, V8 searches accessors in prototypes. |
-// If an accessor was found and it does not have a setter, |
-// the request is ignored. |
-// |
-// If the accessor in the prototype has the READ_ONLY property attribute, then |
-// a new value is added to the local object when the property is set. |
-// This shadows the accessor in the prototype. |
class AccessorInfo: public Struct { |
public: |
- DECL_ACCESSORS(getter, Object) |
- DECL_ACCESSORS(setter, Object) |
- DECL_ACCESSORS(data, Object) |
DECL_ACCESSORS(name, Object) |
DECL_ACCESSORS(flag, Smi) |
DECL_ACCESSORS(expected_receiver_type, Object) |
@@ -8360,13 +8360,10 @@ class AccessorInfo: public Struct { |
static inline AccessorInfo* cast(Object* obj); |
// Dispatched behavior. |
- DECLARE_PRINTER(AccessorInfo) |
DECLARE_VERIFIER(AccessorInfo) |
- static const int kGetterOffset = HeapObject::kHeaderSize; |
- static const int kSetterOffset = kGetterOffset + kPointerSize; |
- static const int kDataOffset = kSetterOffset + kPointerSize; |
- static const int kNameOffset = kDataOffset + kPointerSize; |
+ |
+ static const int kNameOffset = HeapObject::kHeaderSize; |
static const int kFlagOffset = kNameOffset + kPointerSize; |
static const int kExpectedReceiverTypeOffset = kFlagOffset + kPointerSize; |
static const int kSize = kExpectedReceiverTypeOffset + kPointerSize; |
@@ -8382,6 +8379,74 @@ class AccessorInfo: public Struct { |
}; |
+class DeclaredAccessorDescriptor: public Struct { |
+ public: |
+ // TODO(dcarney): Fill out this class. |
+ DECL_ACCESSORS(internal_field, Smi) |
+ |
+ static inline DeclaredAccessorDescriptor* cast(Object* obj); |
+ |
+ // Dispatched behavior. |
+ DECLARE_PRINTER(DeclaredAccessorDescriptor) |
+ DECLARE_VERIFIER(DeclaredAccessorDescriptor) |
+ |
+ static const int kInternalFieldOffset = HeapObject::kHeaderSize; |
+ static const int kSize = kInternalFieldOffset + kPointerSize; |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorDescriptor); |
+}; |
+ |
+ |
+class DeclaredAccessorInfo: public AccessorInfo { |
+ public: |
+ DECL_ACCESSORS(descriptor, DeclaredAccessorDescriptor) |
+ |
+ static inline DeclaredAccessorInfo* cast(Object* obj); |
+ |
+ // Dispatched behavior. |
+ DECLARE_PRINTER(DeclaredAccessorInfo) |
+ DECLARE_VERIFIER(DeclaredAccessorInfo) |
+ |
+ static const int kDescriptorOffset = AccessorInfo::kSize; |
+ static const int kSize = kDescriptorOffset + kPointerSize; |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(DeclaredAccessorInfo); |
+}; |
+ |
+ |
+// An accessor must have a getter, but can have no setter. |
+// |
+// When setting a property, V8 searches accessors in prototypes. |
+// If an accessor was found and it does not have a setter, |
+// the request is ignored. |
+// |
+// If the accessor in the prototype has the READ_ONLY property attribute, then |
+// a new value is added to the local object when the property is set. |
+// This shadows the accessor in the prototype. |
+class ExecutableAccessorInfo: public AccessorInfo { |
+ public: |
+ DECL_ACCESSORS(getter, Object) |
+ DECL_ACCESSORS(setter, Object) |
+ DECL_ACCESSORS(data, Object) |
+ |
+ static inline ExecutableAccessorInfo* cast(Object* obj); |
+ |
+ // Dispatched behavior. |
+ DECLARE_PRINTER(ExecutableAccessorInfo) |
+ DECLARE_VERIFIER(ExecutableAccessorInfo) |
+ |
+ static const int kGetterOffset = AccessorInfo::kSize; |
+ static const int kSetterOffset = kGetterOffset + kPointerSize; |
+ static const int kDataOffset = kSetterOffset + kPointerSize; |
+ static const int kSize = kDataOffset + kPointerSize; |
+ |
+ private: |
+ DISALLOW_IMPLICIT_CONSTRUCTORS(ExecutableAccessorInfo); |
+}; |
+ |
+ |
// Support for JavaScript accessors: A pair of a getter and a setter. Each |
// accessor can either be |
// * a pointer to a JavaScript function or proxy: a real accessor |