Skip to content

Commit

Permalink
Merge pull request #2073 from lissyx/nodejs-v12
Browse files Browse the repository at this point in the history
Add NodeJS v12 support
  • Loading branch information
lissyx committed Apr 25, 2019
2 parents 656ab57 + 348dd0e commit 34866df
Show file tree
Hide file tree
Showing 20 changed files with 1,021 additions and 15 deletions.
3 changes: 2 additions & 1 deletion native_client/javascript/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,9 @@ node-wrapper: copy-deps build
$(NODE_BUILD_TOOL) $(NODE_PLATFORM_TARGET) $(NODE_RUNTIME) $(NODE_ABI_TARGET) $(NODE_DIST_URL) package $(NODE_BUILD_VERBOSE)

npm-pack: clean package.json README.md index.js
npm install node-pre-gyp@0.12.x
npm install node-pre-gyp@0.13.x
npm pack $(NODE_BUILD_VERBOSE)

deepspeech_wrap.cxx: deepspeech.i
swig -version
swig -c++ -javascript -node deepspeech.i
12 changes: 6 additions & 6 deletions native_client/javascript/deepspeech.i
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,7 @@ using namespace node;
// convert Node Buffer into a C ptr + length
%typemap(in) (short* IN_ARRAY1, int DIM1)
{
Local<Object> bufferObj = $input->ToObject();
Local<Object> bufferObj = SWIGV8_TO_OBJECT($input);
char* bufferData = Buffer::Data(bufferObj);
size_t bufferLength = Buffer::Length(bufferObj);

Expand Down Expand Up @@ -68,18 +68,18 @@ using namespace node;
%nodefaultdtor MetadataItem;

%extend Metadata {
v8::Handle<v8::Value> items;
v8::Handle<v8::Value> items_get() {
v8::Handle<v8::Value> jsresult = SWIGV8_ARRAY_NEW();
v8::Local<v8::Value> items;
v8::Local<v8::Value> items_get() {
v8::Local<v8::Value> jsresult = SWIGV8_ARRAY_NEW();
for (int i = 0; i < self->num_items; ++i) {
jsresult = SWIGV8_AppendOutput(jsresult, SWIG_NewPointerObj(SWIG_as_voidptr(&self->items[i]), SWIGTYPE_p_MetadataItem, SWIG_POINTER_OWN));
}
fail:
return jsresult;
}
v8::Handle<v8::Value> items_set(const v8::Handle<v8::Value> arg) {
v8::Local<v8::Value> items_set(const v8::Local<v8::Value> arg) {
fail:
v8::Handle<v8::Value> result = SWIGV8_ARRAY_NEW();
v8::Local<v8::Value> result = SWIGV8_ARRAY_NEW();
return result;
}
}
Expand Down
2 changes: 1 addition & 1 deletion native_client/javascript/package.json.in
Original file line number Diff line number Diff line change
Expand Up @@ -30,7 +30,7 @@
"host" : "https://index.taskcluster.net/v1/task/project.deepspeech.tensorflow.pip.v1.0.0-warpctc.arm/artifacts/public/"
},
"dependencies" : {
"node-pre-gyp": "0.12.x",
"node-pre-gyp": "0.13.x",
"argparse": "1.0.x",
"sox-stream": "2.0.x",
"memory-stream": "0.0.3",
Expand Down
203 changes: 203 additions & 0 deletions native_client/swig_node_v10.12.patch
Original file line number Diff line number Diff line change
@@ -0,0 +1,203 @@
diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
index 7b8a5ec237..80fbd7aa1a 100644
--- a/Lib/javascript/v8/javascripthelpers.swg
+++ b/Lib/javascript/v8/javascripthelpers.swg
@@ -93,7 +93,7 @@ SWIGRUNTIME void JS_veto_set_variable(v8::Local<v8::Name> property, v8::Local<v8
#else
v8::Local<v8::String> sproperty;
if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) {
- sproperty->WriteUtf8(buffer, 256);
+ SWIGV8_WRITE_UTF8(sproperty, buffer, 256);
res = sprintf(msg, "Tried to write read-only variable: %s.", buffer);
}
else {
diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
index c0055c48ee..f76be983b1 100644
--- a/Lib/javascript/v8/javascriptprimtypes.swg
+++ b/Lib/javascript/v8/javascriptprimtypes.swg
@@ -22,7 +22,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
return SWIG_ERROR;
}

- if (val) *val = obj->BooleanValue();
+ if (val) *val = SWIGV8_BOOLEAN_VALUE(obj);
return SWIG_OK;
}
}
@@ -44,7 +44,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
if (!valRef->IsNumber()) {
return SWIG_TypeError;
}
- if(val) *val = valRef->IntegerValue();
+ if(val) *val = SWIGV8_INTEGER_VALUE(valRef);

return SWIG_OK;
}
@@ -68,7 +68,7 @@ int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
if (!obj->IsNumber()) {
return SWIG_TypeError;
}
- if(val) *val = (long) obj->IntegerValue();
+ if(val) *val = (long) SWIGV8_INTEGER_VALUE(obj);

