1 /* 2 * Copyright (c) 2021 Huawei Device Co., Ltd. 3 * Licensed under the Apache License, Version 2.0 (the "License"); 4 * you may not use this file except in compliance with the License. 5 * You may obtain a copy of the License at 6 * 7 * http://www.apache.org/licenses/LICENSE-2.0 8 * 9 * Unless required by applicable law or agreed to in writing, software 10 * distributed under the License is distributed on an "AS IS" BASIS, 11 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12 * See the License for the specific language governing permissions and 13 * limitations under the License. 14 */ 15 16 #ifndef FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_COMMON_H 17 #define FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_COMMON_H 18 19 #define NAPI_RETVAL_NOTHING 20 21 #define GET_AND_THROW_LAST_ERROR(env) \ 22 do { \ 23 const napi_extended_error_info* errorInfo = nullptr; \ 24 napi_get_last_error_info((env), &errorInfo); \ 25 bool isPending = false; \ 26 napi_is_exception_pending((env), &isPending); \ 27 if (!isPending && errorInfo != nullptr) { \ 28 const char* errorMessage = \ 29 errorInfo->error_message != nullptr ? errorInfo->error_message : "empty error message"; \ 30 napi_throw_error((env), nullptr, errorMessage); \ 31 } \ 32 } while (0) 33 34 #define NAPI_ASSERT_BASE(env, assertion, message, retVal) \ 35 do { \ 36 if (!(assertion)) { \ 37 napi_throw_error((env), nullptr, "assertion (" #assertion ") failed: " message); \ 38 return retVal; \ 39 } \ 40 } while (0) 41 42 #define NAPI_ASSERT(env, assertion, message) NAPI_ASSERT_BASE(env, assertion, message, nullptr) 43 44 #define NAPI_ASSERT_RETURN_VOID(env, assertion, message) NAPI_ASSERT_BASE(env, assertion, message, NAPI_RETVAL_NOTHING) 45 46 #define NAPI_CALL_BASE(env, theCall, retVal) \ 47 do { \ 48 if ((theCall) != napi_ok) { \ 49 GET_AND_THROW_LAST_ERROR((env)); \ 50 return retVal; \ 51 } \ 52 } while (0) 53 54 #define NAPI_CALL(env, theCall) NAPI_CALL_BASE(env, theCall, nullptr) 55 56 #define NAPI_CALL_RETURN_VOID(env, theCall) NAPI_CALL_BASE(env, theCall, NAPI_RETVAL_NOTHING) 57 58 // W-writable E-enumerable C-configurable napi_default is not WEC 59 #define DECLARE_NAPI_PROPERTY(name, val) \ 60 { \ 61 (name), nullptr, nullptr, nullptr, nullptr, val, napi_default, nullptr \ 62 } 63 64 // W-writable E-enumerable C-configurable tihs define is W 65 #define DECLARE_NAPI_INSTANCE_PROPERTY(name, val) \ 66 { \ 67 (name), nullptr, nullptr, nullptr, nullptr, val, \ 68 static_cast<napi_property_attributes>(NATIVE_INSTANCE | napi_writable), nullptr \ 69 } 70 71 // W-writable E-enumerable C-configurable tihs define is W 72 #define DECLARE_NAPI_INSTANCE_OBJECT_PROPERTY(name) \ 73 { \ 74 (name), nullptr, nullptr, nullptr, nullptr, nullptr, \ 75 static_cast<napi_property_attributes>(NATIVE_INSTANCE_OBJECT | napi_writable), nullptr \ 76 } 77 78 // W-writable E-enumerable C-configurable tihs define is W 79 #define DECLARE_NAPI_INSTANCE_GENERIC_PROPERTY(name) \ 80 { \ 81 (name), nullptr, nullptr, nullptr, nullptr, nullptr, \ 82 static_cast<napi_property_attributes>(NATIVE_INSTANCE_GENERIC | napi_writable), nullptr \ 83 } 84 85 // W-writable E-enumerable C-configurable napi_default_jsproperty is WEC 86 #define DECLARE_NAPI_DEFAULT_PROPERTY(name, val) \ 87 { \ 88 (name), nullptr, nullptr, nullptr, nullptr, val, napi_default_jsproperty, nullptr \ 89 } 90 91 //static properties 92 #define DECLARE_NAPI_STATIC_PROPERTY(name, val) \ 93 { \ 94 (name), nullptr, nullptr, nullptr, nullptr, val, napi_static, nullptr \ 95 } 96 97 // W-writable E-enumerable C-configurable napi_default is not WEC 98 #define DECLARE_NAPI_FUNCTION(name, func) \ 99 { \ 100 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, nullptr \ 101 } 102 103 // W-writable E-enumerable C-configurable napi_default_jsproperty is WEC 104 #define DECLARE_NAPI_DEFAULT_PROPERTY_FUNCTION(name, func) \ 105 { \ 106 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default_jsproperty, nullptr \ 107 } 108 109 // W-writable E-enumerable C-configurable napi_default is not WEC 110 #define DECLARE_NAPI_FUNCTION_WITH_DATA(name, func, data) \ 111 { \ 112 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, data \ 113 } 114 115 // W-writable E-enumerable C-configurable napi_default_jsproperty is WEC 116 #define DECLARE_NAPI_FUNCTION_WITH_WEC(name, func) \ 117 { \ 118 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default_jsproperty, nullptr \ 119 } 120 121 // W-writable E-enumerable C-configurable napi_default_jsproperty is WEC 122 #define DECLARE_NAPI_FUNCTION_WITH_DATA_WITH_WEC(name, func, data) \ 123 { \ 124 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default_jsproperty, data \ 125 } 126 127 // W-writable E-enumerable C-configurable napi_default is not WEC 128 #define DECLARE_NAPI_FUNCTION_WITHOUT_WEC(name, func) \ 129 { \ 130 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, nullptr \ 131 } 132 133 // W-writable E-enumerable C-configurable napi_default is not WEC 134 #define DECLARE_NAPI_FUNCTION_WITH_DATA_WITHOUT_WEC(name, func) \ 135 { \ 136 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_default, data \ 137 } 138 139 //static properties 140 #define DECLARE_NAPI_STATIC_FUNCTION(name, func) \ 141 { \ 142 (name), nullptr, (func), nullptr, nullptr, nullptr, napi_static, nullptr \ 143 } 144 145 // W-writable E-enumerable C-configurable napi_default is not WEC 146 #define DECLARE_NAPI_GETTER(name, getter) \ 147 { \ 148 (name), nullptr, nullptr, (getter), nullptr, nullptr, napi_default, nullptr \ 149 } 150 151 // W-writable E-enumerable C-configurable napi_default is not WEC 152 #define DECLARE_NAPI_SETTER(name, setter) \ 153 { \ 154 (name), nullptr, nullptr, nullptr, (setter), nullptr, napi_default, nullptr \ 155 } 156 157 // W-writable E-enumerable C-configurable napi_default is not WEC 158 #define DECLARE_NAPI_GETTER_SETTER(name, getter, setter) \ 159 { \ 160 (name), nullptr, nullptr, (getter), (setter), nullptr, napi_default, nullptr \ 161 } 162 163 #endif /* FOUNDATION_ACE_NAPI_INTERFACES_KITS_NAPI_NATIVE_COMMON_H */ 164