• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 #define NAPI_VERSION 9
2 #include <js_native_api.h>
3 #include "../common.h"
4 #include "../entry_point.h"
5 
6 static double value_ = 1;
7 
GetValue(napi_env env,napi_callback_info info)8 static napi_value GetValue(napi_env env, napi_callback_info info) {
9   size_t argc = 0;
10   NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, NULL, NULL, NULL));
11 
12   NODE_API_ASSERT(env, argc == 0, "Wrong number of arguments");
13 
14   napi_value number;
15   NODE_API_CALL(env, napi_create_double(env, value_, &number));
16 
17   return number;
18 }
19 
SetValue(napi_env env,napi_callback_info info)20 static napi_value SetValue(napi_env env, napi_callback_info info) {
21   size_t argc = 1;
22   napi_value args[1];
23   NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
24 
25   NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
26 
27   NODE_API_CALL(env, napi_get_value_double(env, args[0], &value_));
28 
29   return NULL;
30 }
31 
Echo(napi_env env,napi_callback_info info)32 static napi_value Echo(napi_env env, napi_callback_info info) {
33   size_t argc = 1;
34   napi_value args[1];
35   NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
36 
37   NODE_API_ASSERT(env, argc == 1, "Wrong number of arguments");
38 
39   return args[0];
40 }
41 
HasNamedProperty(napi_env env,napi_callback_info info)42 static napi_value HasNamedProperty(napi_env env, napi_callback_info info) {
43   size_t argc = 2;
44   napi_value args[2];
45   NODE_API_CALL(env, napi_get_cb_info(env, info, &argc, args, NULL, NULL));
46 
47   NODE_API_ASSERT(env, argc == 2, "Wrong number of arguments");
48 
49   // Extract the name of the property to check
50   char buffer[128];
51   size_t copied;
52   NODE_API_CALL(env,
53       napi_get_value_string_utf8(env, args[1], buffer, sizeof(buffer), &copied));
54 
55   // do the check and create the boolean return value
56   bool value;
57   napi_value result;
58   NODE_API_CALL(env, napi_has_named_property(env, args[0], buffer, &value));
59   NODE_API_CALL(env, napi_get_boolean(env, value, &result));
60 
61   return result;
62 }
63 
64 EXTERN_C_START
Init(napi_env env,napi_value exports)65 napi_value Init(napi_env env, napi_value exports) {
66   napi_value number;
67   NODE_API_CALL(env, napi_create_double(env, value_, &number));
68 
69   napi_value name_value;
70   NODE_API_CALL(env,
71       napi_create_string_utf8(
72           env, "NameKeyValue", NAPI_AUTO_LENGTH, &name_value));
73 
74   napi_value symbol_description;
75   napi_value name_symbol;
76   NODE_API_CALL(env,
77       napi_create_string_utf8(
78           env, "NameKeySymbol", NAPI_AUTO_LENGTH, &symbol_description));
79   NODE_API_CALL(env,
80       napi_create_symbol(env, symbol_description, &name_symbol));
81 
82   napi_value name_symbol_descriptionless;
83   NODE_API_CALL(env,
84       napi_create_symbol(env, NULL, &name_symbol_descriptionless));
85 
86   napi_value name_symbol_for;
87   NODE_API_CALL(env, node_api_symbol_for(env,
88                                          "NameKeySymbolFor",
89                                          NAPI_AUTO_LENGTH,
90                                          &name_symbol_for));
91 
92   napi_property_descriptor properties[] = {
93     { "echo", 0, Echo, 0, 0, 0, napi_enumerable, 0 },
94     { "readwriteValue", 0, 0, 0, 0, number, napi_enumerable | napi_writable, 0 },
95     { "readonlyValue", 0, 0, 0, 0, number, napi_enumerable, 0},
96     { "hiddenValue", 0, 0, 0, 0, number, napi_default, 0},
97     { NULL, name_value, 0, 0, 0, number, napi_enumerable, 0},
98     { NULL, name_symbol, 0, 0, 0, number, napi_enumerable, 0},
99     { NULL, name_symbol_descriptionless, 0, 0, 0, number, napi_enumerable, 0},
100     { NULL, name_symbol_for, 0, 0, 0, number, napi_enumerable, 0},
101     { "readwriteAccessor1", 0, 0, GetValue, SetValue, 0, napi_default, 0},
102     { "readwriteAccessor2", 0, 0, GetValue, SetValue, 0, napi_writable, 0},
103     { "readonlyAccessor1", 0, 0, GetValue, NULL, 0, napi_default, 0},
104     { "readonlyAccessor2", 0, 0, GetValue, NULL, 0, napi_writable, 0},
105     { "hasNamedProperty", 0, HasNamedProperty, 0, 0, 0, napi_default, 0 },
106   };
107 
108   NODE_API_CALL(env, napi_define_properties(
109       env, exports, sizeof(properties) / sizeof(*properties), properties));
110 
111   return exports;
112 }
113 EXTERN_C_END
114