Skip to content

Commit 4c1181d

Browse files
boingoingMylesBorins
authored andcommitted
n-api,test: add a new.target test to addons-napi
Added a N-API test to verify new.target behavior. Backport-PR-URL: #19265 PR-URL: #19236 Reviewed-By: James M Snell <jasnell@gmail.com> Reviewed-By: Michael Dawson <michael_dawson@ca.ibm.com>
1 parent faf94b1 commit 4c1181d

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed
+69
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include <node_api.h>
2+
#include "../common.h"
3+
4+
napi_value BaseClass(napi_env env, napi_callback_info info) {
5+
napi_value newTargetArg;
6+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
7+
napi_value thisArg;
8+
NAPI_CALL(env, napi_get_cb_info(env, info, NULL, NULL, &thisArg, NULL));
9+
napi_value undefined;
10+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
11+
12+
// this !== new.target since we are being invoked through super()
13+
bool result;
14+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, thisArg, &result));
15+
NAPI_ASSERT(env, !result, "this !== new.target");
16+
17+
// new.target !== undefined because we should be called as a new expression
18+
NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL");
19+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
20+
NAPI_ASSERT(env, !result, "new.target !== undefined");
21+
22+
return thisArg;
23+
}
24+
25+
napi_value Constructor(napi_env env, napi_callback_info info) {
26+
bool result;
27+
napi_value newTargetArg;
28+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
29+
size_t argc = 1;
30+
napi_value argv;
31+
napi_value thisArg;
32+
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisArg, NULL));
33+
napi_value undefined;
34+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
35+
36+
// new.target !== undefined because we should be called as a new expression
37+
NAPI_ASSERT(env, newTargetArg != NULL, "newTargetArg != NULL");
38+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, undefined, &result));
39+
NAPI_ASSERT(env, !result, "new.target !== undefined");
40+
41+
// arguments[0] should be Constructor itself (test harness passed it)
42+
NAPI_CALL(env, napi_strict_equals(env, newTargetArg, argv, &result));
43+
NAPI_ASSERT(env, result, "new.target === Constructor");
44+
45+
return thisArg;
46+
}
47+
48+
napi_value OrdinaryFunction(napi_env env, napi_callback_info info) {
49+
napi_value newTargetArg;
50+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
51+
52+
NAPI_ASSERT(env, newTargetArg == NULL, "newTargetArg == NULL");
53+
54+
napi_value _true;
55+
NAPI_CALL(env, napi_get_boolean(env, true, &_true));
56+
return _true;
57+
}
58+
59+
napi_value Init(napi_env env, napi_value exports) {
60+
const napi_property_descriptor desc[] = {
61+
DECLARE_NAPI_PROPERTY("BaseClass", BaseClass),
62+
DECLARE_NAPI_PROPERTY("OrdinaryFunction", OrdinaryFunction),
63+
DECLARE_NAPI_PROPERTY("Constructor", Constructor)
64+
};
65+
NAPI_CALL(env, napi_define_properties(env, exports, 3, desc));
66+
return exports;
67+
}
68+
69+
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
{
2+
'targets': [
3+
{
4+
'target_name': 'binding',
5+
'defines': [ 'V8_DEPRECATION_WARNINGS=1' ],
6+
'sources': [ 'binding.c' ]
7+
}
8+
]
9+
}
+21
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
3+
const common = require('../../common');
4+
const assert = require('assert');
5+
const binding = require(`./build/${common.buildType}/binding`);
6+
7+
class Class extends binding.BaseClass {
8+
constructor() {
9+
super();
10+
this.method();
11+
}
12+
method() {
13+
this.ok = true;
14+
}
15+
}
16+
17+
assert.ok(new Class() instanceof binding.BaseClass);
18+
assert.ok(new Class().ok);
19+
assert.ok(binding.OrdinaryFunction());
20+
assert.ok(
21+
new binding.Constructor(binding.Constructor) instanceof binding.Constructor);

0 commit comments

Comments
 (0)