Skip to content

Commit c8cdd4e

Browse files
committed
more local stack frames
1 parent 642c733 commit c8cdd4e

3 files changed

Lines changed: 39 additions & 23 deletions

File tree

src/java.cpp

Lines changed: 15 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -497,6 +497,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
497497
return ensureJvmResults;
498498
}
499499
JNIEnv* env = self->getJavaEnv();
500+
PUSH_LOCAL_JAVA_FRAME();
500501

501502
int argsStart = 0;
502503
int argsEnd = args.Length();
@@ -511,15 +512,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
511512
if(clazz == NULL) {
512513
std::ostringstream errStr;
513514
errStr << "Could not create class " << className.c_str();
514-
return ThrowException(javaExceptionToV8(env, errStr.str()));
515+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
515516
}
516517

517518
// get the field
518519
jobject field = javaFindField(env, clazz, fieldName);
519520
if(field == NULL) {
520521
std::ostringstream errStr;
521522
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
522-
return ThrowException(javaExceptionToV8(env, errStr.str()));
523+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
523524
}
524525

525526
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
@@ -530,10 +531,14 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
530531
if(env->ExceptionOccurred()) {
531532
std::ostringstream errStr;
532533
errStr << "Could not get field " << fieldName.c_str() << " on class " << className.c_str();
533-
return ThrowException(javaExceptionToV8(env, errStr.str()));
534+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
534535
}
535536

536-
return scope.Close(javaToV8(self, env, val));
537+
env->DeleteLocalRef(clazz);
538+
env->DeleteLocalRef(field);
539+
env->DeleteLocalRef(fieldClazz);
540+
541+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(javaToV8(self, env, val)));
537542
}
538543

539544
/*static*/ v8::Handle<v8::Value> Java::setStaticFieldValue(const v8::Arguments& args) {
@@ -544,6 +549,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
544549
return ensureJvmResults;
545550
}
546551
JNIEnv* env = self->getJavaEnv();
552+
PUSH_LOCAL_JAVA_FRAME();
547553

548554
int argsStart = 0;
549555
int argsEnd = args.Length();
@@ -556,7 +562,7 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
556562
if(args.Length() < argsStart+1) {
557563
std::ostringstream errStr;
558564
errStr << "setStaticFieldValue requires " << (argsStart+1) << " arguments";
559-
return ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str())));
565+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(v8::Exception::TypeError(v8::String::New(errStr.str().c_str()))));
560566
}
561567
jobject newValue = v8ToJava(env, args[argsStart]);
562568
argsStart++;
@@ -568,15 +574,15 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
568574
if(clazz == NULL) {
569575
std::ostringstream errStr;
570576
errStr << "Could not create class " << className.c_str();
571-
return ThrowException(javaExceptionToV8(env, errStr.str()));
577+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
572578
}
573579

574580
// get the field
575581
jobject field = javaFindField(env, clazz, fieldName);
576582
if(field == NULL) {
577583
std::ostringstream errStr;
578584
errStr << "Could not find field " << fieldName.c_str() << " on class " << className.c_str();
579-
return ThrowException(javaExceptionToV8(env, errStr.str()));
585+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
580586
}
581587

582588
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
@@ -589,10 +595,10 @@ v8::Handle<v8::Value> Java::createJVM(JavaVM** jvm, JNIEnv** env) {
589595
if(env->ExceptionOccurred()) {
590596
std::ostringstream errStr;
591597
errStr << "Could not set field " << fieldName.c_str() << " on class " << className.c_str();
592-
return ThrowException(javaExceptionToV8(env, errStr.str()));
598+
POP_LOCAL_JAVA_FRAME_AND_RETURN(ThrowException(javaExceptionToV8(env, errStr.str())));
593599
}
594600

595-
return v8::Undefined();
601+
POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Undefined());
596602
}
597603

