Index: include/v8.h |
diff --git a/include/v8.h b/include/v8.h |
index 913866b730747f32c05674c0fc8f96c1eef4cf5d..a87ad011dcaf09ae0a31d1a3c93bd69b0734b311 100644 |
--- a/include/v8.h |
+++ b/include/v8.h |
@@ -137,15 +137,18 @@ class PropertyCallbackArguments; |
class FunctionCallbackArguments; |
class GlobalHandles; |
+template <typename T> |
class CallbackData { |
dcarney
2015/01/09 14:31:10
one comment disappeared from my previous mail - th
Erik Corry Chromium.org
2015/01/12 11:37:53
The reason is static type checking. If your funct
|
public: |
V8_INLINE v8::Isolate* GetIsolate() const { return isolate_; } |
- protected: |
- explicit CallbackData(v8::Isolate* isolate) : isolate_(isolate) {} |
+ explicit CallbackData(v8::Isolate* isolate, T* parameter) |
+ : isolate_(isolate), parameter_(parameter) {} |
+ V8_INLINE T* GetParameter() const { return parameter_; } |
private: |
v8::Isolate* isolate_; |
+ T* parameter_; |
}; |
} |
@@ -425,23 +428,28 @@ template <class T> class Eternal { |
}; |
-template <typename T> |
-class PhantomCallbackData : public internal::CallbackData { |
+template <typename T, typename U = void, typename V = void> |
+class PhantomCallbackData : public internal::CallbackData<T> { |
public: |
- typedef void (*Callback)(const PhantomCallbackData<T>& data); |
+ typedef void (*Callback)(const PhantomCallbackData<T, U, V>& data); |
- V8_INLINE T* GetParameter() const { return parameter_; } |
+ V8_INLINE U* GetInternalField1() const { return internal_field1_; } |
+ V8_INLINE V* GetInternalField2() const { return internal_field2_; } |
- PhantomCallbackData<T>(Isolate* isolate, T* parameter) |
- : internal::CallbackData(isolate), parameter_(parameter) {} |
+ PhantomCallbackData(Isolate* isolate, T* parameter, U* internal_field1, |
+ V* internal_field2) |
+ : internal::CallbackData<T>(isolate, parameter), |
+ internal_field1_(internal_field1), |
+ internal_field2_(internal_field2) {} |
private: |
- T* parameter_; |
+ U* internal_field1_; |
+ V* internal_field2_; |
}; |
template <class T, class P> |
-class WeakCallbackData : public PhantomCallbackData<P> { |
+class WeakCallbackData : public internal::CallbackData<P> { |
public: |
typedef void (*Callback)(const WeakCallbackData<T, P>& data); |
@@ -450,31 +458,11 @@ class WeakCallbackData : public PhantomCallbackData<P> { |
private: |
friend class internal::GlobalHandles; |
WeakCallbackData(Isolate* isolate, P* parameter, Local<T> handle) |
- : PhantomCallbackData<P>(isolate, parameter), handle_(handle) {} |
+ : internal::CallbackData<P>(isolate, parameter), handle_(handle) {} |
Local<T> handle_; |
}; |
-template <typename T, typename U> |
-class InternalFieldsCallbackData : public internal::CallbackData { |
- public: |
- typedef void (*Callback)(const InternalFieldsCallbackData<T, U>& data); |
- |
- InternalFieldsCallbackData(Isolate* isolate, T* internalField1, |
- U* internalField2) |
- : internal::CallbackData(isolate), |
- internal_field1_(internalField1), |
- internal_field2_(internalField2) {} |
- |
- V8_INLINE T* GetInternalField1() const { return internal_field1_; } |
- V8_INLINE U* GetInternalField2() const { return internal_field2_; } |
- |
- private: |
- T* internal_field1_; |
- U* internal_field2_; |
-}; |
- |
- |
/** |
* An object reference that is independent of any handle scope. Where |
* a Local handle only lives as long as the HandleScope in which it was |
@@ -562,13 +550,17 @@ template <class T> class PersistentBase { |
// specify a parameter for the callback or the location of two internal |
// fields in the dying object. |
template <typename P> |
- V8_INLINE void SetPhantom(P* parameter, |
- typename PhantomCallbackData<P>::Callback callback); |
- |
+ V8_INLINE void SetPhantom( |
+ P* parameter, |
+ typename PhantomCallbackData<P, void, void>::Callback callback); |
template <typename P, typename Q> |
V8_INLINE void SetPhantom( |
- void (*callback)(const InternalFieldsCallbackData<P, Q>&), |
- int internal_field_index1, int internal_field_index2); |
+ P* parameter, int internal_field_index1, |
dcarney
2015/01/09 14:22:52
i'm not sure i see the point in setting these fiel
Erik Corry Chromium.org
2015/01/12 11:37:53
The code is not setting any fields from these para
|
+ typename PhantomCallbackData<P, Q, void>::Callback callback); |
+ template <typename P, typename Q, typename R> |
+ V8_INLINE void SetPhantom( |
+ P* parameter, int internal_field_index1, int internal_field_index2, |
+ typename PhantomCallbackData<P, Q, R>::Callback callback); |
template<typename P> |
V8_INLINE P* ClearWeak(); |
@@ -5595,13 +5587,13 @@ class V8_EXPORT V8 { |
typedef WeakCallbackData<Value, void>::Callback WeakCallback; |
static void MakeWeak(internal::Object** global_handle, void* data, |
WeakCallback weak_callback); |
- static void MakePhantom(internal::Object** global_handle, void* data, |
- PhantomCallbackData<void>::Callback weak_callback); |
static void MakePhantom( |
- internal::Object** global_handle, |
- InternalFieldsCallbackData<void, void>::Callback weak_callback, |
+ internal::Object** global_handle, void* data, |
+ // Must be 0 or kNoInternalFieldIndex. |
int internal_field_index1, |
- int internal_field_index2 = Object::kNoInternalFieldIndex); |
+ // Must be 1 or kNoInternalFieldIndex. |
+ int internal_field_index2, |
+ PhantomCallbackData<void, void, void>::Callback weak_callback); |
static void* ClearWeak(internal::Object** global_handle); |
static void Eternalize(Isolate* isolate, |
Value* handle, |
@@ -6489,22 +6481,36 @@ void PersistentBase<T>::SetWeak( |
template <class T> |
template <typename P> |
void PersistentBase<T>::SetPhantom( |
- P* parameter, typename PhantomCallbackData<P>::Callback callback) { |
- typedef typename PhantomCallbackData<void>::Callback Callback; |
+ P* parameter, |
+ typename PhantomCallbackData<P, void, void>::Callback callback) { |
+ typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
+ V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
+ Object::kNoInternalFieldIndex, Object::kNoInternalFieldIndex, |
+ reinterpret_cast<Callback>(callback)); |
+} |
+ |
+ |
+template <class T> |
+template <typename P, typename Q> |
+void PersistentBase<T>::SetPhantom( |
+ P* parameter, int internal_field_index1, |
+ typename PhantomCallbackData<P, Q, void>::Callback callback) { |
+ typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
+ internal_field_index1, Object::kNoInternalFieldIndex, |
reinterpret_cast<Callback>(callback)); |
} |
template <class T> |
-template <typename U, typename V> |
+template <typename P, typename Q, typename R> |
void PersistentBase<T>::SetPhantom( |
- void (*callback)(const InternalFieldsCallbackData<U, V>&), |
- int internal_field_index1, int internal_field_index2) { |
- typedef typename InternalFieldsCallbackData<void, void>::Callback Callback; |
- V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), |
- reinterpret_cast<Callback>(callback), internal_field_index1, |
- internal_field_index2); |
+ P* parameter, int internal_field_index1, int internal_field_index2, |
+ typename PhantomCallbackData<P, Q, R>::Callback callback) { |
+ typedef typename PhantomCallbackData<void, void, void>::Callback Callback; |
+ V8::MakePhantom(reinterpret_cast<internal::Object**>(this->val_), parameter, |
+ internal_field_index1, internal_field_index2, |
+ reinterpret_cast<Callback>(callback)); |
} |