Skip to content

Commit 789d000

Browse files
authored
Fix some build failures (#36)
- Move the `details` namespace to the top of `napi-inl.h`, because its declarations need to be present for some of its contents to be used (`FinalizeData` in particular) - Make `AsyncWorker::OnError` take a const `Error` reference, because right now `AsyncWorker::OnWorkComplete` calls it with an rvalue ref and `OnError` doesn’t need any non-const methods of `Error`. - Remove a `HandleScope` from `Error::New`, because the `HandleScope` constructor itself must be able to create an `Error` when handle scope creation fails.
1 parent b62dc80 commit 789d000

File tree

2 files changed

+101
-103
lines changed

2 files changed

+101
-103
lines changed

napi-inl.h

Lines changed: 100 additions & 102 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,105 @@
1414

1515
namespace Napi {
1616

17+
// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions
18+
// and rethrow them as JavaScript exceptions before returning from the callback.
19+
#define NAPI_RETHROW_JS_ERROR(env) \
20+
catch (const Error& e) { \
21+
e.ThrowAsJavaScriptException(); \
22+
return nullptr; \
23+
}
24+
25+
// Helpers to handle functions exposed from C++.
26+
namespace details {
27+
28+
template <typename Callable, typename Return>
29+
struct CallbackData {
30+
static inline
31+
napi_value Wrapper(napi_env env, napi_callback_info info) {
32+
try {
33+
CallbackInfo callbackInfo(env, info);
34+
CallbackData* callbackData =
35+
static_cast<CallbackData*>(callbackInfo.Data());
36+
callbackInfo.SetData(callbackData->data);
37+
return callbackData->callback(callbackInfo);
38+
}
39+
NAPI_RETHROW_JS_ERROR(env)
40+
}
41+
42+
Callable callback;
43+
void* data;
44+
};
45+
46+
template <typename Callable>
47+
struct CallbackData<Callable, void> {
48+
static inline
49+
napi_value Wrapper(napi_env env, napi_callback_info info) {
50+
try {
51+
CallbackInfo callbackInfo(env, info);
52+
CallbackData* callbackData =
53+
static_cast<CallbackData*>(callbackInfo.Data());
54+
callbackInfo.SetData(callbackData->data);
55+
callbackData->callback(callbackInfo);
56+
return nullptr;
57+
}
58+
NAPI_RETHROW_JS_ERROR(env)
59+
}
60+
61+
Callable callback;
62+
void* data;
63+
};
64+
65+
template <typename T, typename Finalizer, typename Hint = void>
66+
struct FinalizeData {
67+
static inline
68+
void Wrapper(napi_env env, void* data, void* finalizeHint) {
69+
FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
70+
finalizeData->callback(Env(env), static_cast<T*>(data));
71+
delete finalizeData;
72+
}
73+
74+
static inline
75+
void WrapperWithHint(napi_env env, void* data, void* finalizeHint) {
76+
FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
77+
finalizeData->callback(Env(env), static_cast<T*>(data), finalizeData->hint);
78+
delete finalizeData;
79+
}
80+
81+
Finalizer callback;
82+
Hint* hint;
83+
};
84+
85+
template <typename Getter, typename Setter>
86+
struct AccessorCallbackData {
87+
static inline
88+
napi_value GetterWrapper(napi_env env, napi_callback_info info) {
89+
try {
90+
CallbackInfo callbackInfo(env, info);
91+
AccessorCallbackData* callbackData =
92+
static_cast<AccessorCallbackData*>(callbackInfo.Data());
93+
return callbackData->getterCallback(callbackInfo);
94+
}
95+
NAPI_RETHROW_JS_ERROR(env)
96+
}
97+
98+
static inline
99+
napi_value SetterWrapper(napi_env env, napi_callback_info info) {
100+
try {
101+
CallbackInfo callbackInfo(env, info);
102+
AccessorCallbackData* callbackData =
103+
static_cast<AccessorCallbackData*>(callbackInfo.Data());
104+
callbackData->setterCallback(callbackInfo);
105+
return nullptr;
106+
}
107+
NAPI_RETHROW_JS_ERROR(env)
108+
}
109+
110+
Getter getterCallback;
111+
Setter setterCallback;
112+
};
113+
114+
} // namespace details
115+
17116
////////////////////////////////////////////////////////////////////////////////
18117
// Module registration
19118
////////////////////////////////////////////////////////////////////////////////
@@ -44,14 +143,6 @@ inline void RegisterModule(napi_env env,
44143
}
45144
}
46145

47-
// For use in JS to C++ callback wrappers to catch any Napi::Error exceptions
48-
// and rethrow them as JavaScript exceptions before returning from the callback.
49-
#define NAPI_RETHROW_JS_ERROR(env) \
50-
catch (const Error& e) { \
51-
e.ThrowAsJavaScriptException(); \
52-
return nullptr; \
53-
}
54-
55146
////////////////////////////////////////////////////////////////////////////////
56147
// Env class
57148
////////////////////////////////////////////////////////////////////////////////
@@ -1063,97 +1154,6 @@ inline const T* TypedArray_<T,A>::Data() const {
10631154
// Function class
10641155
////////////////////////////////////////////////////////////////////////////////
10651156

1066-
// Helpers to handle functions exposed from C++.
1067-
namespace details {
1068-
1069-
template <typename Callable, typename Return>
1070-
struct CallbackData {
1071-
static inline
1072-
napi_value Wrapper(napi_env env, napi_callback_info info) {
1073-
try {
1074-
CallbackInfo callbackInfo(env, info);
1075-
CallbackData* callbackData =
1076-
static_cast<CallbackData*>(callbackInfo.Data());
1077-
callbackInfo.SetData(callbackData->data);
1078-
return callbackData->callback(callbackInfo);
1079-
}
1080-
NAPI_RETHROW_JS_ERROR(env)
1081-
}
1082-
1083-
Callable callback;
1084-
void* data;
1085-
};
1086-
1087-
template <typename Callable>
1088-
struct CallbackData<Callable, void> {
1089-
static inline
1090-
napi_value Wrapper(napi_env env, napi_callback_info info) {
1091-
try {
1092-
CallbackInfo callbackInfo(env, info);
1093-
CallbackData* callbackData =
1094-
static_cast<CallbackData*>(callbackInfo.Data());
1095-
callbackInfo.SetData(callbackData->data);
1096-
callbackData->callback(callbackInfo);
1097-
return nullptr;
1098-
}
1099-
NAPI_RETHROW_JS_ERROR(env)
1100-
}
1101-
1102-
Callable callback;
1103-
void* data;
1104-
};
1105-
1106-
template <typename T, typename Finalizer, typename Hint = void>
1107-
struct FinalizeData {
1108-
static inline
1109-
void Wrapper(napi_env env, void* data, void* finalizeHint) {
1110-
FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
1111-
finalizeData->callback(Env(env), static_cast<T*>(data));
1112-
delete finalizeData;
1113-
}
1114-
1115-
static inline
1116-
void WrapperWithHint(napi_env env, void* data, void* finalizeHint) {
1117-
FinalizeData* finalizeData = static_cast<FinalizeData*>(finalizeHint);
1118-
finalizeData->callback(Env(env), static_cast<T*>(data), finalizeData->hint);
1119-
delete finalizeData;
1120-
}
1121-
1122-
Finalizer callback;
1123-
Hint* hint;
1124-
};
1125-
1126-
template <typename Getter, typename Setter>
1127-
struct AccessorCallbackData {
1128-
static inline
1129-
napi_value GetterWrapper(napi_env env, napi_callback_info info) {
1130-
try {
1131-
CallbackInfo callbackInfo(env, info);
1132-
AccessorCallbackData* callbackData =
1133-
static_cast<AccessorCallbackData*>(callbackInfo.Data());
1134-
return callbackData->getterCallback(callbackInfo);
1135-
}
1136-
NAPI_RETHROW_JS_ERROR(env)
1137-
}
1138-
1139-
static inline
1140-
napi_value SetterWrapper(napi_env env, napi_callback_info info) {
1141-
try {
1142-
CallbackInfo callbackInfo(env, info);
1143-
AccessorCallbackData* callbackData =
1144-
static_cast<AccessorCallbackData*>(callbackInfo.Data());
1145-
callbackData->setterCallback(callbackInfo);
1146-
return nullptr;
1147-
}
1148-
NAPI_RETHROW_JS_ERROR(env)
1149-
}
1150-
1151-
Getter getterCallback;
1152-
Setter setterCallback;
1153-
};
1154-
1155-
} // namespace details
1156-
11571157
template <typename Callable>
11581158
inline Function Function::New(napi_env env,
11591159
Callable cb,
@@ -1371,8 +1371,6 @@ inline void Buffer<T>::EnsureInfo() const {
13711371
////////////////////////////////////////////////////////////////////////////////
13721372

13731373
inline Error Error::New(napi_env env) {
1374-
HandleScope scope(env);
1375-
13761374
napi_status status;
13771375
napi_value error = nullptr;
13781376
if (Napi::Env(env).IsExceptionPending()) {
@@ -2656,7 +2654,7 @@ inline void AsyncWorker::OnOK() {
26562654
_callback.MakeCallback(_receiver.Value(), {});
26572655
}
26582656

2659-
inline void AsyncWorker::OnError(Error& e) {
2657+
inline void AsyncWorker::OnError(const Error& e) {
26602658
_callback.MakeCallback(_receiver.Value(), { e.Value() });
26612659
}
26622660

napi.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1011,7 +1011,7 @@ namespace Napi {
10111011

10121012
virtual void Execute() = 0;
10131013
virtual void OnOK();
1014-
virtual void OnError(Error& e);
1014+
virtual void OnError(const Error& e);
10151015

10161016
void SetError(const std::string& error);
10171017

0 commit comments

Comments
 (0)