Skip to content

Commit 64139b7

Browse files
committed
switch scoping to use JavaScope class
1 parent 3d080c4 commit 64139b7

8 files changed

Lines changed: 76 additions & 76 deletions

File tree

binding.gyp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@
1313
"sources": [
1414
"src/java.cpp",
1515
"src/javaObject.cpp",
16+
"src/javaScope.cpp",
1617
"src/methodCallBaton.cpp",
1718
"src/nodeJavaBridge.cpp",
1819
"src/utils.cpp"

src/java.cpp

Lines changed: 14 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@
66
#include <unistd.h>
77
#endif
88
#include "javaObject.h"
9+
#include "javaScope.h"
910
#include "methodCallBaton.h"
1011
#include "node_NodeDynamicProxyClass.h"
1112
#include <sstream>
@@ -265,6 +266,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
265266

266267
int argsStart = 0;
267268
int argsEnd = args.Length();
269+
UNUSED_VARIABLE(argsEnd);
268270

269271
ARGS_FRONT_STRING(interfaceName);
270272
ARGS_FRONT_OBJECT(functions);
@@ -402,6 +404,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
402404

403405
int argsStart = 0;
404406
int argsEnd = args.Length();
407+
UNUSED_VARIABLE(argsEnd);
405408

406409
// arguments
407410
ARGS_FRONT_CLASSNAME();
@@ -522,7 +525,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
522525
return ensureJvmResults;
523526
}
524527
JNIEnv* env = self->getJavaEnv();
525-
PUSH_LOCAL_JAVA_FRAME();
528+
JavaScope javaScope(env);
526529

527530
int argsStart = 0;
528531
int argsEnd = args.Length();
@@ -537,15 +540,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
537540
if(clazz == NULL) {
538541
std::ostringstream errStr;
539542
errStr << "Could not create class " << className.c_str();
540-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
543+
return ThrowException(javaExceptionToV8(env, errStr.str()));
541544
}
542545

543546
// get the field
544547
jobject field = javaFindField(env, clazz, fieldName);
545548
if(field == NULL) {
546549
std::ostringstream errStr;
547550
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
548-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
551+
return ThrowException(javaExceptionToV8(env, errStr.str()));
549552
}
550553

551554
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
@@ -556,10 +559,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
556559
if(env->ExceptionOccurred()) {
557560
std::ostringstream errStr;
558561
errStr << "Could not get field " << fieldName.c_str() << " on class " << className.c_str();
559-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
562+
return ThrowException(javaExceptionToV8(env, errStr.str()));
560563
}
561564

562-
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(javaToV8(self, env, val)));
565+
return scope.Close(javaToV8(self, env, val));
563566
}
564567

565568
/*static*/ v8::Handle<v8::Value> Java::setStaticFieldValue(const v8::Arguments& args) {
@@ -570,7 +573,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
570573
return ensureJvmResults;
571574
}
572575
JNIEnv* env = self->getJavaEnv();
573-
PUSH_LOCAL_JAVA_FRAME();
576+
JavaScope javaScope(env);
574577

575578
int argsStart = 0;
576579
int argsEnd = args.Length();
@@ -583,7 +586,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
583586
if(args.Length() < argsStart+1) {
584587
std::ostringstream errStr;
585588
errStr << "setStaticFieldValue requires " << (argsStart+1) << " arguments";
586-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str()))));
589+
return ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str())));
587590
}
588591
jobject newValue = v8ToJava(env, args[argsStart]);
589592
argsStart++;
@@ -595,15 +598,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
595598
if(clazz == NULL) {
596599
std::ostringstream errStr;
597600
errStr << "Could not create class " << className.c_str();
598-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
601+
return ThrowException(javaExceptionToV8(env, errStr.str()));
599602
}
600603

601604
// get the field
602605
jobject field = javaFindField(env, clazz, fieldName);
603606
if(field == NULL) {
604607
std::ostringstream errStr;
605608
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
606-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
609+
return ThrowException(javaExceptionToV8(env, errStr.str()));
607610
}
608611

609612
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
@@ -616,10 +619,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
616619
if(env->ExceptionOccurred()) {
617620
std::ostringstream errStr;
618621
errStr << "Could not set field " << fieldName.c_str() << " on class " << className.c_str();
619-
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
622+
return ThrowException(javaExceptionToV8(env, errStr.str()));
620623
}
621624

622-
POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Undefined());
625+
return v8::Undefined();
623626
}
624627

625628
void EIO_CallJs(uv_work_t* req) {

src/javaObject.cpp

Lines changed: 6 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11

22
#include "javaObject.h"
33
#include "java.h"
4+
#include "javaScope.h"
45
#include "utils.h"
56
#include <sstream>
67
#include <algorithm>
@@ -15,8 +16,7 @@
1516

1617
JNIEnv *env = java->getJavaEnv();
1718
obj = env->NewGlobalRef(obj);
18-
19-
PUSH_LOCAL_JAVA_FRAME();
19+
JavaScope javaScope(env);
2020

2121
jclass objClazz = env->GetObjectClass(obj);
2222
jclass classClazz = env->FindClass("java/lang/Class");
@@ -77,8 +77,6 @@
7777
JavaObject *self = new JavaObject(java, obj);
7878
self->Wrap(javaObjectObj);
7979

80-
POP_LOCAL_JAVA_FRAME();
81-
8280
return scope.Close(javaObjectObj);
8381
}
8482

@@ -109,8 +107,7 @@ JavaObject::~JavaObject() {
109107
v8::HandleScope scope;
110108
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
111109
JNIEnv *env = self->m_java->getJavaEnv();
112-
113-
PUSH_LOCAL_JAVA_FRAME();
110+
JavaScope javaScope(env);
114111

115112
v8::String::AsciiValue methodName(args.Data());
116113
std::string methodNameStr = *methodName;
@@ -122,7 +119,6 @@ JavaObject::~JavaObject() {
122119
ARGS_BACK_CALLBACK();
123120

124121
if(!callbackProvided && methodNameStr == "toString") {
125-
POP_LOCAL_JAVA_FRAME();
126122
return methodCallSync(args);
127123
}
128124

@@ -132,25 +128,21 @@ JavaObject::~JavaObject() {
132128
if(method == NULL) {
133129
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
134130
EXCEPTION_CALL_CALLBACK(msg);
135-
POP_LOCAL_JAVA_FRAME();
136131
return v8::Undefined();
137132
}
138133

139134
// run
140135
InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback);
141136
baton->run();
142137

143-
POP_LOCAL_JAVA_FRAME();
144-
145138
END_CALLBACK_FUNCTION("\"Method '" << methodNameStr << "' called without a callback did you mean to use the Sync version?\"");
146139
}
147140

148141
/*static*/ v8::Handle<v8::Value> JavaObject::methodCallSync(const v8::Arguments& args) {
149142
v8::HandleScope scope;
150143
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(args.This());
151144
JNIEnv *env = self->m_java->getJavaEnv();
152-
153-
PUSH_LOCAL_JAVA_FRAME();
145+
JavaScope javaScope(env);
154146

155147
v8::String::AsciiValue methodName(args.Data());
156148
std::string methodNameStr = *methodName;
@@ -164,7 +156,6 @@ JavaObject::~JavaObject() {
164156
if(method == NULL) {
165157
std::string msg = methodNotFoundToString(env, self->m_class, methodNameStr, false, args, argsStart, argsEnd);
166158
v8::Handle<v8::Value> ex = javaExceptionToV8(env, msg);
167-
POP_LOCAL_JAVA_FRAME();
168159
return ThrowException(ex);
169160
}
170161

@@ -174,8 +165,6 @@ JavaObject::~JavaObject() {
174165
v8::Handle<v8::Value> result = baton->runSync();
175166
delete baton;
176167

177-
POP_LOCAL_JAVA_FRAME();
178-
179168
if(result->IsNativeError()) {
180169
return ThrowException(result);
181170
}
@@ -187,8 +176,7 @@ JavaObject::~JavaObject() {
187176
v8::HandleScope scope;
188177
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This());
189178
JNIEnv *env = self->m_java->getJavaEnv();
190-
191-
PUSH_LOCAL_JAVA_FRAME();
179+
JavaScope javaScope(env);
192180

193181
v8::String::AsciiValue propertyCStr(property);
194182
std::string propertyStr = *propertyCStr;
@@ -197,7 +185,6 @@ JavaObject::~JavaObject() {
197185
std::ostringstream errStr;
198186
errStr << "Could not find field " << propertyStr;
199187
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
200-
POP_LOCAL_JAVA_FRAME();
201188
return ThrowException(ex);
202189
}
203190

@@ -210,23 +197,20 @@ JavaObject::~JavaObject() {
210197
std::ostringstream errStr;
211198
errStr << "Could not get field " << propertyStr;
212199
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
213-
POP_LOCAL_JAVA_FRAME();
214200
return ThrowException(ex);
215201
}
216202

217203
v8::Handle<v8::Value> result = javaToV8(self->m_java, env, val);
218204

219-
POP_LOCAL_JAVA_FRAME();
220-
221205
return scope.Close(result);
222206
}
223207

224208
/*static*/ void JavaObject::fieldSetter(v8::Local<v8::String> property, v8::Local<v8::Value> value, const v8::AccessorInfo& info) {
225209
v8::HandleScope scope;
226210
JavaObject* self = node::ObjectWrap::Unwrap<JavaObject>(info.This());
227211
JNIEnv *env = self->m_java->getJavaEnv();
212+
JavaScope javaScope(env);
228213

229-
PUSH_LOCAL_JAVA_FRAME();
230214
jobject newValue = v8ToJava(env, value);
231215

232216
v8::String::AsciiValue propertyCStr(property);
@@ -236,7 +220,6 @@ JavaObject::~JavaObject() {
236220
std::ostringstream errStr;
237221
errStr << "Could not find field " << propertyStr;
238222
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
239-
POP_LOCAL_JAVA_FRAME();
240223
ThrowException(ex);
241224
return;
242225
}
@@ -252,10 +235,7 @@ JavaObject::~JavaObject() {
252235
std::ostringstream errStr;
253236
errStr << "Could not set field " << propertyStr;
254237
v8::Handle<v8::Value> ex = javaExceptionToV8(env, errStr.str());
255-
POP_LOCAL_JAVA_FRAME();
256238
ThrowException(ex);
257239
return;
258240
}
259-
260-
POP_LOCAL_JAVA_FRAME();
261241
}

src/javaScope.cpp

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
2+
#include "javaScope.h"
3+
4+
JavaScope::JavaScope(JNIEnv *env) {
5+
m_env = env;
6+
m_result = NULL;
7+
m_env->PushLocalFrame(LOCAL_FRAME_SIZE);
8+
}
9+
10+
JavaScope::~JavaScope() {
11+
m_env->PopLocalFrame(m_result);
12+
}
13+
14+
jobject JavaScope::Close(jobject result) {
15+
m_result = result;
16+
return m_result;
17+
}

src/javaScope.h

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
2+
#ifndef _javaScope_h_
3+
#define _javaScope_h_
4+
5+
#include <jni.h>
6+
7+
#define LOCAL_FRAME_SIZE 500
8+
9+
class JavaScope {
10+
public:
11+
JavaScope(JNIEnv *env);
12+
~JavaScope();
13+
jobject Close(jobject result);
14+
15+
private:
16+
JNIEnv *m_env;
17+
jobject m_result;
18+
};
19+
20+
#endif

src/methodCallBaton.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -124,8 +124,6 @@ void StaticMethodCallBaton::execute(JNIEnv *env) {
124124
}
125125

126126
void InstanceMethodCallBaton::execute(JNIEnv *env) {
127-
PUSH_LOCAL_JAVA_FRAME();
128-
129127
jclass methodClazz = env->FindClass("java/lang/reflect/Method");
130128
jmethodID method_invoke = env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
131129

@@ -144,7 +142,6 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
144142
m_error = (jthrowable)env->NewGlobalRef(err);
145143
m_errorString = "Error running instance method";
146144
env->ExceptionClear();
147-
POP_LOCAL_JAVA_FRAME();
148145
return;
149146
}
150147

@@ -154,7 +151,6 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
154151
m_result = env->NewGlobalRef(result);
155152
env->DeleteLocalRef(result);
156153
}
157-
POP_LOCAL_JAVA_FRAME();
158154
}
159155

160156
NewInstanceBaton::NewInstanceBaton(

0 commit comments

Comments
 (0)