Skip to content

Commit b546809

Browse files
committed
removed DeleteLocals in favor of stack frames
1 parent 888f9ba commit b546809

File tree

5 files changed

+15
-40
lines changed

5 files changed

+15
-40
lines changed

src/java.cpp

Lines changed: 0 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -535,10 +535,6 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
535535
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
536536
}
537537

538-
env->DeleteLocalRef(clazz);
539-
env->DeleteLocalRef(field);
540-
env->DeleteLocalRef(fieldClazz);
541-
542538
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(javaToV8(self, env, val)));
543539
}
544540

src/javaObject.cpp

Lines changed: 0 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,6 @@
4343
v8::Handle<v8::String> methodNameSync = v8::String::New((methodNameStr + "Sync").c_str());
4444
v8::Local<v8::FunctionTemplate> methodCallSyncTemplate = v8::FunctionTemplate::New(methodCallSync, methodName);
4545
javaObjectObj->Set(methodNameSync, methodCallSyncTemplate->GetFunction());
46-
47-
env->DeleteLocalRef(methodNameJava);
48-
env->DeleteLocalRef(*it);
4946
}
5047

5148
std::list<jobject> fields;
@@ -58,13 +55,8 @@
5855

5956
v8::Handle<v8::String> fieldName = v8::String::New(fieldNameStr.c_str());
6057
javaObjectObj->SetAccessor(fieldName, fieldGetter, fieldSetter);
61-
62-
env->DeleteLocalRef(fieldNameJava);
63-
env->DeleteLocalRef(*it);
6458
}
6559

66-
env->DeleteLocalRef(obj);
67-
6860
POP_LOCAL_JAVA_FRAME();
6961

7062
return scope.Close(javaObjectObj);
@@ -127,8 +119,6 @@ JavaObject::~JavaObject() {
127119
InstanceMethodCallBaton* baton = new InstanceMethodCallBaton(self->m_java, self, method, methodArgs, callback);
128120
baton->run();
129121

130-
env->DeleteLocalRef(methodArgs);
131-
env->DeleteLocalRef(method);
132122
POP_LOCAL_JAVA_FRAME();
133123

134124
END_CALLBACK_FUNCTION("\"Method '" << methodNameStr << "' called without a callback did you mean to use the Sync version?\"");
@@ -202,9 +192,6 @@ JavaObject::~JavaObject() {
202192

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

205-
env->DeleteLocalRef(fieldClazz);
206-
env->DeleteLocalRef(field);
207-
env->DeleteLocalRef(val);
208195
POP_LOCAL_JAVA_FRAME();
209196

210197
return scope.Close(result);

src/methodCallBaton.cpp

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

125125
void InstanceMethodCallBaton::execute(JNIEnv *env) {
126+
PUSH_LOCAL_JAVA_FRAME();
127+
126128
jclass methodClazz = env->FindClass("java/lang/reflect/Method");
127129
jmethodID method_invoke = env->GetMethodID(methodClazz, "invoke", "(Ljava/lang/Object;[Ljava/lang/Object;)Ljava/lang/Object;");
128130

@@ -136,18 +138,17 @@ void InstanceMethodCallBaton::execute(JNIEnv *env) {
136138

137139
jobject result = env->CallObjectMethod(m_method, method_invoke, m_javaObject->getObject(), m_args);
138140

139-
env->DeleteLocalRef(methodClazz);
140-
141141
jthrowable err = env->ExceptionOccurred();
142142
if(err) {
143143
m_error = (jthrowable)env->NewGlobalRef(err);
144144
m_errorString = "Error running instance method";
145145
env->ExceptionClear();
146+
POP_LOCAL_JAVA_FRAME();
146147
return;
147148
}
148149

149150
m_result = env->NewGlobalRef(result);
150-
env->DeleteLocalRef(result);
151+
POP_LOCAL_JAVA_FRAME();
151152
}
152153

153154
NewInstanceBaton::NewInstanceBaton(

src/utils.cpp

Lines changed: 7 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -20,12 +20,10 @@ void javaReflectionGetMethods(JNIEnv *env, jclass clazz, std::list<jobject>* met
2020
jobject method = env->GetObjectArrayElement(methodObjects, i);
2121
jint methodModifiers = env->CallIntMethod(method, method_getModifiers);
2222
if((methodModifiers & MODIFIER_STATIC) == MODIFIER_STATIC) {
23-
env->DeleteLocalRef(method);
2423
continue;
2524
}
2625
methods->push_back(method);
2726
}
28-
env->DeleteLocalRef(methodObjects);
2927
}
3028

3129
void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fields) {
@@ -40,12 +38,10 @@ void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fiel
4038
jobject field = env->GetObjectArrayElement(fieldObjects, i);
4139
jint fieldModifiers = env->CallIntMethod(field, field_getModifiers);
4240
if((fieldModifiers & MODIFIER_STATIC) == MODIFIER_STATIC) {
43-
env->DeleteLocalRef(field);
4441
continue;
4542
}
4643
fields->push_back(field);
4744
}
48-
env->DeleteLocalRef(fieldObjects);
4945
}
5046

5147
std::string javaToString(JNIEnv *env, jstring str) {
@@ -171,17 +167,12 @@ jobject javaFindField(JNIEnv* env, jclass clazz, std::string& fieldName) {
171167
jobject field = env->GetObjectArrayElement(fieldObjects, i);
172168
jstring fieldNameJava = (jstring)env->CallObjectMethod(field, field_getName);
173169
std::string itFieldName = javaToString(env, fieldNameJava);
174-
env->DeleteLocalRef(fieldNameJava);
175170
if(strcmp(itFieldName.c_str(), fieldName.c_str()) == 0) {
176171
result = field;
177172
break;
178173
}
179-
env->DeleteLocalRef(field);
180174
}
181175

182-
env->DeleteLocalRef(fieldObjects);
183-
env->DeleteLocalRef(clazzclazz);
184-
env->DeleteLocalRef(fieldClazz);
185176
return result;
186177
}
187178

@@ -295,9 +286,7 @@ jobjectArray v8ToJava(JNIEnv* env, const v8::Arguments& args, int start, int end
295286
for(int i=start; i<end; i++) {
296287
jobject val = v8ToJava(env, args[i]);
297288
env->SetObjectArrayElement(results, i - start, val);
298-
env->DeleteLocalRef(val);
299289
}
300-
env->DeleteLocalRef(clazz);
301290

302291
return results;
303292
}
@@ -436,6 +425,8 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
436425
}
437426

