Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 713bbccd544c3c4c2d3a45a63ee2782bd6345cb7..6de3bfcb1aa05b901c0f93ee99256af388584901 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -96,6 +96,7 @@ class ObjectTemplate; |
class Platform; |
class Primitive; |
class Promise; |
+class PropertyDescriptor; |
class Proxy; |
class RawOperationDescriptor; |
class Script; |
@@ -2810,6 +2811,22 @@ class V8_EXPORT Object : public Value { |
Local<Context> context, Local<Name> key, Local<Value> value, |
PropertyAttribute attributes = None); |
+ // Implements Object.DefineProperty(O, P, Attributes), see Ecma-262 19.1.2.4. |
+ // |
+ // The defineProperty function is used to add an own property or |
+ // update the attributes of an existing own property of an object. |
+ // |
+ // Both data and accessor descriptors can be used. |
+ // |
+ // In general, CreateDataProperty is faster, however, does not allow |
+ // for specifying attributes or an accessor descriptor. |
+ // |
+ // The PropertyDescriptor can change when redefining a property. |
+ // |
+ // Returns true on success. |
+ V8_WARN_UNUSED_RESULT Maybe<bool> DefineProperty( |
+ Local<Context> context, Local<Name> key, PropertyDescriptor& descriptor); |
+ |
// Sets an own property on this object bypassing interceptors and |
// overriding accessors or read-only properties. |
// |
@@ -3627,6 +3644,78 @@ class V8_EXPORT Promise : public Object { |
static void CheckCast(Value* obj); |
}; |
+/** |
+ * An instance of a Property Descriptor, see Ecma-262 6.2.4. |
+ * |
+ * Properties in a descriptor are present or absent. If you do not set |
+ * `enumerable`, `configurable`, and `writable`, they are absent. If `value`, |
+ * `get`, or `set` are absent, but you must specify them in the constructor, use |
+ * empty handles. |
+ * |
+ * Accessors `get` and `set` must be callable or undefined if they are present. |
+ * |
+ * \note Only query properties if they are present, i.e., call `x()` only if |
+ * `has_x()` returns true. |
+ * |
+ * \code |
+ * // var desc = {writable: false} |
+ * v8::PropertyDescriptor d(Local<Value>()), false); |
+ * d.value(); // error, value not set |
+ * if (d.has_writable()) { |
+ * d.writable(); // false |
+ * } |
+ * |
+ * // var desc = {value: undefined} |
+ * v8::PropertyDescriptor d(v8::Undefined(isolate)); |
+ * |
+ * // var desc = {get: undefined} |
+ * v8::PropertyDescriptor d(v8::Undefined(isolate), Local<Value>())); |
+ * \endcode |
+ */ |
+class V8_EXPORT PropertyDescriptor { |
+ public: |
+ // GenericDescriptor |
+ PropertyDescriptor(); |
+ |
+ // DataDescriptor |
+ PropertyDescriptor(Local<Value> value); |
+ |
+ // DataDescriptor with writable property |
+ PropertyDescriptor(Local<Value> value, bool writable); |
+ |
+ // AccessorDescriptor |
+ PropertyDescriptor(Local<Value> get, Local<Value> set); |
+ |
+ ~PropertyDescriptor(); |
+ |
+ Local<Value> value() const; |
+ bool has_value() const; |
+ |
+ Local<Value> get() const; |
+ bool has_get() const; |
+ Local<Value> set() const; |
+ bool has_set() const; |
+ |
+ void set_enumerable(bool enumerable); |
+ bool enumerable() const; |
+ bool has_enumerable() const; |
+ |
+ void set_configurable(bool configurable); |
+ bool configurable() const; |
+ bool has_configurable() const; |
+ |
+ bool writable() const; |
+ bool has_writable() const; |
+ |
+ struct PrivateData; |
+ PrivateData* get_private() const { return private_; } |
+ |
+ PropertyDescriptor(const PropertyDescriptor&) = delete; |
+ void operator=(const PropertyDescriptor&) = delete; |
+ |
+ private: |
+ PrivateData* private_; |
+}; |
/** |
* An instance of the built-in Proxy constructor (ECMA-262, 6th Edition, |
@@ -4492,6 +4581,7 @@ typedef void (*NamedPropertyEnumeratorCallback)( |
// TODO(dcarney): Deprecate and remove previous typedefs, and replace |
// GenericNamedPropertyFooCallback with just NamedPropertyFooCallback. |
+ |
/** |
* Interceptor for get requests on an object. |
* |