Make ScopedPersistent's interface consistent with V8.

This commit is contained in:
Cheng Zhao 2014-08-10 21:18:42 +08:00
parent 1387d3969e
commit 980036b78a
3 changed files with 8 additions and 43 deletions

View file

@ -282,7 +282,7 @@ struct Converter<base::Callback<Sig> > {
return false; return false;
internal::SafeV8Function function( internal::SafeV8Function function(
new RefCountedPersistent<v8::Function>(val)); new RefCountedPersistent<v8::Function>(isolate, val));
*out = base::Bind(&internal::V8FunctionInvoker<Sig>::Go, isolate, function); *out = base::Bind(&internal::V8FunctionInvoker<Sig>::Go, isolate, function);
return true; return true;
} }

View file

@ -200,7 +200,7 @@ inline v8::Handle<v8::String> StringToV8(
} }
v8::Handle<v8::String> StringToSymbol(v8::Isolate* isolate, v8::Handle<v8::String> StringToSymbol(v8::Isolate* isolate,
const base::StringPiece& val); const base::StringPiece& input);
template<typename T> template<typename T>
bool ConvertFromV8(v8::Isolate* isolate, v8::Handle<v8::Value> input, bool ConvertFromV8(v8::Isolate* isolate, v8::Handle<v8::Value> input,

View file

@ -16,22 +16,17 @@ namespace mate {
template <typename T> template <typename T>
class ScopedPersistent { class ScopedPersistent {
public: public:
ScopedPersistent(v8::Isolate* isolate = NULL) : isolate_(isolate) { ScopedPersistent() : isolate_(v8::Isolate::GetCurrent()) {}
}
ScopedPersistent(v8::Handle<v8::Value> handle, v8::Isolate* isolate = NULL) ScopedPersistent(v8::Isolate* isolate, v8::Handle<v8::Value> handle)
: isolate_(isolate) { : isolate_(isolate) {
reset(v8::Handle<T>::Cast(handle)); reset(isolate, v8::Handle<T>::Cast(handle));
} }
~ScopedPersistent() { ~ScopedPersistent() {
reset(); reset();
} }
void reset(v8::Handle<T> handle) {
reset(GetIsolate(handle), handle);
}
void reset(v8::Isolate* isolate, v8::Handle<T> handle) { void reset(v8::Isolate* isolate, v8::Handle<T> handle) {
if (!handle.IsEmpty()) { if (!handle.IsEmpty()) {
isolate_ = isolate; isolate_ = isolate;
@ -50,7 +45,7 @@ class ScopedPersistent {
} }
v8::Handle<T> NewHandle() const { v8::Handle<T> NewHandle() const {
return NewHandle(GetIsolate(handle_)); return NewHandle(isolate_);
} }
v8::Handle<T> NewHandle(v8::Isolate* isolate) const { v8::Handle<T> NewHandle(v8::Isolate* isolate) const {
@ -67,36 +62,6 @@ class ScopedPersistent {
v8::Isolate* isolate() const { return isolate_; } v8::Isolate* isolate() const { return isolate_; }
private: private:
template <typename U>
v8::Isolate* GetIsolate(v8::Handle<U> object_handle) const {
// Only works for v8::Object and its subclasses. Add specialisations for
// anything else.
if (!object_handle.IsEmpty())
return GetIsolate(object_handle->CreationContext());
return GetIsolate();
}
#if NODE_VERSION_AT_LEAST(0, 11, 0)
v8::Isolate* GetIsolate(v8::Handle<v8::Context> context_handle) const {
if (!context_handle.IsEmpty())
return context_handle->GetIsolate();
return GetIsolate();
}
#endif
v8::Isolate* GetIsolate(
v8::Handle<v8::ObjectTemplate> template_handle) const {
return GetIsolate();
}
template <typename U>
v8::Isolate* GetIsolate(const U& any_handle) const {
return GetIsolate();
}
v8::Isolate* GetIsolate() const {
if (isolate_)
return isolate_;
else
return v8::Isolate::GetCurrent();
}
v8::Isolate* isolate_; v8::Isolate* isolate_;
v8::Persistent<T> handle_; v8::Persistent<T> handle_;
@ -109,8 +74,8 @@ class RefCountedPersistent : public ScopedPersistent<T>,
public: public:
RefCountedPersistent() {} RefCountedPersistent() {}
explicit RefCountedPersistent(v8::Handle<v8::Value> handle) RefCountedPersistent(v8::Isolate* isolate, v8::Handle<v8::Value> handle)
: ScopedPersistent<T>(handle) { : ScopedPersistent<T>(isolate, handle) {
} }
protected: protected: