Skip to content

Commit f7f6a14

Browse files
author
Alexandre Lissy
committed
Add NodeJS v12 support
Fixes mozilla#2070
1 parent 656ab57 commit f7f6a14

17 files changed

+980
-14
lines changed

native_client/javascript/Makefile

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,8 +45,9 @@ node-wrapper: copy-deps build
4545
$(NODE_BUILD_TOOL) $(NODE_PLATFORM_TARGET) $(NODE_RUNTIME) $(NODE_ABI_TARGET) $(NODE_DIST_URL) package $(NODE_BUILD_VERBOSE)
4646

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

5151
deepspeech_wrap.cxx: deepspeech.i
52+
swig -version
5253
swig -c++ -javascript -node deepspeech.i

native_client/javascript/deepspeech.i

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ using namespace node;
1414
// convert Node Buffer into a C ptr + length
1515
%typemap(in) (short* IN_ARRAY1, int DIM1)
1616
{
17-
Local<Object> bufferObj = $input->ToObject();
17+
Local<Object> bufferObj = SWIGV8_TO_OBJECT($input);
1818
char* bufferData = Buffer::Data(bufferObj);
1919
size_t bufferLength = Buffer::Length(bufferObj);
2020

@@ -68,18 +68,18 @@ using namespace node;
6868
%nodefaultdtor MetadataItem;
6969

7070
%extend Metadata {
71-
v8::Handle<v8::Value> items;
72-
v8::Handle<v8::Value> items_get() {
73-
v8::Handle<v8::Value> jsresult = SWIGV8_ARRAY_NEW();
71+
v8::Local<v8::Value> items;
72+
v8::Local<v8::Value> items_get() {
73+
v8::Local<v8::Value> jsresult = SWIGV8_ARRAY_NEW();
7474
for (int i = 0; i < self->num_items; ++i) {
7575
jsresult = SWIGV8_AppendOutput(jsresult, SWIG_NewPointerObj(SWIG_as_voidptr(&self->items[i]), SWIGTYPE_p_MetadataItem, SWIG_POINTER_OWN));
7676
}
7777
fail:
7878
return jsresult;
7979
}
80-
v8::Handle<v8::Value> items_set(const v8::Handle<v8::Value> arg) {
80+
v8::Local<v8::Value> items_set(const v8::Local<v8::Value> arg) {
8181
fail:
82-
v8::Handle<v8::Value> result = SWIGV8_ARRAY_NEW();
82+
v8::Local<v8::Value> result = SWIGV8_ARRAY_NEW();
8383
return result;
8484
}
8585
}

native_client/javascript/package.json.in

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"host" : "https://index.taskcluster.net/v1/task/project.deepspeech.tensorflow.pip.v1.0.0-warpctc.arm/artifacts/public/"
3131
},
3232
"dependencies" : {
33-
"node-pre-gyp": "0.12.x",
33+
"node-pre-gyp": "0.13.x",
3434
"argparse": "1.0.x",
3535
"sox-stream": "2.0.x",
3636
"memory-stream": "0.0.3",
Lines changed: 203 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,203 @@
1+
diff --git a/Lib/javascript/v8/javascripthelpers.swg b/Lib/javascript/v8/javascripthelpers.swg
2+
index 7b8a5ec237..80fbd7aa1a 100644
3+
--- a/Lib/javascript/v8/javascripthelpers.swg
4+
+++ b/Lib/javascript/v8/javascripthelpers.swg
5+
@@ -93,7 +93,7 @@ SWIGRUNTIME void JS_veto_set_variable(v8::Local<v8::Name> property, v8::Local<v8
6+
#else
7+
v8::Local<v8::String> sproperty;
8+
if (property->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocal(&sproperty)) {
9+
- sproperty->WriteUtf8(buffer, 256);
10+
+ SWIGV8_WRITE_UTF8(sproperty, buffer, 256);
11+
res = sprintf(msg, "Tried to write read-only variable: %s.", buffer);
12+
}
13+
else {
14+
diff --git a/Lib/javascript/v8/javascriptprimtypes.swg b/Lib/javascript/v8/javascriptprimtypes.swg
15+
index c0055c48ee..f76be983b1 100644
16+
--- a/Lib/javascript/v8/javascriptprimtypes.swg
17+
+++ b/Lib/javascript/v8/javascriptprimtypes.swg
18+
@@ -22,7 +22,7 @@ int SWIG_AsVal_dec(bool)(v8::Handle<v8::Value> obj, bool *val)
19+
return SWIG_ERROR;
20+
}
21+
22+
- if (val) *val = obj->BooleanValue();
23+
+ if (val) *val = SWIGV8_BOOLEAN_VALUE(obj);
24+
return SWIG_OK;
25+
}
26+
}
27+
@@ -44,7 +44,7 @@ int SWIG_AsVal_dec(int)(v8::Handle<v8::Value> valRef, int* val)
28+
if (!valRef->IsNumber()) {
29+
return SWIG_TypeError;
30+
}
31+
- if(val) *val = valRef->IntegerValue();
32+
+ if(val) *val = SWIGV8_INTEGER_VALUE(valRef);
33+
34+
return SWIG_OK;
35+
}
36+
@@ -68,7 +68,7 @@ int SWIG_AsVal_dec(long)(v8::Handle<v8::Value> obj, long* val)
37+
if (!obj->IsNumber()) {
38+
return SWIG_TypeError;
39+
}
40+
- if(val) *val = (long) obj->IntegerValue();
41+
+ if(val) *val = (long) SWIGV8_INTEGER_VALUE(obj);
42+
43+
return SWIG_OK;
44+
}
45+
@@ -95,7 +95,7 @@ int SWIG_AsVal_dec(unsigned long)(v8::Handle<v8::Value> obj, unsigned long *val)
46+
return SWIG_TypeError;
47+
}
48+
49+
- long longVal = (long) obj->NumberValue();
50+
+ long longVal = (long) SWIGV8_NUMBER_VALUE(obj);
51+
52+
if(longVal < 0) {
53+
return SWIG_OverflowError;
54+
@@ -133,7 +133,7 @@ int SWIG_AsVal_dec(long long)(v8::Handle<v8::Value> obj, long long* val)
55+
if (!obj->IsNumber()) {
56+
return SWIG_TypeError;
57+
}
58+
- if(val) *val = (long long) obj->IntegerValue();
59+
+ if(val) *val = (long long) SWIGV8_INTEGER_VALUE(obj);
60+
61+
return SWIG_OK;
62+
}
63+
@@ -168,7 +168,7 @@ int SWIG_AsVal_dec(unsigned long long)(v8::Handle<v8::Value> obj, unsigned long
64+
return SWIG_TypeError;
65+
}
66+
67+
- long long longVal = (long long) obj->NumberValue();
68+
+ long long longVal = (long long) SWIGV8_NUMBER_VALUE(obj);
69+
70+
if(longVal < 0) {
71+
return SWIG_OverflowError;
72+
@@ -198,7 +198,7 @@ int SWIG_AsVal_dec(double)(v8::Handle<v8::Value> obj, double *val)
73+
if(!obj->IsNumber()) {
74+
return SWIG_TypeError;
75+
}
76+
- if(val) *val = obj->NumberValue();
77+
+ if(val) *val = SWIGV8_NUMBER_VALUE(obj);
78+
79+
return SWIG_OK;
80+
}
81+
diff --git a/Lib/javascript/v8/javascriptrun.swg b/Lib/javascript/v8/javascriptrun.swg
82+
index 84bd4cc67e..2452f4040d 100644
83+
--- a/Lib/javascript/v8/javascriptrun.swg
84+
+++ b/Lib/javascript/v8/javascriptrun.swg
85+
@@ -91,6 +91,32 @@ typedef v8::PropertyCallbackInfo<v8::Value> SwigV8PropertyCallbackInfo;
86+
#define SWIGV8_SET_CLASS_TEMPL(class_templ, class) class_templ.Reset(v8::Isolate::GetCurrent(), class);
87+
#endif
88+
89+
+#ifdef NODE_VERSION
90+
+#if NODE_VERSION_AT_LEAST(10, 12, 0)
91+
+#define SWIG_NODE_AT_LEAST_1012
92+
+#endif
93+
+#endif
94+
+
95+
+//Necessary to check Node.js version because V8 API changes are backported in Node.js
96+
+#if (defined(NODE_VERSION) && !defined(SWIG_NODE_AT_LEAST_1012)) || \
97+
+ (!defined(NODE_VERSION) && (V8_MAJOR_VERSION-0) < 7)
98+
+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject()
99+
+#define SWIGV8_TO_STRING(handle) (handle)->ToString()
100+
+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue()
101+
+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue()
102+
+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue()
103+
+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(buffer, len)
104+
+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length()
105+
+#else
106+
+#define SWIGV8_TO_OBJECT(handle) (handle)->ToObject(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
107+
+#define SWIGV8_TO_STRING(handle) (handle)->ToString(SWIGV8_CURRENT_CONTEXT()).ToLocalChecked()
108+
+#define SWIGV8_NUMBER_VALUE(handle) (handle)->NumberValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
109+
+#define SWIGV8_INTEGER_VALUE(handle) (handle)->IntegerValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
110+
+#define SWIGV8_BOOLEAN_VALUE(handle) (handle)->BooleanValue(SWIGV8_CURRENT_CONTEXT()).ToChecked()
111+
+#define SWIGV8_WRITE_UTF8(handle, buffer, len) (handle)->WriteUtf8(v8::Isolate::GetCurrent(), buffer, len)
112+
+#define SWIGV8_UTF8_LENGTH(handle) (handle)->Utf8Length(v8::Isolate::GetCurrent())
113+
+#endif
114+
+
115+
/* ---------------------------------------------------------------------------
116+
* Error handling
117+
*
118+
@@ -258,7 +284,7 @@ SWIGRUNTIME int SWIG_V8_GetInstancePtr(v8::Handle<v8::Value> valRef, void **ptr)
119+
if(!valRef->IsObject()) {
120+
return SWIG_TypeError;
121+
}
122+
- v8::Handle<v8::Object> objRef = valRef->ToObject();
123+
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
124+
125+
if(objRef->InternalFieldCount() < 1) return SWIG_ERROR;
126+
127+
@@ -352,7 +378,7 @@ SWIGRUNTIME int SWIG_V8_ConvertPtr(v8::Handle<v8::Value> valRef, void **ptr, swi
128+
if(!valRef->IsObject()) {
129+
return SWIG_TypeError;
130+
}
131+
- v8::Handle<v8::Object> objRef = valRef->ToObject();
132+
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
133+
return SWIG_V8_ConvertInstancePtr(objRef, ptr, info, flags);
134+
}
135+
136+
@@ -479,7 +505,7 @@ SWIGRUNTIMEINLINE
137+
int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
138+
SWIGV8_HANDLESCOPE();
139+
140+
- v8::Handle<v8::Object> objRef = valRef->ToObject();
141+
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
142+
if(objRef->InternalFieldCount() < 1) return false;
143+
#if (V8_MAJOR_VERSION-0) < 5
144+
v8::Handle<v8::Value> flag = objRef->GetHiddenValue(SWIGV8_STRING_NEW("__swig__packed_data__"));
145+
@@ -489,7 +515,7 @@ int SwigV8Packed_Check(v8::Handle<v8::Value> valRef) {
146+
if (!objRef->GetPrivate(SWIGV8_CURRENT_CONTEXT(), privateKey).ToLocal(&flag))
147+
return false;
148+
#endif
149+
- return (flag->IsBoolean() && flag->BooleanValue());
150+
+ return (flag->IsBoolean() && SWIGV8_BOOLEAN_VALUE(flag));
151+
}
152+
153+
SWIGRUNTIME
154+
@@ -499,7 +525,7 @@ swig_type_info *SwigV8Packed_UnpackData(v8::Handle<v8::Value> valRef, void *ptr,
155+
156+
SwigV8PackedData *sobj;
157+
158+
- v8::Handle<v8::Object> objRef = valRef->ToObject();
159+
+ v8::Handle<v8::Object> objRef = SWIGV8_TO_OBJECT(valRef);
160+
161+
#if (V8_MAJOR_VERSION-0) < 4 && (SWIG_V8_VERSION < 0x031511)
162+
v8::Handle<v8::Value> cdataRef = objRef->GetInternalField(0);
163+
diff --git a/Lib/javascript/v8/javascriptruntime.swg b/Lib/javascript/v8/javascriptruntime.swg
164+
index 0e40593263..c78e04efbb 100644
165+
--- a/Lib/javascript/v8/javascriptruntime.swg
166+
+++ b/Lib/javascript/v8/javascriptruntime.swg
167+
@@ -44,6 +44,8 @@
168+
#ifdef BUILDING_NODE_EXTENSION
169+
%insert("runtime") %{
170+
#include <node.h>
171+
+//Older version of node.h does not include this
172+
+#include <node_version.h>
173+
%}
174+
#endif
175+
176+
diff --git a/Lib/javascript/v8/javascriptstrings.swg b/Lib/javascript/v8/javascriptstrings.swg
177+
index 65ba20e5a9..e767a6d662 100644
178+
--- a/Lib/javascript/v8/javascriptstrings.swg
179+
+++ b/Lib/javascript/v8/javascriptstrings.swg
180+
@@ -7,11 +7,11 @@ SWIGINTERN int
181+
SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize, int *alloc)
182+
{
183+
if(valRef->IsString()) {
184+
- v8::Handle<v8::String> js_str = valRef->ToString();
185+
+ v8::Handle<v8::String> js_str = SWIGV8_TO_STRING(valRef);
186+
187+
- size_t len = js_str->Utf8Length() + 1;
188+
+ size_t len = SWIGV8_UTF8_LENGTH(js_str) + 1;
189+
char* cstr = new char[len];
190+
- js_str->WriteUtf8(cstr, len);
191+
+ SWIGV8_WRITE_UTF8(js_str, cstr, len);
192+
193+
if(alloc) *alloc = SWIG_NEWOBJ;
194+
if(psize) *psize = len;
195+
@@ -20,7 +20,7 @@ SWIG_AsCharPtrAndSize(v8::Handle<v8::Value> valRef, char** cptr, size_t* psize,
196+
return SWIG_OK;
197+
} else {
198+
if(valRef->IsObject()) {
199+
- v8::Handle<v8::Object> obj = valRef->ToObject();
200+
+ v8::Handle<v8::Object> obj = SWIGV8_TO_OBJECT(valRef);
201+
// try if the object is a wrapped char[]
202+
swig_type_info* pchar_descriptor = SWIG_pchar_descriptor();
203+
if (pchar_descriptor) {

0 commit comments

Comments
 (0)