598604
void EIO_CallJs(uv_work_t* req) {

src/javaObject.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -200,6 +200,7 @@ JavaObject::~JavaObject() {
200200

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

203+
env->DeleteLocalRef(fieldClazz);
203204
env->DeleteLocalRef(field);
204205
env->DeleteLocalRef(val);
205206
POP_LOCAL_JAVA_FRAME();

src/utils.cpp

Lines changed: 23 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ 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);
2324
continue;
2425
}
2526
methods->push_back(method);
@@ -39,6 +40,7 @@ void javaReflectionGetFields(JNIEnv *env, jclass clazz, std::list<jobject>* fiel
3940
jobject field = env->GetObjectArrayElement(fieldObjects, i);
4041
jint fieldModifiers = env->CallIntMethod(field, field_getModifiers);
4142
if((fieldModifiers & MODIFIER_STATIC) == MODIFIER_STATIC) {
43+
env->DeleteLocalRef(field);
4244
continue;
4345
}
4446
fields->push_back(field);
@@ -130,6 +132,7 @@ jclass javaFindClass(JNIEnv* env, std::string& className) {
130132
}
131133

132134
jobject javaFindField(JNIEnv* env, jclass clazz, std::string& fieldName) {
135+
jobject result = NULL;
133136
jclass clazzclazz = env->GetObjectClass(clazz);
134137
jclass fieldClazz = env->FindClass("java/lang/reflect/Field");
135138
jmethodID field_getName = env->GetMethodID(fieldClazz, "getName", "()Ljava/lang/String;");
@@ -141,11 +144,16 @@ jobject javaFindField(JNIEnv* env, jclass clazz, std::string& fieldName) {
141144
jobject field = env->GetObjectArrayElement(fieldObjects, i);
142145
std::string itFieldName = javaToString(env, (jstring)env->CallObjectMethod(field, field_getName));
143146
if(strcmp(itFieldName.c_str(), fieldName.c_str()) == 0) {
144-
return field;
147+
result = field;
148+
break;
145149
}
150+
env->DeleteLocalRef(field);
146151
}
147152

148-
return NULL;
153+
env->DeleteLocalRef(fieldObjects);
154+
env->DeleteLocalRef(clazzclazz);
155+
env->DeleteLocalRef(fieldClazz);
156+
return result;
149157
}
150158

151159
jobject v8ToJava(JNIEnv* env, v8::Local<v8::Value> arg) {
@@ -325,9 +333,10 @@ v8::Handle<v8::Value> javaArrayToV8(Java* java, JNIEnv* env, jobjectArray objArr
325333

326334
v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
327335
v8::HandleScope scope;
336+
PUSH_LOCAL_JAVA_FRAME();
328337

329338
if(obj == NULL) {
330-
return v8::Null();
339+
POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Null());
331340
}
332341

333342
jclass objClazz = env->GetObjectClass(obj);
@@ -339,55 +348,55 @@ v8::Handle<v8::Value> javaToV8(Java* java, JNIEnv* env, jobject obj) {
339348
case TYPE_ARRAY:
340349
{
341350
v8::Handle<v8::Value> result = javaArrayToV8(java, env, (jobjectArray)obj);
342-
return scope.Close(result);
351+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(result));
343352
}
344353
case TYPE_VOID:
345-
return v8::Undefined();
354+
POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Undefined());
346355
case TYPE_BOOLEAN:
347356
{
348357
jclass booleanClazz = env->FindClass("java/lang/Boolean");
349358
jmethodID boolean_booleanValue = env->GetMethodID(booleanClazz, "booleanValue", "()Z");
350359
bool result = env->CallBooleanMethod(obj, boolean_booleanValue);
351-
return scope.Close(v8::Boolean::New(result));
360+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::Boolean::New(result)));
352361
}
353362
case TYPE_BYTE:
354363
{
355364
jclass byteClazz = env->FindClass("java/lang/Byte");
356365
jmethodID byte_byteValue = env->GetMethodID(byteClazz, "byteValue", "()B");
357366
jbyte result = env->CallByteMethod(obj, byte_byteValue);
358-
return scope.Close(v8::Number::New(result));
367+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::Number::New(result)));
359368
}
360369
case TYPE_LONG:
361370
{
362371
jclass longClazz = env->FindClass("java/lang/Long");
363372
jmethodID long_longValue = env->GetMethodID(longClazz, "longValue", "()J");
364373
jlong result = env->CallLongMethod(obj, long_longValue);
365-
return scope.Close(v8::Number::New(result));
374+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::Number::New(result)));
366375
}
367376
case TYPE_INT:
368377
{
369378
jclass integerClazz = env->FindClass("java/lang/Integer");
370379
jmethodID integer_intValue = env->GetMethodID(integerClazz, "intValue", "()I");
371380
jint result = env->CallIntMethod(obj, integer_intValue);
372-
return scope.Close(v8::Integer::New(result));
381+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::Integer::New(result)));
373382
}
374383
case TYPE_DOUBLE:
375384
{
376385
jclass doubleClazz = env->FindClass("java/lang/Double");
377386
jmethodID double_doubleValue = env->GetMethodID(doubleClazz, "doubleValue", "()D");
378387
jdouble result = env->CallDoubleMethod(obj, double_doubleValue);
379-
return scope.Close(v8::Number::New(result));
388+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::Number::New(result)));
380389
}
381390
case TYPE_STRING:
382-
return scope.Close(v8::String::New(javaObjectToString(env, obj).c_str()));
391+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(v8::String::New(javaObjectToString(env, obj).c_str())));
383392
case TYPE_OBJECT:
384-
return scope.Close(JavaObject::New(java, obj));
393+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(JavaObject::New(java, obj)));
385394
default:
386395
printf("unhandled type: 0x%03x\n", resultType);
387-
return scope.Close(JavaObject::New(java, obj));
396+
POP_LOCAL_JAVA_FRAME_AND_RETURN(scope.Close(JavaObject::New(java, obj)));
388397
}
389398

390-
return v8::Undefined();
399+
POP_LOCAL_JAVA_FRAME_AND_RETURN(v8::Undefined());
391400
}
392401

393402
jobjectArray javaObjectArrayToClasses(JNIEnv *env, jobjectArray objs) {

0 commit comments

Comments
 (0)