Skip to content

Commit f36521b

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. PR-URL: #19236 Reviewed-By: James M Snell <[email protected]> Reviewed-By: Michael Dawson <[email protected]>
1 parent f06622c commit f36521b

File tree

3 files changed

+99
-0
lines changed

3 files changed

+99
-0
lines changed
Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
1+
#include<node_api.h>
2+
#include"../common.h"
3+
4+
napi_valueBaseClass(napi_envenv, napi_callback_infoinfo){
5+
napi_valuenewTargetArg;
6+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
7+
napi_valuethisArg;
8+
NAPI_CALL(env, napi_get_cb_info(env, info, NULL, NULL, &thisArg, NULL));
9+
napi_valueundefined;
10+
NAPI_CALL(env, napi_get_undefined(env, &undefined));
11+
12+
// this !== new.target since we are being invoked through super()
13+
boolresult;
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+
returnthisArg;
23+
}
24+
25+
napi_valueConstructor(napi_envenv, napi_callback_infoinfo){
26+
boolresult;
27+
napi_valuenewTargetArg;
28+
NAPI_CALL(env, napi_get_new_target(env, info, &newTargetArg));
29+
size_targc=1;
30+
napi_valueargv;
31+
napi_valuethisArg;
32+
NAPI_CALL(env, napi_get_cb_info(env, info, &argc, &argv, &thisArg, NULL));
33+
napi_valueundefined;
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+
returnthisArg;
46+
}
47+
48+
napi_valueOrdinaryFunction(napi_envenv, napi_callback_infoinfo){
49+
napi_valuenewTargetArg;
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_valueInit(napi_envenv, napi_valueexports){
60+
constnapi_property_descriptordesc[] ={
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+
returnexports;
67+
}
68+
69+
NAPI_MODULE(NODE_GYP_MODULE_NAME, Init)
Lines changed: 9 additions & 0 deletions
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+
}
Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
'use strict';
2+
3+
constcommon=require('../../common');
4+
constassert=require('assert');
5+
constbinding=require(`./build/${common.buildType}/binding`);
6+
7+
classClassextendsbinding.BaseClass{
8+
constructor(){
9+
super();
10+
this.method();
11+
}
12+
method(){
13+
this.ok=true;
14+
}
15+
}
16+
17+
assert.ok(newClass()instanceofbinding.BaseClass);
18+
assert.ok(newClass().ok);
19+
assert.ok(binding.OrdinaryFunction());
20+
assert.ok(
21+
newbinding.Constructor(binding.Constructor)instanceofbinding.Constructor);

0 commit comments

Comments
(0)