Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 1e4d2f927d930158fd832f88b6b3b884a074e2ff..398ee536b60de00da59f12ca37b02757e28eb5e1 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -125,6 +125,7 @@ class FunctionTemplate; |
class ObjectTemplate; |
class Data; |
class AccessorInfo; |
+template<typename T> class PropertyCallbackInfo; |
class StackTrace; |
class StackFrame; |
class Isolate; |
@@ -1527,11 +1528,18 @@ enum ExternalArrayType { |
*/ |
typedef Handle<Value> (*AccessorGetter)(Local<String> property, |
const AccessorInfo& info); |
+typedef void (*AccessorGetterCallback)( |
+ Local<String> property, |
+ const PropertyCallbackInfo<Value>& info); |
typedef void (*AccessorSetter)(Local<String> property, |
Local<Value> value, |
const AccessorInfo& info); |
+typedef void (*AccessorSetterCallback)( |
+ Local<String> property, |
+ Local<Value> value, |
+ const PropertyCallbackInfo<void>& info); |
/** |
@@ -1609,6 +1617,12 @@ class V8EXPORT Object : public Value { |
Handle<Value> data = Handle<Value>(), |
AccessControl settings = DEFAULT, |
PropertyAttribute attribute = None); |
+ bool SetAccessor(Handle<String> name, |
+ AccessorGetterCallback getter, |
+ AccessorSetterCallback setter = 0, |
+ Handle<Value> data = Handle<Value>(), |
+ AccessControl settings = DEFAULT, |
+ PropertyAttribute attribute = None); |
// This function is not yet stable and should not be used at this time. |
bool SetAccessor(Handle<String> name, |
@@ -2060,13 +2074,25 @@ class V8EXPORT Template : public Data { |
}; |
+template<typename T> |
+class V8EXPORT ReturnHandler { |
Michael Starzinger
2013/03/18 13:57:05
As discussed offline: Let's name this class Return
|
+ public: |
+ V8_INLINE(explicit ReturnHandler(T* slot)) : slot_(slot) {} |
+ V8_INLINE(void SetReturnValue(Persistent<T> handle)) { slot_ = *handle; } |
Michael Starzinger
2013/03/18 13:57:05
As discussed offline: Let's name these setters jus
|
+ V8_INLINE(void SetReturnValue(Handle<T> handle)) { slot_ = *handle; } |
+ private: |
+ T* slot_; |
+}; |
+ |
+ |
/** |
* The argument information given to function call callbacks. This |
* class provides access to information about the context of the call, |
* including the receiver, the number and values of arguments, and |
* the holder of the function. |
*/ |
-class V8EXPORT Arguments { |
+template<typename T> |
+class V8EXPORT FunctionCallbackInfo { |
public: |
V8_INLINE(int Length() const); |
V8_INLINE(Local<Value> operator[](int i) const); |
@@ -2076,15 +2102,17 @@ class V8EXPORT Arguments { |
V8_INLINE(bool IsConstructCall() const); |
V8_INLINE(Local<Value> Data() const); |
V8_INLINE(Isolate* GetIsolate() const); |
+ V8_INLINE(ReturnHandler<T> GetReturnHandler() const); |
- private: |
+ protected: |
static const int kIsolateIndex = 0; |
static const int kDataIndex = -1; |
static const int kCalleeIndex = -2; |
static const int kHolderIndex = -3; |
+ static const int kReturnValueIndex = -4; |
friend class ImplementationUtilities; |
- V8_INLINE(Arguments(internal::Object** implicit_args, |
+ V8_INLINE(FunctionCallbackInfo(internal::Object** implicit_args, |
internal::Object** values, |
int length, |
bool is_construct_call)); |
@@ -2095,25 +2123,52 @@ class V8EXPORT Arguments { |
}; |
+class V8EXPORT Arguments : public FunctionCallbackInfo<Value> { |
+ private: |
+ friend class ImplementationUtilities; |
+ V8_INLINE(Arguments(internal::Object** implicit_args, |
+ internal::Object** values, |
+ int length, |
+ bool is_construct_call)); |
+}; |
+ |
+ |
/** |
- * The information passed to an accessor callback about the context |
+ * The information passed to a property callback about the context |
* of the property access. |
*/ |
-class V8EXPORT AccessorInfo { |
+template<typename T> |
+class V8EXPORT PropertyCallbackInfo { |
public: |
- V8_INLINE(AccessorInfo(internal::Object** args)) |
+ V8_INLINE(PropertyCallbackInfo(internal::Object** args)) |
: args_(args) { } |
V8_INLINE(Isolate* GetIsolate() const); |
V8_INLINE(Local<Value> Data() const); |
V8_INLINE(Local<Object> This() const); |
V8_INLINE(Local<Object> Holder() const); |
+ V8_INLINE(ReturnHandler<T> GetReturnHandler() const); |
private: |
+ static const int kIsolateIndex = -3; |
+ static const int kDataIndex = -2; |
+ static const int kThisIndex = 0; |
+ static const int kHolderIndex = -1; |
+ static const int kReturnValueIndex = -4; |
+ |
internal::Object** args_; |
}; |
+class V8EXPORT AccessorInfo : public PropertyCallbackInfo<Value> { |
+ public: |
+ V8_INLINE(AccessorInfo(internal::Object** args)) |
+ : PropertyCallbackInfo<Value>(args) { } |
+}; |
+ |
+ |
typedef Handle<Value> (*InvocationCallback)(const Arguments& args); |
+typedef void (*FunctionCallback)(const FunctionCallbackInfo<Value>& info); |
+ |
/** |
* NamedProperty[Getter|Setter] are used as interceptors on object. |
@@ -2121,6 +2176,9 @@ typedef Handle<Value> (*InvocationCallback)(const Arguments& args); |
*/ |
typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property, |
const AccessorInfo& info); |
+typedef void (*NamedPropertyGetterCallback)( |
+ Local<String> property, |
+ const PropertyCallbackInfo<Value>& info); |
/** |
@@ -2130,6 +2188,11 @@ typedef Handle<Value> (*NamedPropertyGetter)(Local<String> property, |
typedef Handle<Value> (*NamedPropertySetter)(Local<String> property, |
Local<Value> value, |
const AccessorInfo& info); |
+typedef void (*NamedPropertySetterCallback)( |
+ Local<String> property, |
+ Local<Value> value, |
+ const PropertyCallbackInfo<Value>& info); |
+ |
/** |
* Returns a non-empty handle if the interceptor intercepts the request. |
@@ -2138,6 +2201,9 @@ typedef Handle<Value> (*NamedPropertySetter)(Local<String> property, |
*/ |
typedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property, |
const AccessorInfo& info); |
+typedef void (*NamedPropertyQueryCallback)( |
+ Local<String> property, |
+ const PropertyCallbackInfo<Integer>& info); |
/** |
@@ -2147,12 +2213,18 @@ typedef Handle<Integer> (*NamedPropertyQuery)(Local<String> property, |
*/ |
typedef Handle<Boolean> (*NamedPropertyDeleter)(Local<String> property, |
const AccessorInfo& info); |
+typedef void (*NamedPropertyDeleterCallback)( |
+ Local<String> property, |
+ const PropertyCallbackInfo<Boolean>& info); |
+ |
/** |
* Returns an array containing the names of the properties the named |
* property getter intercepts. |
*/ |
typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info); |
+typedef void (*NamedPropertyEnumeratorCallback)( |
+ const PropertyCallbackInfo<Array>& info); |
/** |
@@ -2161,6 +2233,9 @@ typedef Handle<Array> (*NamedPropertyEnumerator)(const AccessorInfo& info); |
*/ |
typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index, |
const AccessorInfo& info); |
+typedef void (*IndexedPropertyGetterCallback)( |
+ uint32_t index, |
+ const PropertyCallbackInfo<Value>& info); |
/** |
@@ -2170,6 +2245,10 @@ typedef Handle<Value> (*IndexedPropertyGetter)(uint32_t index, |
typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index, |
Local<Value> value, |
const AccessorInfo& info); |
+typedef void (*IndexedPropertySetterCallback)( |
+ uint32_t index, |
+ Local<Value> value, |
+ const PropertyCallbackInfo<Value>& info); |
/** |
@@ -2178,6 +2257,10 @@ typedef Handle<Value> (*IndexedPropertySetter)(uint32_t index, |
*/ |
typedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index, |
const AccessorInfo& info); |
+typedef void (*IndexedPropertyQueryCallback)( |
+ uint32_t index, |
+ const PropertyCallbackInfo<Integer>& info); |
+ |
/** |
* Returns a non-empty handle if the deleter intercepts the request. |
@@ -2186,12 +2269,18 @@ typedef Handle<Integer> (*IndexedPropertyQuery)(uint32_t index, |
*/ |
typedef Handle<Boolean> (*IndexedPropertyDeleter)(uint32_t index, |
const AccessorInfo& info); |
+typedef void (*IndexedPropertyDeleterCallback)( |
+ uint32_t index, |
+ const PropertyCallbackInfo<Boolean>& info); |
+ |
/** |
* Returns an array containing the indices of the properties the |
* indexed property getter intercepts. |
*/ |
typedef Handle<Array> (*IndexedPropertyEnumerator)(const AccessorInfo& info); |
+typedef void (*IndexedPropertyEnumeratorCallback)( |
+ const PropertyCallbackInfo<Array>& info); |
/** |
@@ -2326,6 +2415,12 @@ class V8EXPORT FunctionTemplate : public Template { |
Handle<Value> data = Handle<Value>(), |
Handle<Signature> signature = Handle<Signature>(), |
int length = 0); |
+ static Local<FunctionTemplate> New( |
+ FunctionCallback callback, // TODO(dcarney): add back default param. |
+ Handle<Value> data = Handle<Value>(), |
+ Handle<Signature> signature = Handle<Signature>(), |
+ int length = 0); |
+ |
/** Returns the unique function instance in the current execution context.*/ |
Local<Function> GetFunction(); |
@@ -2336,6 +2431,8 @@ class V8EXPORT FunctionTemplate : public Template { |
*/ |
void SetCallHandler(InvocationCallback callback, |
Handle<Value> data = Handle<Value>()); |
+ void SetCallHandler(FunctionCallback callback, |
+ Handle<Value> data = Handle<Value>()); |
/** Set the predefined length property for the FunctionTemplate. */ |
void SetLength(int length); |
@@ -2458,6 +2555,14 @@ class V8EXPORT ObjectTemplate : public Template { |
PropertyAttribute attribute = None, |
Handle<AccessorSignature> signature = |
Handle<AccessorSignature>()); |
+ void SetAccessor(Handle<String> name, |
+ AccessorGetterCallback getter, |
+ AccessorSetterCallback setter = 0, |
+ Handle<Value> data = Handle<Value>(), |
+ AccessControl settings = DEFAULT, |
+ PropertyAttribute attribute = None, |
+ Handle<AccessorSignature> signature = |
+ Handle<AccessorSignature>()); |
// This function is not yet stable and should not be used at this time. |
bool SetAccessor(Handle<String> name, |
@@ -2490,6 +2595,13 @@ class V8EXPORT ObjectTemplate : public Template { |
NamedPropertyDeleter deleter = 0, |
NamedPropertyEnumerator enumerator = 0, |
Handle<Value> data = Handle<Value>()); |
+ void SetNamedPropertyHandler( |
+ NamedPropertyGetterCallback getter, |
+ NamedPropertySetterCallback setter = 0, |
+ NamedPropertyQueryCallback query = 0, |
+ NamedPropertyDeleterCallback deleter = 0, |
+ NamedPropertyEnumeratorCallback enumerator = 0, |
+ Handle<Value> data = Handle<Value>()); |
/** |
* Sets an indexed property handler on the object template. |
@@ -2513,6 +2625,13 @@ class V8EXPORT ObjectTemplate : public Template { |
IndexedPropertyDeleter deleter = 0, |
IndexedPropertyEnumerator enumerator = 0, |
Handle<Value> data = Handle<Value>()); |
+ void SetIndexedPropertyHandler( |
+ IndexedPropertyGetterCallback getter, |
+ IndexedPropertySetterCallback setter = 0, |
+ IndexedPropertyQueryCallback query = 0, |
+ IndexedPropertyDeleterCallback deleter = 0, |
+ IndexedPropertyEnumeratorCallback enumerator = 0, |
+ Handle<Value> data = Handle<Value>()); |
/** |
* Sets the callback to be used when calling instances created from |
@@ -2522,6 +2641,8 @@ class V8EXPORT ObjectTemplate : public Template { |
*/ |
void SetCallAsFunctionHandler(InvocationCallback callback, |
Handle<Value> data = Handle<Value>()); |
+ void SetCallAsFunctionHandler(FunctionCallback callback, |
+ Handle<Value> data = Handle<Value>()); |
/** |
* Mark object instances of the template as undetectable. |
@@ -4608,54 +4729,78 @@ uint16_t Persistent<T>::WrapperClassId(Isolate* isolate) const { |
return *reinterpret_cast<uint16_t*>(addr); |
} |
-Arguments::Arguments(internal::Object** implicit_args, |
- internal::Object** values, int length, |
- bool is_construct_call) |
+template<typename T> |
+FunctionCallbackInfo<T>::FunctionCallbackInfo(internal::Object** implicit_args, |
+ internal::Object** values, |
+ int length, |
+ bool is_construct_call) |
: implicit_args_(implicit_args), |
values_(values), |
length_(length), |
is_construct_call_(is_construct_call) { } |
-Local<Value> Arguments::operator[](int i) const { |
+Arguments::Arguments(internal::Object** args, |
+ internal::Object** values, |
+ int length, |
+ bool is_construct_call) |
+ : FunctionCallbackInfo<Value>(args, values, length, is_construct_call) { } |
+ |
+ |
+template<typename T> |
+Local<Value> FunctionCallbackInfo<T>::operator[](int i) const { |
if (i < 0 || length_ <= i) return Local<Value>(*Undefined()); |
return Local<Value>(reinterpret_cast<Value*>(values_ - i)); |
} |
-Local<Function> Arguments::Callee() const { |
+template<typename T> |
+Local<Function> FunctionCallbackInfo<T>::Callee() const { |
return Local<Function>(reinterpret_cast<Function*>( |
&implicit_args_[kCalleeIndex])); |
} |
-Local<Object> Arguments::This() const { |
+template<typename T> |
+Local<Object> FunctionCallbackInfo<T>::This() const { |
return Local<Object>(reinterpret_cast<Object*>(values_ + 1)); |
} |
-Local<Object> Arguments::Holder() const { |
+template<typename T> |
+Local<Object> FunctionCallbackInfo<T>::Holder() const { |
return Local<Object>(reinterpret_cast<Object*>( |
&implicit_args_[kHolderIndex])); |
} |
-Local<Value> Arguments::Data() const { |
+template<typename T> |
+Local<Value> FunctionCallbackInfo<T>::Data() const { |
return Local<Value>(reinterpret_cast<Value*>(&implicit_args_[kDataIndex])); |
} |
-Isolate* Arguments::GetIsolate() const { |
+template<typename T> |
+Isolate* FunctionCallbackInfo<T>::GetIsolate() const { |
return *reinterpret_cast<Isolate**>(&implicit_args_[kIsolateIndex]); |
} |
-bool Arguments::IsConstructCall() const { |
+template<typename T> |
+ReturnHandler<T> FunctionCallbackInfo<T>::GetReturnHandler() const { |
+ return ReturnHandler<T>( |
+ reinterpret_cast<T*>(&implicit_args_[kReturnValueIndex])); |
+} |
+ |
+ |
+template<typename T> |
+bool FunctionCallbackInfo<T>::IsConstructCall() const { |
return is_construct_call_; |
} |
-int Arguments::Length() const { |
+template<typename T> |
+int FunctionCallbackInfo<T>::Length() const { |
return length_; |
} |
@@ -4922,23 +5067,34 @@ External* External::Cast(v8::Value* value) { |
} |
-Isolate* AccessorInfo::GetIsolate() const { |
- return *reinterpret_cast<Isolate**>(&args_[-3]); |
+template<typename T> |
+Isolate* PropertyCallbackInfo<T>::GetIsolate() const { |
+ return *reinterpret_cast<Isolate**>(&args_[kIsolateIndex]); |
+} |
+ |
+ |
+template<typename T> |
+Local<Value> PropertyCallbackInfo<T>::Data() const { |
+ return Local<Value>(reinterpret_cast<Value*>(&args_[kDataIndex])); |
} |
-Local<Value> AccessorInfo::Data() const { |
- return Local<Value>(reinterpret_cast<Value*>(&args_[-2])); |
+template<typename T> |
+Local<Object> PropertyCallbackInfo<T>::This() const { |
+ return Local<Object>(reinterpret_cast<Object*>(&args_[kThisIndex])); |
} |
-Local<Object> AccessorInfo::This() const { |
- return Local<Object>(reinterpret_cast<Object*>(&args_[0])); |
+template<typename T> |
+Local<Object> PropertyCallbackInfo<T>::Holder() const { |
+ return Local<Object>(reinterpret_cast<Object*>(&args_[kHolderIndex])); |
} |
-Local<Object> AccessorInfo::Holder() const { |
- return Local<Object>(reinterpret_cast<Object*>(&args_[-1])); |
+template<typename T> |
+ReturnHandler<T> PropertyCallbackInfo<T>::GetReturnHandler() const { |
+ return ReturnHandler<T>( |
+ reinterpret_cast<T*>(&args_[kReturnValueIndex])); |
} |