Skip to content

Commit d07702b

Browse files
committed
Merge pull request #254 from joeferner/upgrade-nan
upgrade nan to 2.0.9
2 parents 05af197 + 298aae9 commit d07702b

File tree

11 files changed

+484
-436
lines changed

11 files changed

+484
-436
lines changed

.travis.yml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
language: java
2+
sudo: false
23
jdk:
34
- oraclejdk8
45
- oraclejdk7

lib/nodeJavaBridge.js

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -190,6 +190,8 @@ function isWritable(prop) {
190190
// (e.g. for either .caller or .arguments).
191191
// It may be that checking desc.configurable is sufficient, but the specification doesn't make this definitive,
192192
// and there is no harm in checking both.
193+
if (prop === 'caller' || prop === 'arguments') { return false; }
194+
193195
var desc = Object.getOwnPropertyDescriptor(function() {}, prop) || {};
194196
return desc.writable !== false && desc.configurable !== false;
195197
}

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@
3030
"find-java-home": "0.1.2",
3131
"glob": "5.0.5",
3232
"lodash": "3.7.0",
33-
"nan": "1.7.0"
33+
"nan": "2.0.9"
3434
},
3535
"devDependencies": {
3636
"chalk": "1.0.0",

src/java.cpp

Lines changed: 299 additions & 264 deletions
Large diffs are not rendered by default.

src/java.h

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@
1414
#define JNI_BEST_VERSION JNI_VERSION_1_6
1515
#endif
1616

17-
class Java : public node::ObjectWrap {
17+
class Java : public Nan::ObjectWrap {
1818
public:
1919
static void Init(v8::Handle<v8::Object> target);
2020
JavaVM* getJvm() { return m_jvm; }
@@ -60,15 +60,15 @@ class Java : public node::ObjectWrap {
6060
static NAN_SETTER(AccessorProhibitsOverwritingSetter);
6161
v8::Local<v8::Value> ensureJvm();
6262

63-
static v8::Persistent<v8::FunctionTemplate> s_ct;
63+
static Nan::Persistent<v8::FunctionTemplate> s_ct;
6464
JavaVM* m_jvm;
6565
JNIEnv* m_env; // can only be used safely by the main thread as this is the thread it belongs to
6666
jobject m_classLoader;
6767
std::string m_classPath;
6868
static std::string s_nativeBindingLocation;
69-
v8::Persistent<v8::Array> m_classPathArray;
70-
v8::Persistent<v8::Array> m_optionsArray;
71-
v8::Persistent<v8::Object> m_asyncOptions;
69+
Nan::Persistent<v8::Array> m_classPathArray;
70+
Nan::Persistent<v8::Array> m_optionsArray;
71+
Nan::Persistent<v8::Object> m_asyncOptions;
7272

7373
std::string m_SyncSuffix;
7474
std::string m_AsyncSuffix;

src/javaObject.cpp

Lines changed: 78 additions & 72 deletions
Original file line numberDiff line numberDiff line change
@@ -5,13 +5,13 @@
55
#include <sstream>
66
#include <algorithm>
77

8-
/*static*/ std::map<std::string, v8::Persistent<v8::FunctionTemplate>*> JavaObject::sFunctionTemplates;
8+
/*static*/ std::map<std::string, Nan::Persistent<v8::FunctionTemplate>*> JavaObject::sFunctionTemplates;
99

1010
/*static*/ void JavaObject::Init(v8::Handle<v8::Object> target) {
1111
}
1212

1313
/*static*/ v8::Local<v8::Object> JavaObject::New(Java *java, jobject obj) {
14-
NanEscapableScope();
14+
Nan::EscapableHandleScope scope;
1515

1616
JNIEnv *env = java->getJavaEnv();
1717
JavaScope javaScope(env);
@@ -29,21 +29,21 @@
2929

3030
v8::Local<v8::Function> promisify;
3131
if(java->DoPromise()) {
32-
v8::Local<v8::Object> asyncOptions = NanObjectWrapHandle(java)->Get(NanNew<v8::String>("asyncOptions")).As<v8::Object>();
33-
v8::Local<v8::Value> promisifyValue = asyncOptions->Get(NanNew<v8::String>("promisify"));
32+
v8::Local<v8::Object> asyncOptions = java->handle()->Get(Nan::New<v8::String>("asyncOptions").ToLocalChecked()).As<v8::Object>();
33+
v8::Local<v8::Value> promisifyValue = asyncOptions->Get(Nan::New<v8::String>("promisify").ToLocalChecked());
3434
promisify = promisifyValue.As<v8::Function>();
3535
}
3636

3737
v8::Local<v8::FunctionTemplate> funcTemplate;
3838
if(sFunctionTemplates.find(className) != sFunctionTemplates.end()) {
3939
//printf("existing className: %s\n", className.c_str());
40-
funcTemplate = NanNew(*sFunctionTemplates[className]);
40+
funcTemplate = Nan::New(*sFunctionTemplates[className]);
4141
} else {
4242
//printf("create className: %s\n", className.c_str());
4343

44-
funcTemplate = NanNew<v8::FunctionTemplate>();
44+
funcTemplate = Nan::New<v8::FunctionTemplate>();
4545
funcTemplate->InstanceTemplate()->SetInternalFieldCount(1);
46-
funcTemplate->SetClassName(NanNew<v8::String>(className.c_str()));
46+
funcTemplate->SetClassName(Nan::New<v8::String>(className.c_str()).ToLocalChecked());
4747

4848
std::list<jobject> methods;
4949
javaReflectionGetMethods(env, objClazz, &methods, false);
@@ -54,26 +54,26 @@
5454
assert(!env->ExceptionCheck());
5555
std::string methodNameStr = javaToString(env, methodNameJava);
5656

57-
v8::Handle<v8::String> baseMethodName = NanNew<v8::String>(methodNameStr.c_str());
57+
v8::Local<v8::String> baseMethodName = Nan::New<v8::String>(methodNameStr.c_str()).ToLocalChecked();
5858

59-
v8::Handle<v8::String> methodNameAsync = NanNew<v8::String>((methodNameStr + java->AsyncSuffix()).c_str());
60-
v8::Local<v8::FunctionTemplate> methodCallTemplate = NanNew<v8::FunctionTemplate>(methodCall, baseMethodName);
59+
v8::Local<v8::String> methodNameAsync = Nan::New<v8::String>((methodNameStr + java->AsyncSuffix()).c_str()).ToLocalChecked();
60+
v8::Local<v8::FunctionTemplate> methodCallTemplate = Nan::New<v8::FunctionTemplate>(methodCall, baseMethodName);
6161
funcTemplate->PrototypeTemplate()->Set(methodNameAsync, methodCallTemplate->GetFunction());
6262

63-
v8::Handle<v8::String> methodNameSync = NanNew<v8::String>((methodNameStr + java->SyncSuffix()).c_str());
64-
v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = NanNew<v8::FunctionTemplate>(methodCallSync, baseMethodName);
63+
v8::Local<v8::String> methodNameSync = Nan::New<v8::String>((methodNameStr + java->SyncSuffix()).c_str()).ToLocalChecked();
64+
v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = Nan::New<v8::FunctionTemplate>(methodCallSync, baseMethodName);
6565
funcTemplate->PrototypeTemplate()->Set(methodNameSync, methodCallSyncTemplate->GetFunction());
6666

6767
if (java->DoPromise()) {
68-
v8::Local<v8::Object> recv = NanNew<v8::Object>();
68+
v8::Local<v8::Object> recv = Nan::New<v8::Object>();
6969
v8::Local<v8::Value> argv[] = { methodCallTemplate->GetFunction() };
7070
v8::Local<v8::Value> result = promisify->Call(recv, 1, argv);
7171
if (!result->IsFunction()) {
7272
fprintf(stderr, "Promisified result is not a function -- asyncOptions.promisify must return a function.\n");
7373
assert(result->IsFunction());
7474
}
7575
v8::Local<v8::Function> promFunction = result.As<v8::Function>();
76-
v8::Handle<v8::String> methodNamePromise = NanNew<v8::String>((methodNameStr + java->PromiseSuffix()).c_str());
76+
v8::Local<v8::String> methodNamePromise = Nan::New<v8::String>((methodNameStr + java->PromiseSuffix()).c_str()).ToLocalChecked();
7777
funcTemplate->PrototypeTemplate()->Set(methodNamePromise, promFunction);
7878
}
7979
}
@@ -87,22 +87,22 @@
8787
checkJavaException(env);
8888
std::string fieldNameStr = javaToString(env, fieldNameJava);
8989

90-
v8::Handle<v8::String> fieldName = NanNew<v8::String>(fieldNameStr.c_str());
91-
funcTemplate->InstanceTemplate()->SetAccessor(fieldName, fieldGetter, fieldSetter);
90+
v8::Local<v8::String> fieldName = Nan::New<v8::String>(fieldNameStr.c_str()).ToLocalChecked();
91+
Nan::SetAccessor(funcTemplate->InstanceTemplate(), fieldName, fieldGetter, fieldSetter);
9292
}
9393

94-
v8::Persistent<v8::FunctionTemplate>* persistentFuncTemplate = new v8::Persistent<v8::FunctionTemplate>();
95-
NanAssignPersistent(*persistentFuncTemplate, funcTemplate);
94+
Nan::Persistent<v8::FunctionTemplate>* persistentFuncTemplate = new Nan::Persistent<v8::FunctionTemplate>();
95+
persistentFuncTemplate->Reset(funcTemplate);
9696
sFunctionTemplates[className] = persistentFuncTemplate;
9797
}
9898

9999
v8::Local<v8::Function> ctor = funcTemplate->GetFunction();
100100
v8::Local<v8::Object> javaObjectObj = ctor->NewInstance();
101-
javaObjectObj->SetHiddenValue(NanNew<v8::String>(V8_HIDDEN_MARKER_JAVA_OBJECT), NanNew<v8::Boolean>(true));
101+
javaObjectObj->SetHiddenValue(Nan::New<v8::String>(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New<v8::Boolean>(true));
102102
JavaObject *self = new JavaObject(java, obj);
103103
self->Wrap(javaObjectObj);
104104

105-
return NanEscapeScope(javaObjectObj);
105+
return scope.Escape(javaObjectObj);
106106
}
107107

108108
JavaObject::JavaObject(Java *java, jobject obj) {
@@ -119,31 +119,32 @@ JavaObject::~JavaObject() {
119119
}
120120

121121
NAN_METHOD(JavaObject::methodCall) {
122-
NanScope();
123-
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
122+
Nan::HandleScope scope;
123+
JavaObject* self = Nan::ObjectWrap::Unwrap<JavaObject>(info.This());
124124
JNIEnv *env = self->m_java->getJavaEnv();
125125
JavaScope javaScope(env);
126126

127-
v8::String::Utf8Value methodName(args.Data());
127+
v8::String::Utf8Value methodName(info.Data());
128128
std::string methodNameStr = *methodName;
129129

130130
int argsStart = 0;
131-
int argsEnd = args.Length();
131+
int argsEnd = info.Length();
132132

133133
// arguments
134134
ARGS_BACK_CALLBACK();
135135

136136
if(!callbackProvided && methodNameStr == "toString") {
137-
return methodCallSync(args);
137+
return methodCallSync(info);
138138
}
139139

140-
jobjectArray methodArgs = v8ToJava(env, args, argsStart, argsEnd);
140+
jobjectArray methodArgs = v8ToJava(env, info, argsStart, argsEnd);
141141

142142
jobject method = javaFindMethod(env, self->m_class, methodNameStr, methodArgs);
143143
if(method == NULL) {
144-
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
144+
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, info, argsStart, argsEnd);
145145
EXCEPTION_CALL_CALLBACK(self->m_java, msg);
146-
NanReturnUndefined();
146+
info.GetReturnValue().SetUndefined();
147+
return;
147148
}
148149

149150
// run
@@ -154,42 +155,44 @@ NAN_METHOD(JavaObject::methodCall) {
154155
}
155156

156157
NAN_METHOD(JavaObject::methodCallSync) {
157-
NanScope();
158-
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
158+
Nan::HandleScope scope;
159+
JavaObject* self = Nan::ObjectWrap::Unwrap<JavaObject>(info.This());
159160
JNIEnv *env = self->m_java->getJavaEnv();
160161
JavaScope javaScope(env);
161162

162-
v8::String::Utf8Value methodName(args.Data());
163+
v8::String::Utf8Value methodName(info.Data());
163164
std::string methodNameStr = *methodName;
164165

165166
int argsStart = 0;
166-
int argsEnd = args.Length();
167+
int argsEnd = info.Length();
167168

168-
jobjectArray methodArgs = v8ToJava(env, args, argsStart, argsEnd);
169+
jobjectArray methodArgs = v8ToJava(env, info, argsStart, argsEnd);
169170

170171
jobject method = javaFindMethod(env, self->m_class, methodNameStr, methodArgs);
171172
if(method == NULL) {
172-
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
173-
v8::Handle<v8::Value> ex = javaExceptionToV8(self->m_java, env, msg);
174-
return NanThrowError(ex);
173+
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, info, argsStart, argsEnd);
174+
v8::Local<v8::Value> ex = javaExceptionToV8(self->m_java, env, msg);
175+
Nan::ThrowError(ex);
176+
return;
175177
}
176178

177179
// run
178-
v8::Handle<v8::Value> callback = NanUndefined();
180+
v8::Local<v8::Value> callback = Nan::Undefined();
179181
InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback);
180-
v8::Handle<v8::Value> result = baton->runSync();
182+
v8::Local<v8::Value> result = baton->runSync();
181183
delete baton;
182184

183185
if(result->IsNativeError()) {
184-
return NanThrowError(result);
186+
Nan::ThrowError(result);
187+
return;
185188
}
186189

187-
NanReturnValue(result);
190+
info.GetReturnValue().Set(result);
188191
}
189192

190193
NAN_GETTER(JavaObject::fieldGetter) {
191-
NanScope();
192-
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
194+
Nan::HandleScope scope;
195+
JavaObject* self = Nan::ObjectWrap::Unwrap<JavaObject>(info.This());
193196
JNIEnv *env = self->m_java->getJavaEnv();
194197
JavaScope javaScope(env);
195198

@@ -199,8 +202,9 @@ NAN_GETTER(JavaObject::fieldGetter) {
199202
if(field == NULL) {
200203
std::ostringstream errStr;
201204
errStr << "Could not find field " << propertyStr;
202-
v8::Handle<v8::Value> ex = javaExceptionToV8(self->m_java, env, errStr.str());
203-
return NanThrowError(ex);
205+
v8::Local<v8::Value> ex = javaExceptionToV8(self->m_java, env, errStr.str());
206+
Nan::ThrowError(ex);
207+
return;
204208
}
205209

206210
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
@@ -211,18 +215,19 @@ NAN_GETTER(JavaObject::fieldGetter) {
211215
if(env->ExceptionOccurred()) {
212216
std::ostringstream errStr;
213217
errStr << "Could not get field " << propertyStr;
214-
v8::Handle<v8::Value> ex = javaExceptionToV8(self->m_java, env, errStr.str());
215-
return NanThrowError(ex);
218+
v8::Local<v8::Value> ex = javaExceptionToV8(self->m_java, env, errStr.str());
219+
Nan::ThrowError(ex);
220+
return;
216221
}
217222

218-
v8::Handle<v8::Value> result = javaToV8(self->m_java, env, val);
223+
v8::Local<v8::Value> result = javaToV8(self->m_java, env, val);
219224

220-
NanReturnValue(result);
225+
info.GetReturnValue().Set(result);
221226
}
222227

223228
NAN_SETTER(JavaObject::fieldSetter) {
224-
NanScope();
225-
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
229+
Nan::HandleScope scope;
230+
JavaObject* self = Nan::ObjectWrap::Unwrap<JavaObject>(info.This());
226231
JNIEnv *env = self->m_java->getJavaEnv();
227232
JavaScope javaScope(env);
228233

@@ -234,8 +239,8 @@ NAN_SETTER(JavaObject::fieldSetter) {
234239
if(field == NULL) {
235240
std::ostringstream errStr;
236241
errStr << "Could not find field " << propertyStr;
237-
v8::Handle<v8::Value> error = javaExceptionToV8(self->m_java, env, errStr.str());
238-
NanThrowError(error);
242+
v8::Local<v8::Value> error = javaExceptionToV8(self->m_java, env, errStr.str());
243+
Nan::ThrowError(error);
239244
return;
240245
}
241246

@@ -249,38 +254,38 @@ NAN_SETTER(JavaObject::fieldSetter) {
249254
if(env->ExceptionOccurred()) {
250255
std::ostringstream errStr;
251256
errStr << "Could not set field " << propertyStr;
252-
v8::Handle<v8::Value> error = javaExceptionToV8(self->m_java, env, errStr.str());
253-
NanThrowError(error);
257+
v8::Local<v8::Value> error = javaExceptionToV8(self->m_java, env, errStr.str());
258+
Nan::ThrowError(error);
254259
return;
255260
}
256261
}
257262

258-
/*static*/ v8::Persistent<v8::FunctionTemplate> JavaProxyObject::s_proxyCt;
263+
/*static*/ Nan::Persistent<v8::FunctionTemplate> JavaProxyObject::s_proxyCt;
259264

260265
/*static*/ void JavaProxyObject::init() {
261-
v8::Local<v8::FunctionTemplate> t = NanNew<v8::FunctionTemplate>();
262-
NanAssignPersistent(s_proxyCt, t);
266+
v8::Local<v8::FunctionTemplate> t = Nan::New<v8::FunctionTemplate>();
267+
s_proxyCt.Reset(t);
263268
t->InstanceTemplate()->SetInternalFieldCount(1);
264-
t->SetClassName(NanNew<v8::String>("NodeDynamicProxy"));
269+
t->SetClassName(Nan::New<v8::String>("NodeDynamicProxy").ToLocalChecked());
265270

266-
v8::Handle<v8::String> methodName = NanNew<v8::String>("unref");
267-
v8::Local<v8::FunctionTemplate> methodCallTemplate = NanNew<v8::FunctionTemplate>(doUnref);
271+
v8::Local<v8::String> methodName = Nan::New<v8::String>("unref").ToLocalChecked();
272+
v8::Local<v8::FunctionTemplate> methodCallTemplate = Nan::New<v8::FunctionTemplate>(doUnref);
268273
t->PrototypeTemplate()->Set(methodName, methodCallTemplate->GetFunction());
269274

270-
v8::Handle<v8::String> fieldName = NanNew<v8::String>("invocationHandler");
271-
t->InstanceTemplate()->SetAccessor(fieldName, invocationHandlerGetter);
275+
v8::Local<v8::String> fieldName = Nan::New<v8::String>("invocationHandler").ToLocalChecked();
276+
Nan::SetAccessor(t->InstanceTemplate(), fieldName, invocationHandlerGetter);
272277
}
273278

274279
v8::Local<v8::Object> JavaProxyObject::New(Java *java, jobject obj, DynamicProxyData* dynamicProxyData) {
275-
NanEscapableScope();
280+
Nan::EscapableHandleScope scope;
276281

277-
v8::Local<v8::Function> ctor = NanNew(s_proxyCt)->GetFunction();
282+
v8::Local<v8::Function> ctor = Nan::New(s_proxyCt)->GetFunction();
278283
v8::Local<v8::Object> javaObjectObj = ctor->NewInstance();
279-
javaObjectObj->SetHiddenValue(NanNew<v8::String>(V8_HIDDEN_MARKER_JAVA_OBJECT), NanNew<v8::Boolean>(true));
284+
javaObjectObj->SetHiddenValue(Nan::New<v8::String>(V8_HIDDEN_MARKER_JAVA_OBJECT).ToLocalChecked(), Nan::New<v8::Boolean>(true));
280285
JavaProxyObject *self = new JavaProxyObject(java, obj, dynamicProxyData);
281286
self->Wrap(javaObjectObj);
282287

283-
return NanEscapeScope(javaObjectObj);
288+
return scope.Escape(javaObjectObj);
284289
}
285290

286291
JavaProxyObject::JavaProxyObject(Java *java, jobject obj, DynamicProxyData* dynamicProxyData) : JavaObject(java, obj) {
@@ -294,19 +299,20 @@ JavaProxyObject::~JavaProxyObject() {
294299
}
295300

296301
NAN_METHOD(JavaProxyObject::doUnref) {
297-
JavaProxyObject* self = node::ObjectWrap::Unwrap<JavaProxyObject>(args.This());
302+
JavaProxyObject* self = Nan::ObjectWrap::Unwrap<JavaProxyObject>(info.This());
298303
if (dynamicProxyDataVerify(self->m_dynamicProxyData)) {
299304
unref(self->m_dynamicProxyData);
300305
}
301-
NanReturnUndefined();
306+
info.GetReturnValue().SetUndefined();
302307
}
303308

304309
NAN_GETTER(JavaProxyObject::invocationHandlerGetter) {
305-
NanScope();
310+
Nan::HandleScope scope;
306311

307-
JavaProxyObject* self = node::ObjectWrap::Unwrap<JavaProxyObject>(args.This());
312+
JavaProxyObject* self = Nan::ObjectWrap::Unwrap<JavaProxyObject>(info.This());
308313
if (!dynamicProxyDataVerify(self->m_dynamicProxyData)) {
309-
return NanThrowError("dynamicProxyData has been destroyed or corrupted");
314+
Nan::ThrowError("dynamicProxyData has been destroyed or corrupted");
315+
return;
310316
}
311-
NanReturnValue(self->m_dynamicProxyData->functions);
317+
info.GetReturnValue().Set(Nan::New(self->m_dynamicProxyData->functions));
312318
}

0 commit comments

Comments
 (0)