• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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