Chromium Code Reviews| Index: include/v8.h |
| diff --git a/include/v8.h b/include/v8.h |
| index 56e176ab14834bc87e99054e6920cde99345d0fa..78857aa764a03f38bab6ebc339ef629d7a7f52b6 100644 |
| --- a/include/v8.h |
| +++ b/include/v8.h |
| @@ -1530,6 +1530,55 @@ typedef void (*AccessorSetter)(Local<String> property, |
| const AccessorInfo& info); |
| +enum AccessorDescriptorType { |
| + kDescriptorPointerCompare, |
| + kDescriptorBitmaskCompare, |
| + kDescriptorPrimitiveValue, |
| + kDescriptorPointerDereference, |
| + kDescriptorInternalFieldDereference |
| +}; |
| + |
| + |
| +enum AccessorDescriptorDataType { |
| + kDescriptorBoolType, |
| + kDescriptorInt8Type, kDescriptorUint8Type, |
| + kDescriptorInt16Type, kDescriptorUint16Type, |
| + kDescriptorInt32Type, kDescriptorUint32Type, |
| + kDescriptorFloatType, kDescriptorDoubleType |
| +}; |
| + |
| + |
| +struct BitmaskCompareDescriptor { |
| + uint32_t bitmask; |
| + uint32_t compare_value; |
| + uint8_t size; // Must be in {1,2,4}. |
| +}; |
| + |
| + |
| +struct PointerCompareDescriptor { |
| + void* compare_value; |
| +}; |
| + |
| + |
| +struct PrimitiveValueDescriptor { |
| + AccessorDescriptorDataType data_type; |
| + uint8_t bool_offset; // Must be in [0,7], used for kDescriptorBoolType. |
| +}; |
| + |
| + |
| +struct AccessorDescriptor { |
|
Sven Panne
2013/02/19 08:41:16
I'm not totally happy with the way this algebraic
|
| + uint8_t internal_field; // Ignored for kDescriptorPointerDereference. |
| + int16_t byte_offset; |
| + AccessorDescriptorType type; |
| + union { |
| + AccessorDescriptor* derefence_descriptor; |
| + struct BitmaskCompareDescriptor bitmask_compare_descriptor; |
| + struct PointerCompareDescriptor pointer_compare_descriptor; |
| + struct PrimitiveValueDescriptor primitive_value_descriptor; |
| + }; |
| +}; |
| + |
| + |
| /** |
| * Access control specifications. |
| * |
| @@ -1606,6 +1655,11 @@ class V8EXPORT Object : public Value { |
| AccessControl settings = DEFAULT, |
| PropertyAttribute attribute = None); |
| + bool SetAccessor(Handle<String> name, |
| + const AccessorDescriptor* descriptor, |
| + AccessControl settings = DEFAULT, |
| + PropertyAttribute attribute = None); |
| + |
| /** |
| * Returns an array containing the names of the enumerable properties |
| * of this object, including properties from prototype objects. The |
| @@ -2377,13 +2431,6 @@ class V8EXPORT FunctionTemplate : public Template { |
| private: |
| FunctionTemplate(); |
| - void AddInstancePropertyAccessor(Handle<String> name, |
| - AccessorGetter getter, |
| - AccessorSetter setter, |
| - Handle<Value> data, |
| - AccessControl settings, |
| - PropertyAttribute attributes, |
| - Handle<AccessorSignature> signature); |
| void SetNamedInstancePropertyHandler(NamedPropertyGetter getter, |
| NamedPropertySetter setter, |
| NamedPropertyQuery query, |
| @@ -2456,6 +2503,13 @@ class V8EXPORT ObjectTemplate : public Template { |
| Handle<AccessorSignature> signature = |
| Handle<AccessorSignature>()); |
| + bool SetAccessor(Handle<String> name, |
| + const AccessorDescriptor* descriptor, |
| + AccessControl settings = DEFAULT, |
| + PropertyAttribute attribute = None, |
| + Handle<AccessorSignature> signature = |
| + Handle<AccessorSignature>()); |
| + |
| /** |
| * Sets a named property handler on the object template. |
| * |
| @@ -4589,6 +4643,81 @@ void Template::Set(const char* name, v8::Handle<Data> value) { |
| } |
| +struct DescriptorVisitorHelper { |
|
Sven Panne
2013/02/19 08:41:16
Why do we need all this stuff here in the external
|
| + template<typename Descriptor, typename Visitor> |
| + static inline void VisitDescriptor(Descriptor* descriptor, Visitor* visitor) { |
| + if (!visitor->ShouldVisit(descriptor)) return; |
| + VisitFields(descriptor, visitor); |
| + } |
| + template<typename Visitor> |
| + static inline void VisitFields(BitmaskCompareDescriptor* descriptor, |
| + Visitor* visitor); |
| + template<typename Visitor> |
| + static inline void VisitFields(PointerCompareDescriptor* descriptor, |
| + Visitor* visitor); |
| + template<typename Visitor> |
| + static inline void VisitFields(PrimitiveValueDescriptor* descriptor, |
| + Visitor* visitor); |
| + template<typename Visitor> |
| + static inline void VisitFields(AccessorDescriptor* descriptor, |
| + Visitor* visitor); |
| +}; |
| + |
| + |
| +template<typename Visitor> |
| +inline void DescriptorVisitorHelper::VisitFields( |
| + BitmaskCompareDescriptor* descriptor, |
| + Visitor* visitor) { |
| + visitor->Visit(&descriptor->size); |
| + visitor->Visit(&descriptor->bitmask); |
| + visitor->Visit(&descriptor->compare_value); |
| +} |
| + |
| + |
| +template<typename Visitor> |
| +inline void DescriptorVisitorHelper::VisitFields( |
| + PointerCompareDescriptor* descriptor, |
| + Visitor* visitor) { |
| + visitor->Visit(&descriptor->compare_value); |
| +} |
| + |
| + |
| +template<typename Visitor> |
| +inline void DescriptorVisitorHelper::VisitFields( |
| + PrimitiveValueDescriptor* descriptor, |
| + Visitor* visitor) { |
| + visitor->Visit(&descriptor->data_type); |
| +} |
| + |
| + |
| +template<typename Visitor> |
| +inline void DescriptorVisitorHelper::VisitFields( |
| + AccessorDescriptor* descriptor, |
| + Visitor* visitor) { |
| + visitor->Visit(&descriptor->internal_field); |
| + visitor->Visit(&descriptor->byte_offset); |
| + visitor->Visit(&descriptor->type); |
| + switch (static_cast<AccessorDescriptorType>(descriptor->type)) { |
| + case kDescriptorBitmaskCompare: |
| + VisitDescriptor(&descriptor->bitmask_compare_descriptor, visitor); |
| + break; |
| + case kDescriptorPointerCompare: |
| + VisitDescriptor(&descriptor->pointer_compare_descriptor, visitor); |
| + break; |
| + case kDescriptorPrimitiveValue: |
| + VisitDescriptor(&descriptor->primitive_value_descriptor, visitor); |
| + break; |
| + case kDescriptorPointerDereference: |
| + case kDescriptorInternalFieldDereference: |
| + VisitDescriptor(descriptor->derefence_descriptor, visitor); |
| + break; |
| + default: |
| + visitor->VisitError(); |
| + break; |
| + } |
| +} |
| + |
| + |
| Local<Value> Object::GetInternalField(int index) { |
| #ifndef V8_ENABLE_CHECKS |
| typedef internal::Object O; |