Index: gin/wrappable.cc |
diff --git a/gin/wrappable.cc b/gin/wrappable.cc |
index 8d41ce06c4dfc4b5abb0a08b50f5ac84929777c2..a330fefc8e89bb7071c7d592bdb708adc74ec1a7 100644 |
--- a/gin/wrappable.cc |
+++ b/gin/wrappable.cc |
@@ -44,6 +44,14 @@ v8::Handle<v8::Object> WrappableBase::GetWrapperImpl(v8::Isolate* isolate, |
} |
CHECK_EQ(kNumberOfInternalFields, templ->InternalFieldCount()); |
v8::Handle<v8::Object> wrapper = templ->NewInstance(); |
+ // |wrapper| may be empty in some extreme cases, e.g., when |
+ // Object.prototype.constructor is overwritten. |
+ if (wrapper.IsEmpty()) { |
+ // The current wrappable object will be no longer managed by V8. Delete this |
+ // now. |
+ delete this; |
+ return wrapper; |
+ } |
wrapper->SetAlignedPointerInInternalField(kWrapperInfoIndex, info); |
wrapper->SetAlignedPointerInInternalField(kEncodedValueIndex, this); |
wrapper_.Reset(isolate, wrapper); |