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.
117 lines
4.5 KiB
Text
117 lines
4.5 KiB
Text
%insert(runtime) %{
|
|
|
|
// Note: since 3.19 there are new CallBack types, since 03.21.9 the old ones have been removed
|
|
#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
|
|
typedef v8::InvocationCallback SwigV8FunctionCallback;
|
|
typedef v8::AccessorGetter SwigV8AccessorGetterCallback;
|
|
typedef v8::AccessorSetter SwigV8AccessorSetterCallback;
|
|
typedef v8::AccessorInfo SwigV8PropertyCallbackInfoVoid;
|
|
#elif (V8_MAJOR_VERSION-0) < 5
|
|
typedef v8::FunctionCallback SwigV8FunctionCallback;
|
|
typedef v8::AccessorGetterCallback SwigV8AccessorGetterCallback;
|
|
typedef v8::AccessorSetterCallback SwigV8AccessorSetterCallback;
|
|
typedef v8::PropertyCallbackInfo<void> SwigV8PropertyCallbackInfoVoid;
|
|
#else
|
|
typedef v8::FunctionCallback SwigV8FunctionCallback;
|
|
typedef v8::AccessorNameGetterCallback SwigV8AccessorGetterCallback;
|
|
typedef v8::AccessorNameSetterCallback SwigV8AccessorSetterCallback;
|
|
typedef v8::PropertyCallbackInfo<void> SwigV8PropertyCallbackInfoVoid;
|
|
#endif
|
|
|
|
/**
|
|
* Creates a class template for a class with specified initialization function.
|
|
*/
|
|
SWIGRUNTIME SWIGV8_FUNCTION_TEMPLATE SWIGV8_CreateClassTemplate(const char* symbol) {
|
|
SWIGV8_HANDLESCOPE_ESC();
|
|
|
|
v8::Local<v8::FunctionTemplate> class_templ = SWIGV8_FUNCTEMPLATE_NEW_VOID();
|
|
class_templ->SetClassName(SWIGV8_SYMBOL_NEW(symbol));
|
|
|
|
SWIGV8_OBJECT_TEMPLATE inst_templ = class_templ->InstanceTemplate();
|
|
inst_templ->SetInternalFieldCount(1);
|
|
|
|
SWIGV8_OBJECT_TEMPLATE equals_templ = class_templ->PrototypeTemplate();
|
|
equals_templ->Set(SWIGV8_SYMBOL_NEW("equals"), SWIGV8_FUNCTEMPLATE_NEW(_SWIGV8_wrap_equals));
|
|
|
|
SWIGV8_OBJECT_TEMPLATE cptr_templ = class_templ->PrototypeTemplate();
|
|
cptr_templ->Set(SWIGV8_SYMBOL_NEW("getCPtr"), SWIGV8_FUNCTEMPLATE_NEW(_wrap_getCPtr));
|
|
|
|
SWIGV8_ESCAPE(class_templ);
|
|
}
|
|
|
|
/**
|
|
* Registers a class method with given name for a given class template.
|
|
*/
|
|
SWIGRUNTIME void SWIGV8_AddMemberFunction(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
|
|
SwigV8FunctionCallback _func) {
|
|
SWIGV8_OBJECT_TEMPLATE proto_templ = class_templ->PrototypeTemplate();
|
|
proto_templ->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func));
|
|
}
|
|
|
|
/**
|
|
* Registers a class property with given name for a given class template.
|
|
*/
|
|
SWIGRUNTIME void SWIGV8_AddMemberVariable(SWIGV8_FUNCTION_TEMPLATE class_templ, const char* symbol,
|
|
SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter) {
|
|
SWIGV8_OBJECT_TEMPLATE proto_templ = class_templ->InstanceTemplate();
|
|
proto_templ->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
|
|
}
|
|
|
|
/**
|
|
* Registers a class method with given name for a given object.
|
|
*/
|
|
SWIGRUNTIME void SWIGV8_AddStaticFunction(SWIGV8_OBJECT obj, const char* symbol,
|
|
const SwigV8FunctionCallback& _func, v8::Local<v8::Context> context) {
|
|
#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031903)
|
|
obj->Set(SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction());
|
|
#else
|
|
SWIGV8_MAYBE_CHECK(obj->Set(context, SWIGV8_SYMBOL_NEW(symbol), SWIGV8_FUNCTEMPLATE_NEW(_func)->GetFunction(context).ToLocalChecked()));
|
|
#endif
|
|
}
|
|
|
|
/**
|
|
* Registers a class method with given name for a given object.
|
|
*/
|
|
SWIGRUNTIME void SWIGV8_AddStaticVariable(SWIGV8_OBJECT obj, const char* symbol,
|
|
SwigV8AccessorGetterCallback getter, SwigV8AccessorSetterCallback setter,
|
|
v8::Local<v8::Context> context) {
|
|
#if (V8_MAJOR_VERSION-0) < 5
|
|
obj->SetAccessor(SWIGV8_SYMBOL_NEW(symbol), getter, setter);
|
|
#else
|
|
SWIGV8_MAYBE_CHECK(obj->SetAccessor(context, SWIGV8_SYMBOL_NEW(symbol), getter, setter));
|
|
#endif
|
|
}
|
|
|
|
#if (V8_MAJOR_VERSION-0) < 5
|
|
SWIGRUNTIME void JS_veto_set_variable(v8::Local<v8::String> property, v8::Local<v8::Value> value, const SwigV8PropertyCallbackInfoVoid& info)
|
|
#else
|
|
SWIGRUNTIME void JS_veto_set_variable(v8::Local<v8::Name> property, v8::Local<v8::Value> value, const SwigV8PropertyCallbackInfoVoid& info)
|
|
#endif
|
|
{
|
|
char buffer[256];
|
|
char msg[512];
|
|
int res;
|
|
|
|
#if (V8_MAJOR_VERSION-0) < 5
|
|
property->WriteUtf8(buffer, 256);
|
|
res = sprintf(msg, "Tried to write read-only variable: %s.", buffer);
|
|
#else
|
|
v8::Local<v8::String> sproperty;
|
|
if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) {
|
|
SWIGV8_WRITE_UTF8(sproperty, buffer, 256);
|
|
res = sprintf(msg, "Tried to write read-only variable: %s.", buffer);
|
|
}
|
|
else {
|
|
res = -1;
|
|
}
|
|
#endif
|
|
|
|
if(res<0) {
|
|
SWIG_exception(SWIG_ERROR, "Tried to write read-only variable.");
|
|
} else {
|
|
SWIG_exception(SWIG_ERROR, msg);
|
|
}
|
|
fail: ;
|
|
}
|
|
|
|
%} // v8_helper_functions
|