Index: gin/wrappable.cc |
diff --git a/gin/wrappable.cc b/gin/wrappable.cc |
index 0338211070af79b655a04895d2114135becd4b35..4a9ef0e1935d32e0b7a5213ab6ec47a230d093db 100644 |
--- a/gin/wrappable.cc |
+++ b/gin/wrappable.cc |
@@ -9,28 +9,29 @@ |
namespace gin { |
-Wrappable::Wrappable() { |
+WrappableBase::WrappableBase() { |
} |
-Wrappable::~Wrappable() { |
+WrappableBase::~WrappableBase() { |
wrapper_.Reset(); |
} |
-v8::Handle<v8::Object> Wrappable::GetWrapper(v8::Isolate* isolate) { |
- if (wrapper_.IsEmpty()) |
- CreateWrapper(isolate); |
- return v8::Local<v8::Object>::New(isolate, wrapper_); |
+v8::Handle<v8::Object> WrappableBase::GetWrapperImpl( |
+ v8::Isolate* isolate, WrapperInfo* wrapper_info) { |
+ if (wrapper_.IsEmpty()) |
+ CreateWrapper(isolate, wrapper_info); |
+ return v8::Local<v8::Object>::New(isolate, wrapper_); |
} |
-void Wrappable::WeakCallback( |
- const v8::WeakCallbackData<v8::Object, Wrappable>& data) { |
- Wrappable* wrappable = data.GetParameter(); |
+void WrappableBase::WeakCallback( |
+ const v8::WeakCallbackData<v8::Object, WrappableBase>& data) { |
+ WrappableBase* wrappable = data.GetParameter(); |
wrappable->wrapper_.Reset(); |
delete wrappable; |
} |
-v8::Handle<v8::Object> Wrappable::CreateWrapper(v8::Isolate* isolate) { |
- WrapperInfo* info = GetWrapperInfo(); |
+v8::Handle<v8::Object> WrappableBase::CreateWrapper(v8::Isolate* isolate, |
+ WrapperInfo* info) { |
PerIsolateData* data = PerIsolateData::From(isolate); |
v8::Local<v8::ObjectTemplate> templ = data->GetObjectTemplate(info); |
CHECK(!templ.IsEmpty()); // Don't forget to register an object template. |
@@ -43,4 +44,29 @@ v8::Handle<v8::Object> Wrappable::CreateWrapper(v8::Isolate* isolate) { |
return wrapper; |
} |
+namespace internal { |
+ |
+void* FromV8Impl(v8::Isolate* isolate, v8::Handle<v8::Value> val, |
+ WrapperInfo* wrapper_info) { |
+ if (!val->IsObject()) |
+ return NULL; |
+ v8::Handle<v8::Object> obj = v8::Handle<v8::Object>::Cast(val); |
+ WrapperInfo* info = WrapperInfo::From(obj); |
+ |
+ // If this fails, the object is not managed by Gin. It is either a normal JS |
+ // object that's not wrapping any external C++ object, or it is wrapping some |
+ // C++ object, but that object isn't managed by Gin (maybe Blink). |
+ if (!info) |
+ return NULL; |
+ |
+ // If this fails, the object is managed by Gin, but it's not wrapping an |
+ // instance of the C++ class associated with wrapper_info. |
+ if (info != wrapper_info) |
+ return NULL; |
+ |
+ return obj->GetAlignedPointerFromInternalField(kEncodedValueIndex); |
+} |
+ |
+} // namespace internal |
+ |
} // namespace gin |