|
17 | 17 | #define PROP_KEY_PROTOTYPE "prototype" |
18 | 18 | #define PROP_KEY_CONSTRUCTOR "constructor" |
19 | 19 |
|
| 20 | +#define DEFINE_PROP(env, propStr, fieldName) \ |
| 21 | +do { \ |
| 22 | + napi_value localVal = nullptr; \ |
| 23 | + napi_create_string_utf8(env, propStr, NAPI_AUTO_LENGTH, &localVal); \ |
| 24 | + napi_create_reference(env, localVal, 1, &fieldName); \ |
| 25 | +} while(0) |
| 26 | + |
| 27 | +#define PROP_GETTER(propName) \ |
| 28 | +napi_value Constants::propName##Value(napi_env env) { \ |
| 29 | + napi_value val = nullptr; \ |
| 30 | + napi_get_reference_value(env, propName##ValueRef, &val); \ |
| 31 | + return val; \ |
| 32 | +} |
| 33 | + |
20 | 34 | std::unordered_map<napi_env, Constants*> Constants::s_constantsMap; |
21 | 35 | std::string Constants::APP_ROOT_FOLDER_PATH; |
22 | 36 | std::string Constants::V8_STARTUP_FLAGS; |
23 | 37 |
|
24 | 38 | Constants::Constants() |
25 | | - : extendValue(nullptr), nullObjectValue(nullptr), nullNodeNameValue(nullptr), |
26 | | - valueOfValue(nullptr), classValue(nullptr), privateTypeNameValue(nullptr), |
27 | | - classImplementationObjectValue(nullptr), superValue(nullptr), superValueValue(nullptr), |
28 | | - privateJsInfoValue(nullptr), privateCallSuperValue(nullptr), privateIsNapiValue(nullptr), |
29 | | - toStringValue(nullptr), isPrototypeImplementationObjectValue(nullptr) {} |
| 39 | + : extendValueRef(nullptr), |
| 40 | + nullObjectValueRef(nullptr), |
| 41 | + nullNodeNameValueRef(nullptr), |
| 42 | + valueOfValueRef(nullptr), |
| 43 | + clsValueRef(nullptr), |
| 44 | + privateTypeNameValueRef(nullptr), |
| 45 | + classImplementationObjectValueRef(nullptr), |
| 46 | + superValueRef(nullptr), |
| 47 | + superValueValueRef(nullptr), |
| 48 | + privateJsInfoValueRef(nullptr), |
| 49 | + privateCallSuperValueRef(nullptr), |
| 50 | + privateIsNapiValueRef(nullptr), |
| 51 | + toStringValueRef(nullptr), |
| 52 | + isPrototypeImplementationObjectValueRef(nullptr), |
| 53 | + prototypeValueRef(nullptr), |
| 54 | + constructorValueRef(nullptr), |
| 55 | + nameValueRef(nullptr), |
| 56 | + objectValueRef(nullptr), |
| 57 | + numberValueRef(nullptr), |
| 58 | + isIntegerValueRef(nullptr), |
| 59 | + setPrototypeOfValueRef(nullptr), |
| 60 | + stringValueRef(nullptr), |
| 61 | + booleanValueRef(nullptr), |
| 62 | + protoValueRef(nullptr), |
| 63 | + valueValueRef(nullptr) {} |
30 | 64 |
|
31 | 65 | napi_status Constants::Init(napi_env env) { |
32 | 66 | if (s_constantsMap.find(env) == s_constantsMap.end()) { |
33 | 67 | auto* instance = new Constants(); |
34 | 68 |
|
35 | | - napi_create_string_utf8(env, PROP_KEY_EXTEND, NAPI_AUTO_LENGTH, &instance->extendValue); |
36 | | - napi_create_string_utf8(env, PROP_KEY_NULLOBJECT, NAPI_AUTO_LENGTH, &instance->nullObjectValue); |
37 | | - napi_create_string_utf8(env, PROP_KEY_NULL_NODE_NAME, NAPI_AUTO_LENGTH, &instance->nullNodeNameValue); |
38 | | - napi_create_string_utf8(env, PROP_KEY_VALUEOF, NAPI_AUTO_LENGTH, &instance->valueOfValue); |
39 | | - napi_create_string_utf8(env, PROP_KEY_CLASS, NAPI_AUTO_LENGTH, &instance->classValue); |
40 | | - napi_create_string_utf8(env, PRIVATE_TYPE_NAME, NAPI_AUTO_LENGTH, &instance->privateTypeNameValue); |
41 | | - napi_create_string_utf8(env, CLASS_IMPLEMENTATION_OBJECT, NAPI_AUTO_LENGTH, &instance->classImplementationObjectValue); |
42 | | - napi_create_string_utf8(env, PROP_KEY_SUPER, NAPI_AUTO_LENGTH, &instance->superValue); |
43 | | - napi_create_string_utf8(env, PROP_KEY_SUPERVALUE, NAPI_AUTO_LENGTH, &instance->superValueValue); |
44 | | - napi_create_string_utf8(env, PRIVATE_JSINFO, NAPI_AUTO_LENGTH, &instance->privateJsInfoValue); |
45 | | - napi_create_string_utf8(env, PRIVATE_CALLSUPER, NAPI_AUTO_LENGTH, &instance->privateCallSuperValue); |
46 | | - napi_create_string_utf8(env, PRIVATE_IS_NAPI, NAPI_AUTO_LENGTH, &instance->privateIsNapiValue); |
47 | | - napi_create_string_utf8(env, PROP_KEY_TOSTRING, NAPI_AUTO_LENGTH, &instance->toStringValue); |
48 | | - napi_create_string_utf8(env, PROP_KEY_IS_PROTOTYPE_IMPLEMENTATION_OBJECT, NAPI_AUTO_LENGTH, &instance->isPrototypeImplementationObjectValue); |
49 | | - napi_create_string_utf8(env, PROP_KEY_PROTOTYPE, NAPI_AUTO_LENGTH, &instance->prototypeValue); |
50 | | - napi_create_string_utf8(env, PROP_KEY_CONSTRUCTOR, NAPI_AUTO_LENGTH, &instance->constructorValue); |
51 | | - |
52 | | - napi_create_string_utf8(env, "name", NAPI_AUTO_LENGTH, &instance->nameValue); |
53 | | - napi_create_string_utf8(env, "Object", NAPI_AUTO_LENGTH, &instance->objectValue); |
54 | | - napi_create_string_utf8(env, "Number", NAPI_AUTO_LENGTH, &instance->numberValue); |
55 | | - napi_create_string_utf8(env, "isInteger", NAPI_AUTO_LENGTH, &instance->isIntegerValue); |
56 | | - napi_create_string_utf8(env, "String", NAPI_AUTO_LENGTH, &instance->stringValue); |
57 | | - napi_create_string_utf8(env, "Boolean", NAPI_AUTO_LENGTH, &instance->booleanValue); |
58 | | - napi_create_string_utf8(env, "setPrototypeOf", NAPI_AUTO_LENGTH, &instance->setPrototypeOf); |
59 | | - napi_create_string_utf8(env, "__proto__", NAPI_AUTO_LENGTH, &instance->protoValue); |
60 | | - napi_create_string_utf8(env, "value", NAPI_AUTO_LENGTH, &instance->valueValue); |
| 69 | + DEFINE_PROP(env, PROP_KEY_EXTEND, instance->extendValueRef); |
| 70 | + DEFINE_PROP(env, PROP_KEY_NULLOBJECT, instance->nullObjectValueRef); |
| 71 | + DEFINE_PROP(env, PROP_KEY_NULL_NODE_NAME, instance->nullNodeNameValueRef); |
| 72 | + DEFINE_PROP(env, PROP_KEY_VALUEOF, instance->valueOfValueRef); |
| 73 | + DEFINE_PROP(env, PROP_KEY_CLASS, instance->clsValueRef); |
| 74 | + DEFINE_PROP(env, PRIVATE_TYPE_NAME, instance->privateTypeNameValueRef); |
| 75 | + DEFINE_PROP(env, CLASS_IMPLEMENTATION_OBJECT, instance->classImplementationObjectValueRef); |
| 76 | + DEFINE_PROP(env, PROP_KEY_SUPER, instance->superValueRef); |
| 77 | + DEFINE_PROP(env, PROP_KEY_SUPERVALUE, instance->superValueValueRef); |
| 78 | + DEFINE_PROP(env, PRIVATE_JSINFO, instance->privateJsInfoValueRef); |
| 79 | + DEFINE_PROP(env, PRIVATE_CALLSUPER, instance->privateCallSuperValueRef); |
| 80 | + DEFINE_PROP(env, PRIVATE_IS_NAPI, instance->privateIsNapiValueRef); |
| 81 | + DEFINE_PROP(env, PROP_KEY_TOSTRING, instance->toStringValueRef); |
| 82 | + DEFINE_PROP(env, PROP_KEY_IS_PROTOTYPE_IMPLEMENTATION_OBJECT, instance->isPrototypeImplementationObjectValueRef); |
| 83 | + DEFINE_PROP(env, PROP_KEY_PROTOTYPE, instance->prototypeValueRef); |
| 84 | + DEFINE_PROP(env, PROP_KEY_CONSTRUCTOR, instance->constructorValueRef); |
| 85 | + DEFINE_PROP(env, "name", instance->nameValueRef); |
| 86 | + DEFINE_PROP(env, "Object", instance->objectValueRef); |
| 87 | + DEFINE_PROP(env, "Number", instance->numberValueRef); |
| 88 | + DEFINE_PROP(env, "isInteger", instance->isIntegerValueRef); |
| 89 | + DEFINE_PROP(env, "setPrototypeOf", instance->setPrototypeOfValueRef); |
| 90 | + DEFINE_PROP(env, "String", instance->stringValueRef); |
| 91 | + DEFINE_PROP(env, "Boolean", instance->booleanValueRef); |
| 92 | + DEFINE_PROP(env, "__proto__", instance->protoValueRef); |
| 93 | + DEFINE_PROP(env, "value", instance->valueValueRef); |
61 | 94 |
|
62 | 95 | s_constantsMap[env] = instance; |
63 | 96 | } |
64 | 97 | return napi_ok; |
65 | 98 | } |
66 | 99 |
|
| 100 | +PROP_GETTER(extend) |
| 101 | +PROP_GETTER(nullObject) |
| 102 | +PROP_GETTER(nullNodeName) |
| 103 | +PROP_GETTER(valueOf) |
| 104 | +PROP_GETTER(cls) |
| 105 | +PROP_GETTER(privateTypeName) |
| 106 | +PROP_GETTER(classImplementationObject) |
| 107 | +PROP_GETTER(super) |
| 108 | +PROP_GETTER(superValue) |
| 109 | +PROP_GETTER(privateJsInfo) |
| 110 | +PROP_GETTER(privateCallSuper) |
| 111 | +PROP_GETTER(privateIsNapi) |
| 112 | +PROP_GETTER(toString) |
| 113 | +PROP_GETTER(isPrototypeImplementationObject) |
| 114 | +PROP_GETTER(prototype) |
| 115 | +PROP_GETTER(constructor) |
| 116 | +PROP_GETTER(name) |
| 117 | +PROP_GETTER(object) |
| 118 | +PROP_GETTER(number) |
| 119 | +PROP_GETTER(isInteger) |
| 120 | +PROP_GETTER(setPrototypeOf) |
| 121 | +PROP_GETTER(string) |
| 122 | +PROP_GETTER(boolean) |
| 123 | +PROP_GETTER(proto) |
| 124 | +PROP_GETTER(value) |
| 125 | + |
67 | 126 | Constants* Constants::Get(napi_env env) { |
68 | 127 | auto it = s_constantsMap.find(env); |
69 | 128 | if (it != s_constantsMap.end()) { |
|
0 commit comments