1#define NAPI_VERSION 9
2#include <js_native_api.h>
3#include "../common.h"
4#include "../entry_point.h"
5
6static double value_ = 1;
7
8static 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
20static 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
32static 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
42static 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
64EXTERN_C_START
65napi_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}
113EXTERN_C_END
114