diff --git a/napi-inl.h b/napi-inl.h index c6ef0fbb0..6e782c2b2 100644 --- a/napi-inl.h +++ b/napi-inl.h @@ -165,7 +165,7 @@ napi_value TemplatedInstanceCallback(napi_env env, return details::WrapCallback([&] { CallbackInfo cbInfo(env, info); T* instance = T::Unwrap(cbInfo.This().As()); - return (instance->*UnwrapCallback)(cbInfo); + return instance ? (instance->*UnwrapCallback)(cbInfo) : Napi::Value(); }); } @@ -175,7 +175,7 @@ napi_value TemplatedInstanceVoidCallback(napi_env env, napi_callback_info info) return details::WrapCallback([&] { CallbackInfo cbInfo(env, info); T* instance = T::Unwrap(cbInfo.This().As()); - (instance->*UnwrapCallback)(cbInfo); + if (instance) (instance->*UnwrapCallback)(cbInfo); return nullptr; }); } @@ -4340,7 +4340,7 @@ inline napi_value InstanceWrap::InstanceVoidMethodCallbackWrapper( callbackInfo.SetData(callbackData->data); T* instance = T::Unwrap(callbackInfo.This().As()); auto cb = callbackData->callback; - (instance->*cb)(callbackInfo); + if (instance) (instance->*cb)(callbackInfo); return nullptr; }); } @@ -4355,7 +4355,7 @@ inline napi_value InstanceWrap::InstanceMethodCallbackWrapper( callbackInfo.SetData(callbackData->data); T* instance = T::Unwrap(callbackInfo.This().As()); auto cb = callbackData->callback; - return (instance->*cb)(callbackInfo); + return instance ? (instance->*cb)(callbackInfo) : Napi::Value(); }); } @@ -4369,7 +4369,7 @@ inline napi_value InstanceWrap::InstanceGetterCallbackWrapper( callbackInfo.SetData(callbackData->data); T* instance = T::Unwrap(callbackInfo.This().As()); auto cb = callbackData->getterCallback; - return (instance->*cb)(callbackInfo); + return instance ? (instance->*cb)(callbackInfo) : Napi::Value(); }); } @@ -4383,7 +4383,7 @@ inline napi_value InstanceWrap::InstanceSetterCallbackWrapper( callbackInfo.SetData(callbackData->data); T* instance = T::Unwrap(callbackInfo.This().As()); auto cb = callbackData->setterCallback; - (instance->*cb)(callbackInfo, callbackInfo[0]); + if (instance) (instance->*cb)(callbackInfo, callbackInfo[0]); return nullptr; }); } @@ -4395,7 +4395,7 @@ inline napi_value InstanceWrap::WrappedMethod( return details::WrapCallback([&] { const CallbackInfo cbInfo(env, info); T* instance = T::Unwrap(cbInfo.This().As()); - (instance->*method)(cbInfo, cbInfo[0]); + if (instance) (instance->*method)(cbInfo, cbInfo[0]); return nullptr; }); } diff --git a/test/objectwrap.js b/test/objectwrap.js index 58528e9e3..a0d278062 100644 --- a/test/objectwrap.js +++ b/test/objectwrap.js @@ -24,6 +24,9 @@ async function test (binding) { obj.testSetter = 'instance getter 2'; assert.strictEqual(obj.testGetter, 'instance getter 2'); assert.strictEqual(obj.testGetterT, 'instance getter 2'); + + assert.throws(() => clazz.prototype.testGetter, /Invalid argument/); + assert.throws(() => clazz.prototype.testGetterT, /Invalid argument/); } // read write-only @@ -61,6 +64,9 @@ async function test (binding) { obj.testGetSetT = 'instance getset 4'; assert.strictEqual(obj.testGetSetT, 'instance getset 4'); + + assert.throws(() => { clazz.prototype.testGetSet = 'instance getset'; }, /Invalid argument/); + assert.throws(() => { clazz.prototype.testGetSetT = 'instance getset'; }, /Invalid argument/); } // rw symbol @@ -98,6 +104,9 @@ async function test (binding) { assert.strictEqual(obj.testMethodT(), 'method<>(const char*)'); obj[clazz.kTestVoidMethodTInternal]('method<>(Symbol)'); assert.strictEqual(obj[clazz.kTestMethodTInternal](), 'method<>(Symbol)'); + assert.throws(() => clazz.prototype.testMethod('method')); + assert.throws(() => clazz.prototype.testMethodT()); + assert.throws(() => clazz.prototype.testVoidMethodT('method<>(const char*)')); }; const testEnumerables = (obj, clazz) => {