return SWIG_OK;
}
@@ -95,7 +95,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
return SWIG_TypeError;
}

- long longVal = (long) obj->NumberValue();
+ long longVal = (long) SWIGV8_NUMBER_VALUE(obj);

if(longVal < 0) {
return SWIG_OverflowError;
@@ -133,7 +133,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle<v8::Value> obj, long long* val)
if (!obj->IsNumber()) {
return SWIG_TypeError;
}
- if(val) *val = (long long) obj->IntegerValue();
+ if(val) *val = (long long) SWIGV8_INTEGER_VALUE(obj);

return SWIG_OK;
}
@@ -168,7 +168,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle<v8::Value> obj, unsigned long
return SWIG_TypeError;
}

- long long longVal = (long long) obj->NumberValue();
+ long long longVal = (long long) SWIGV8_NUMBER_VALUE(obj);

if(longVal < 0) {
return SWIG_OverflowError;
@@ -198,7 +198,7 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
if(!obj->IsNumber()) {
return SWIG_TypeError;
}
- if(val) *val = obj->NumberValue();
+ if(val) *val = SWIGV8_NUMBER_VALUE(obj);

return SWIG_OK;
}
diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
index 84bd4cc67e..2452f4040d 100644
--- a/Lib/javascript/v8/javascriptrun.swg
+++ b/Lib/javascript/v8/javascriptrun.swg
@@ -91,6 +91,32 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
#define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class);
#endif

+#ifdef NODE_VERSION
+#if NODE_VERSION_AT_LEAST(10, 12, 0)
+#define SWIG_NODE_AT_LEAST_1012
+#endif
+#endif
+
+//Necessary to check Node.js version because V8 API changes are backported in Node.js
+#if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \
+ (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7)
+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject()
+#define SWIGV8_TO_STRING(handle) (handle)->ToString()
+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue()
+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue()
+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue()
+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len)
+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length()
+#else
+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
+#define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
+#endif
+
/* ---------------------------------------------------------------------------
* Error handling
*
@@ -258,7 +284,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr)
if(!valRef->IsObject()) {
return SWIG_TypeError;
}
- v8::Handle<v8::Object> objRef = valRef->ToObject();
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);

if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;

@@ -352,7 +378,7 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swi
if(!valRef->IsObject()) {
return SWIG_TypeError;
}
- v8::Handle<v8::Object> objRef = valRef->ToObject();
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
}

@@ -479,7 +505,7 @@ SWIGRUNTIMEINLINE
int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
SWIGV8_HANDLESCOPE();

- v8::Handle<v8::Object> objRef = valRef->ToObject();
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
if(objRef->InternalFieldCount() < 1) return false;
#if (V8_MAJOR_VERSION-0) < 5
v8::Handle<v8::Value> flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
@@ -489,7 +515,7 @@ int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
if (!objRef->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&flag))
return false;
#endif
- return (flag->IsBoolean() && flag->BooleanValue());
+ return (flag->IsBoolean() && SWIGV8_BOOLEAN_VALUE(flag));
}

SWIGRUNTIME
@@ -499,7 +525,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr,

SwigV8PackedData *sobj;

- v8::Handle<v8::Object> objRef = valRef->ToObject();
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);

#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
v8::Handle<v8::Value> cdataRef = objRef->GetInternalField(0);
diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg
index 0e40593263..c78e04efbb 100644
--- a/Lib/javascript/v8/javascriptruntime.swg
+++ b/Lib/javascript/v8/javascriptruntime.swg
@@ -44,6 +44,8 @@
#ifdef BUILDING_NODE_EXTENSION
%insert("runtime") %{
#include <node.h>
+//Older version of node.h does not include this
+#include <node_version.h>
%}
#endif

diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
index 65ba20e5a9..e767a6d662 100644
--- a/Lib/javascript/v8/javascriptstrings.swg
+++ b/Lib/javascript/v8/javascriptstrings.swg
@@ -7,11 +7,11 @@ SWIGINTERN int
SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize, int *alloc)
{
if(valRef->IsString()) {
- v8::Handle<v8::String> js_str = valRef->ToString();
+ v8::Handle<v8::String> js_str = SWIGV8_TO_STRING(valRef);

- size_t len = js_str->Utf8Length() + 1;
+ size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
char* cstr = new char[len];
- js_str->WriteUtf8(cstr, len);
+ SWIGV8_WRITE_UTF8(js_str, cstr, len);

if(alloc) *alloc = SWIG_NEWOBJ;
if(psize) *psize = len;
@@ -20,7 +20,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
return SWIG_OK;
} else {
if(valRef->IsObject()) {
- v8::Handle<v8::Object> obj = valRef->ToObject();
+ v8::Handle<v8::Object> obj = SWIGV8_TO_OBJECT(valRef);
// try if the object is a wrapped char[]
swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
if (pchar_descriptor) {
Loading

0 comments on commit 34866df

Please sign in to comment.