1 #include <js_native_api.h>
2 #include "../common.h"
3
BaseClass(napi_env env,napi_callback_info info)4 static 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
Constructor(napi_env env,napi_callback_info info)25 static 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
OrdinaryFunction(napi_env env,napi_callback_info info)48 static 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 EXTERN_C_START
Init(napi_env env,napi_value exports)60 napi_value Init(napi_env env, napi_value exports) {
61 const napi_property_descriptor desc[] = {
62 DECLARE_NAPI_PROPERTY("BaseClass", BaseClass),
63 DECLARE_NAPI_PROPERTY("OrdinaryFunction", OrdinaryFunction),
64 DECLARE_NAPI_PROPERTY("Constructor", Constructor)
65 };
66 NAPI_CALL(env, napi_define_properties(env, exports, 3, desc));
67 return exports;
68 }
69 EXTERN_C_END
70