438427
jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs) {
428+
PUSH_LOCAL_JAVA_FRAME();
429+
439430
jclass clazzClazz = env->FindClass("java/lang/Class");
440431
jsize objsLength = env->GetArrayLength(objs);
441432
jobjectArray results = env->NewObjectArray(objsLength, clazzClazz, NULL);
@@ -446,27 +437,23 @@ jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs) {
446437
} else {
447438
jclass objClazz = env->GetObjectClass(elem);
448439
env->SetObjectArrayElement(results, i, objClazz);
449-
env->DeleteLocalRef(objClazz);
450440
}
451-
env->DeleteLocalRef(elem);
452441
}
453-
env->DeleteLocalRef(clazzClazz);
454-
return results;
442+
443+
POP_LOCAL_JAVA_FRAME_AND_RETURN_JAVA(results);
455444
}
456445

457446
jobject javaFindMethod(JNIEnv *env, jclass clazz, std::string& methodName, jobjectArray methodArgs) {
447+
PUSH_LOCAL_JAVA_FRAME();
448+
458449
jclass methodUtilsClazz = env->FindClass("com/nearinfinity/org/apache/commons/lang3/reflect/MethodUtils");
459450
jmethodID methodUtils_getMatchingAccessibleMethod = env->GetStaticMethodID(methodUtilsClazz, "getMatchingAccessibleMethod", "(Ljava/lang/Class;Ljava/lang/String;[Ljava/lang/Class;)Ljava/lang/reflect/Method;");
460451
const char *methodNameCStr = methodName.c_str();
461452
jstring methodNameJavaStr = env->NewStringUTF(methodNameCStr);
462453
jobjectArray methodArgClasses = javaObjectArrayToClasses(env, methodArgs);
463454
jobject method = env->CallStaticObjectMethod(methodUtilsClazz, methodUtils_getMatchingAccessibleMethod, clazz, methodNameJavaStr, methodArgClasses);
464455

465-
env->DeleteLocalRef(methodUtilsClazz);
466-
env->DeleteLocalRef(methodNameJavaStr);
467-
env->DeleteLocalRef(methodArgClasses);
468-
469-
return method;
456+
POP_LOCAL_JAVA_FRAME_AND_RETURN_JAVA(method);
470457
}
471458

472459
jobject javaFindConstructor(JNIEnv *env, jclass clazz, jobjectArray methodArgs) {

src/utils.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,4 +131,8 @@ jobject javaFindConstructor(JNIEnv *env, jclass clazz, jobjectArray methodArgs);
131131
env->PopLocalFrame(NULL); \
132132
return r;
133133

134+
#define POP_LOCAL_JAVA_FRAME_AND_RETURN_JAVA(r) \
135+
env->PopLocalFrame(r); \
136+
return r;
137+
134138
#endif

0 commit comments

Comments
 (0)