Lib/javascript/v8: use context-aware initialization.
Context-aware initialization allows to instantiate add-ons multiple times, most importantly in multiple Workers' contexts. Workers made first appearance in v10.5. Context-aware initialization was option earlier than that, even before supported minimum v6.x, yet condition is chosen more conservatively as NODE_MODULE_VERSION >= 64, a.k.a. v10.0.
This commit is contained in:
parent
0215eaa344
commit
b0c01ea851
4 changed files with 35 additions and 26 deletions
|
|
@ -5,27 +5,27 @@
|
|||
%insert(init) %{
|
||||
|
||||
SWIGRUNTIME void
|
||||
SWIG_V8_SetModule(void *, swig_module_info *swig_module) {
|
||||
v8::Local<v8::Object> global_obj = SWIGV8_CURRENT_CONTEXT()->Global();
|
||||
SWIG_V8_SetModule(v8::Local<v8::Context> context, swig_module_info *swig_module) {
|
||||
v8::Local<v8::Object> global_obj = context->Global();
|
||||
v8::Local<v8::External> mod = SWIGV8_EXTERNAL_NEW(swig_module);
|
||||
assert(!mod.IsEmpty());
|
||||
#if (V8_MAJOR_VERSION-0) < 5
|
||||
global_obj->SetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"), mod);
|
||||
#else
|
||||
v8::Local<v8::Private> privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data"));
|
||||
global_obj->SetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey, mod);
|
||||
global_obj->SetPrivate(context, privateKey, mod);
|
||||
#endif
|
||||
}
|
||||
|
||||
SWIGRUNTIME swig_module_info *
|
||||
SWIG_V8_GetModule(void *) {
|
||||
v8::Local<v8::Object> global_obj = SWIGV8_CURRENT_CONTEXT()->Global();
|
||||
SWIG_V8_GetModule(v8::Local<v8::Context> context) {
|
||||
v8::Local<v8::Object> global_obj = context->Global();
|
||||
#if (V8_MAJOR_VERSION-0) < 5
|
||||
v8::Local<v8::Value> moduleinfo = global_obj->GetHiddenValue(SWIGV8_STRING_NEW("swig_module_info_data"));
|
||||
#else
|
||||
v8::Local<v8::Private> privateKey = v8::Private::ForApi(v8::Isolate::GetCurrent(), SWIGV8_STRING_NEW("swig_module_info_data"));
|
||||
v8::Local<v8::Value> moduleinfo;
|
||||
if (!global_obj->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&moduleinfo))
|
||||
if (!global_obj->GetPrivate(context, privateKey).ToLocal(&moduleinfo))
|
||||
return 0;
|
||||
#endif
|
||||
|
||||
|
|
@ -52,6 +52,7 @@ SWIG_V8_GetModule(void *) {
|
|||
|
||||
#define SWIG_GetModule(clientdata) SWIG_V8_GetModule(clientdata)
|
||||
#define SWIG_SetModule(clientdata, pointer) SWIG_V8_SetModule(clientdata, pointer)
|
||||
#define SWIG_INIT_CLIENT_DATA_TYPE v8::Local<v8::Context>
|
||||
|
||||
%}
|
||||
|
||||
|
|
@ -64,20 +65,20 @@ SWIG_V8_GetModule(void *) {
|
|||
%}
|
||||
|
||||
%insert(init) %{
|
||||
#if !defined(NODE_MODULE_VERSION) || (NODE_MODULE_VERSION < 12)
|
||||
// Note: 'extern "C"'' disables name mangling which makes it easier to load the symbol manually
|
||||
// TODO: is it ok to do that?
|
||||
extern "C"
|
||||
#if (NODE_MODULE_VERSION < 0x000C)
|
||||
void SWIGV8_INIT (SWIGV8_OBJECT exports)
|
||||
extern "C" void SWIGV8_INIT (SWIGV8_OBJECT exports_obj)
|
||||
#elif (NODE_MODULE_VERSION < 64)
|
||||
void SWIGV8_INIT (SWIGV8_OBJECT exports_obj, SWIGV8_VALUE /*module*/, void*)
|
||||
#else
|
||||
void SWIGV8_INIT (SWIGV8_OBJECT exports, SWIGV8_OBJECT /*module*/)
|
||||
void SWIGV8_INIT (SWIGV8_OBJECT exports_obj, SWIGV8_VALUE /*module*/, v8::Local<v8::Context> context, void*)
|
||||
#endif
|
||||
{
|
||||
SWIG_InitializeModule(static_cast<void *>(&exports));
|
||||
#if !defined(NODE_MODULE_VERSION) || NODE_MODULE_VERSION < 64
|
||||
v8::Local<v8::Context> context = SWIGV8_CURRENT_CONTEXT();
|
||||
#endif
|
||||
|
||||
SWIGV8_HANDLESCOPE();
|
||||
|
||||
SWIGV8_OBJECT exports_obj = exports;
|
||||
SWIG_InitializeModule(context);
|
||||
%}
|
||||
|
||||
|
||||
|
|
@ -124,6 +125,10 @@ void SWIGV8_INIT (SWIGV8_OBJECT exports, SWIGV8_OBJECT /*module*/)
|
|||
}
|
||||
|
||||
#if defined(BUILDING_NODE_EXTENSION)
|
||||
#if (NODE_MODULE_VERSION < 64)
|
||||
NODE_MODULE($jsname, $jsname_initialize)
|
||||
#else
|
||||
NODE_MODULE_CONTEXT_AWARE($jsname, $jsname_initialize)
|
||||
#endif
|
||||
#endif
|
||||
%}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue