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