Skip to content
This repository was archived by the owner on Oct 15, 2020. It is now read-only.

Commit c8b29ba

Browse files
committed
src: update napi_get_new_target to match docs
The implementation for `napi_get_new_target` needs to return nullptr when the function is not being called as a constructor. PR-URL: #490 Reviewed-By: Taylor Woll <tawoll@ntdev.microsoft.com> Reviewed-By: Jimmy Thomson <jithomso@microsoft.com>
1 parent 6566808 commit c8b29ba

File tree

2 files changed

+13
-8
lines changed

2 files changed

+13
-8
lines changed

src/node_api_jsrt.cc

Lines changed: 10 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -89,9 +89,10 @@ static void napi_clear_last_error();
8989
struct CallbackInfo {
9090
napi_value newTarget;
9191
napi_value thisArg;
92-
uint16_t argc;
9392
napi_value* argv;
9493
void* data;
94+
uint16_t argc;
95+
bool isConstructCall;
9596
};
9697

9798
struct napi_env__ {
@@ -240,6 +241,7 @@ class ExternalCallback {
240241
CallbackInfo cbInfo;
241242
cbInfo.thisArg = reinterpret_cast<napi_value>(info->thisArg);
242243
cbInfo.newTarget = reinterpret_cast<napi_value>(info->newTargetArg);
244+
cbInfo.isConstructCall = info->isConstructCall;
243245
cbInfo.argc = argumentCount - 1;
244246
cbInfo.argv = reinterpret_cast<napi_value*>(arguments + 1);
245247
cbInfo.data = externalCallback->_data;
@@ -1385,8 +1387,14 @@ napi_status napi_get_new_target(napi_env env,
13851387
napi_value* result) {
13861388
CHECK_ARG(cbinfo);
13871389
CHECK_ARG(result);
1390+
13881391
const CallbackInfo *info = reinterpret_cast<CallbackInfo*>(cbinfo);
1389-
*result = info->newTarget;
1392+
if (info->isConstructCall) {
1393+
*result = info->newTarget;
1394+
} else {
1395+
*result = nullptr;
1396+
}
1397+
13901398
return napi_ok;
13911399
}
13921400

test/addons-napi/test_new_target/binding.c

Lines changed: 3 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ napi_value BaseClass(napi_env env, napi_callback_info info) {
1515
NAPI_ASSERT(env, !result, "this !== new.target");
1616

1717
// new.target !== undefined because we should be called as a new expression
18+
NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL");
1819
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
1920
NAPI_ASSERT(env, !result, "new.target !== undefined");
2021

@@ -33,6 +34,7 @@ napi_value Constructor(napi_env env, napi_callback_info info) {
3334
NAPI_CALL(env, napi_get_undefined(env, &undefined));
3435

3536
// new.target !== undefined because we should be called as a new expression
37+
NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL");
3638
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
3739
NAPI_ASSERT(env, !result, "new.target !== undefined");
3840

@@ -44,15 +46,10 @@ napi_value Constructor(napi_env env, napi_callback_info info) {
4446
}
4547

4648
napi_value OrdinaryFunction(napi_env env, napi_callback_info info) {
47-
bool result;
4849
napi_value newTargetArg;
4950
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
50-
napi_value undefined;
51-
NAPI_CALL(env, napi_get_undefined(env, &undefined));
5251

53-
// new.target === undefined because we are not called as a new expression
54-
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
55-
NAPI_ASSERT(env, result, "new.target === undefined");
52+
NAPI_ASSERT(env, newTargetArg == NULL, "newTargetArg == NULL");
5653

5754
napi_value _true;
5855
NAPI_CALL(env, napi_get_boolean(env, true, &_true));

0 commit comments

Comments
 (0)