| 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
|
|
|