[kaffe] CVS kaffe (guilhem): Added support for JNI call NewWeakRef/DeleteWeakRef.

Kaffe CVS cvs-commits at kaffe.org
Tue Jul 5 10:25:45 PDT 2005


PatchSet 6698 
Date: 2005/07/05 17:20:35
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
Added support for JNI call NewWeakRef/DeleteWeakRef.

        * WHATSNEW: Added changes to JNI interface.

        * kaffe/kaffevm/gc.h,
        kaffe/kaffevm/gcFuncs.c: Added new type KGC_ALLOC_VMWEAKREF.

        * kaffe/kaffevm/javacall.c
        (KaffeVM_classMethodA, KaffeVM_callMethodV):
        Unveil an object reference passed into
        arguments if needed.

        * kaffe/kaffevm/intrp/methodcalls.c
        (engine_callMethod): Unveil the return value if it is an object
        reference.

        * kaffe/kaffevm/jit/native-wrapper.c
        (Kaffe_wrapper): Added some JIT pseudo-code to unveil object
        stored into weak references.

        * kaffe/kaffevm/jni/Makefile.am: Added jni-refs.c

        * kaffe/kaffevm/jni/Makefile.in: Regenerated.

        * kaffe/kaffevm/jni/jni-arrays.c,
        kaffe/kaffevm/jni/jni-callmethod.c,
        kaffe/kaffevm/jni/jni-fields.c,
        kaffe/kaffevm/jni/jni-helpers.c,
        kaffe/kaffevm/jni/jni-string.c: Updated to unveil all object
        references passed as arguments.

        * kaffe/kaffevm/jni/jni.c: Moved out references handling.

        * kaffe/kaffevm/jni/jni_funcs.h: Added new JNI exported functions.

        * kaffe/kaffevm/jni/jni_i.h
        (unveil): New function.

        * kaffe/kaffevm/jni/jni-refs.c: New file.

Members: 
	ChangeLog:1.4222->1.4223 
	WHATSNEW:1.43->1.44 
	kaffe/kaffevm/gc.h:1.32->1.33 
	kaffe/kaffevm/gcFuncs.c:1.76->1.77 
	kaffe/kaffevm/javacall.c:1.1->1.2 
	kaffe/kaffevm/intrp/methodcalls.c:1.9->1.10 
	kaffe/kaffevm/jit/native-wrapper.c:1.10->1.11 
	kaffe/kaffevm/jni/Makefile.am:1.6->1.7 
	kaffe/kaffevm/jni/Makefile.in:1.40->1.41 
	kaffe/kaffevm/jni/jni-arrays.c:1.8->1.9 
	kaffe/kaffevm/jni/jni-callmethod.c:1.7->1.8 
	kaffe/kaffevm/jni/jni-fields.c:1.5->1.6 
	kaffe/kaffevm/jni/jni-helpers.c:1.6->1.7 
	kaffe/kaffevm/jni/jni-refs.c:INITIAL->1.1 
	kaffe/kaffevm/jni/jni-string.c:1.11->1.12 
	kaffe/kaffevm/jni/jni.c:1.34->1.35 
	kaffe/kaffevm/jni/jni_funcs.h:1.9->1.10 
	kaffe/kaffevm/jni/jni_i.h:1.8->1.9 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4222 kaffe/ChangeLog:1.4223
--- kaffe/ChangeLog:1.4222	Mon Jul  4 15:46:14 2005
+++ kaffe/ChangeLog	Tue Jul  5 17:20:35 2005
@@ -1,3 +1,43 @@
+2005-07-05  Guilhem Lavaux  <guilhem at kaffe.org>
+
+	* WHATSNEW: Added changes to JNI interface.
+
+	* kaffe/kaffevm/gc.h,
+	kaffe/kaffevm/gcFuncs.c: Added new type KGC_ALLOC_VMWEAKREF.
+
+	* kaffe/kaffevm/javacall.c
+	(KaffeVM_classMethodA, KaffeVM_callMethodV):
+	Unveil an object reference passed into
+	arguments if needed.
+
+	* kaffe/kaffevm/intrp/methodcalls.c
+	(engine_callMethod): Unveil the return value if it is an object
+	reference.
+	
+	* kaffe/kaffevm/jit/native-wrapper.c
+	(Kaffe_wrapper): Added some JIT pseudo-code to unveil object
+	stored into weak references.
+	
+	* kaffe/kaffevm/jni/Makefile.am: Added jni-refs.c
+	
+	* kaffe/kaffevm/jni/Makefile.in: Regenerated.
+	
+	* kaffe/kaffevm/jni/jni-arrays.c,
+	kaffe/kaffevm/jni/jni-callmethod.c,
+	kaffe/kaffevm/jni/jni-fields.c,
+	kaffe/kaffevm/jni/jni-helpers.c,
+	kaffe/kaffevm/jni/jni-string.c: Updated to unveil all object
+	references passed as arguments.
+	
+	* kaffe/kaffevm/jni/jni.c: Moved out references handling.
+
+	* kaffe/kaffevm/jni/jni_funcs.h: Added new JNI exported functions.
+
+	* kaffe/kaffevm/jni/jni_i.h
+	(unveil): New function.
+
+	* kaffe/kaffevm/jni/jni-refs.c: New file.
+	
 2005-07-04  Dalibor Topic  <robilad at kaffe.org>
 
 	Resynced with GNU Classpath.
Index: kaffe/WHATSNEW
diff -u kaffe/WHATSNEW:1.43 kaffe/WHATSNEW:1.44
--- kaffe/WHATSNEW:1.43	Wed Jun 15 15:35:26 2005
+++ kaffe/WHATSNEW	Tue Jul  5 17:20:38 2005
@@ -7,6 +7,7 @@
   for the Java Extension Mechanism and the Java security
   model.
 * Force double precision on x86 FPU for Linux OS.
+* JIT3/PowerPC operational on Darwin/OSX.
 
 What's New in Kaffe 1.1.5
 ------------------------------------------------------
Index: kaffe/kaffe/kaffevm/gc.h
diff -u kaffe/kaffe/kaffevm/gc.h:1.32 kaffe/kaffe/kaffevm/gc.h:1.33
--- kaffe/kaffe/kaffevm/gc.h:1.32	Thu Jun 23 16:43:58 2005
+++ kaffe/kaffe/kaffevm/gc.h	Tue Jul  5 17:20:40 2005
@@ -46,6 +46,7 @@
 	KGC_ALLOC_REFARRAY,
 	KGC_ALLOC_FINALIZEOBJECT,
 	KGC_ALLOC_JAVALOADER,
+	KGC_ALLOC_VMWEAKREF,
 
 	/* allocation types related to the translator engines */
 	KGC_ALLOC_JITCODE,
Index: kaffe/kaffe/kaffevm/gcFuncs.c
diff -u kaffe/kaffe/kaffevm/gcFuncs.c:1.76 kaffe/kaffe/kaffevm/gcFuncs.c:1.77
--- kaffe/kaffe/kaffevm/gcFuncs.c:1.76	Mon Jun 13 15:44:44 2005
+++ kaffe/kaffe/kaffevm/gcFuncs.c	Tue Jul  5 17:20:40 2005
@@ -747,6 +747,7 @@
 	KGC_registerFixedTypeByIndex(gc, KGC_ALLOC_JIT_SLOTS, "jit-slots");
 	KGC_registerFixedTypeByIndex(gc, KGC_ALLOC_JIT_CODEBLOCK, "jit-codeblock");
 	KGC_registerFixedTypeByIndex(gc, KGC_ALLOC_JIT_LABELS, "jit-labels");
+	KGC_registerFixedTypeByIndex(gc, KGC_ALLOC_VMWEAKREF, "vm-weak-ref");
 
 	DBG(INIT, dprintf("initCollector() done\n"); );
 	return (gc);
Index: kaffe/kaffe/kaffevm/javacall.c
diff -u kaffe/kaffe/kaffevm/javacall.c:1.1 kaffe/kaffe/kaffevm/javacall.c:1.2
--- kaffe/kaffe/kaffevm/javacall.c:1.1	Thu Jun 23 16:43:58 2005
+++ kaffe/kaffe/kaffevm/javacall.c	Tue Jul  5 17:20:40 2005
@@ -40,6 +40,7 @@
 #include "jthread.h"
 #include "methodcalls.h"
 #include "native.h"
+#include "jni_i.h"
 
 /* This is defined in the alpha port.  It causes all integer arguments
    to be promoted to jlong, and all jfloats to be promoted to jdouble,
@@ -222,7 +223,7 @@
 			/* fall through */
 		case 'L':
 			call.callsize[i] = PTR_TYPE_SIZE / SIZEOF_INT;
-			call.args[i] = args[j];
+			call.args[i].l = unveil(args[j].l);
 			break;
 		default:
 			KAFFEVM_ABORT();
@@ -364,6 +365,7 @@
 		case 'L':
 			call.callsize[i] = PTR_TYPE_SIZE / SIZEOF_INT;
 			call.args[i].l = va_arg(args, jref);
+			call.args[i].l = unveil(call.args[i].l);
 			break;
 		default:
 			KAFFEVM_ABORT();
Index: kaffe/kaffe/kaffevm/intrp/methodcalls.c
diff -u kaffe/kaffe/kaffevm/intrp/methodcalls.c:1.9 kaffe/kaffe/kaffevm/intrp/methodcalls.c:1.10
--- kaffe/kaffe/kaffevm/intrp/methodcalls.c:1.9	Sat May  7 16:20:11 2005
+++ kaffe/kaffe/kaffevm/intrp/methodcalls.c	Tue Jul  5 17:20:40 2005
@@ -25,6 +25,7 @@
 #include "slots.h"
 #include "soft.h"
 #include "external.h"
+#include "jni_i.h"
 
 void *
 engine_buildTrampoline (Method *meth, void **where, errorInfo *einfo UNUSED)
@@ -177,6 +178,8 @@
 
 		/* If we have a pending exception and this is JNI, throw it */
 		if ((meth->accflags & ACC_JNI) != 0) {
+		        if (call->rettype == 'L')
+			        call->ret->l = unveil(call->ret->l);
 		        finishJNIcall();
 			thread_data->exceptObj = save_except;
 		}
Index: kaffe/kaffe/kaffevm/jit/native-wrapper.c
diff -u kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.10 kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.11
--- kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.10	Mon May 30 09:24:00 2005
+++ kaffe/kaffe/kaffevm/jit/native-wrapper.c	Tue Jul  5 17:20:41 2005
@@ -86,6 +86,7 @@
 	int count;
 	nativeCodeInfo ncode;
 	SlotInfo* tmp = NULL;
+	SlotInfo* tmp2 = NULL;
 	bool success = true;
 	int j;
 	int an;
@@ -319,6 +320,32 @@
 			mon_exit(xmeth, local(0));
 		}
 		if (use_JNI) {
+		        slot_alloctmp(tmp2);
+		  
+#if SIZEOF_VOID_P == SIZEOF_INT
+			and_int_const(tmp2, tmp, 1);
+#elif SIZEOF_VOID_P == SIZEOF_LONG
+			and_long_const(tmp2, tmp, 1);
+#else
+#error "Unsupported size of pointer"
+#endif
+			end_sub_block();
+			begin_sync();
+			cbranch_int_const_eq(tmp2, 0, reference_label(1, 1));
+			end_sync();
+			
+			start_sub_block();
+#if SIZEOF_VOID_P == SIZEOF_INT
+			and_int_const(tmp2, tmp, ~(uintp)1);
+#elif SIZEOF_VOID_P == SIZEOF_LONG
+			and_long_const(tmp2, tmp, ~(uintp)1);
+#else
+#error "Unsupported size of pointer"
+#endif
+			load_ref(tmp, tmp2);
+			slot_freetmp(tmp2);
+			end_sub_block();
+			set_label(1, 1);
 			end_sub_block();
 			call_soft(finishJNIcall);
 			start_sub_block();
@@ -437,6 +464,7 @@
 	globalMethod = NULL;
 
 	leaveTranslator();
+
 #if defined(KAFFE_FEEDBACK)
 	if( kaffe_feedback_file )
 		unlockMutex(kaffe_feedback_file);
Index: kaffe/kaffe/kaffevm/jni/Makefile.am
diff -u kaffe/kaffe/kaffevm/jni/Makefile.am:1.6 kaffe/kaffe/kaffevm/jni/Makefile.am:1.7
--- kaffe/kaffe/kaffevm/jni/Makefile.am:1.6	Mon Jul  5 16:40:46 2004
+++ kaffe/kaffe/kaffevm/jni/Makefile.am	Tue Jul  5 17:20:41 2005
@@ -31,7 +31,8 @@
 	jni-fields.c \
 	jni-arrays.c \
 	jni-string.c \
-	jni-helpers.c
+	jni-helpers.c \
+	jni-refs.c
 
 noinst_HEADERS= \
 	jni_i.h \
Index: kaffe/kaffe/kaffevm/jni/Makefile.in
diff -u kaffe/kaffe/kaffevm/jni/Makefile.in:1.40 kaffe/kaffe/kaffevm/jni/Makefile.in:1.41
--- kaffe/kaffe/kaffevm/jni/Makefile.in:1.40	Sat May 14 21:46:35 2005
+++ kaffe/kaffe/kaffevm/jni/Makefile.in	Tue Jul  5 17:20:41 2005
@@ -80,7 +80,8 @@
 LTLIBRARIES = $(noinst_LTLIBRARIES)
 libkaffejni_la_LIBADD =
 am_libkaffejni_la_OBJECTS = jni.lo jni-base.lo jni-callmethod.lo \
-	jni-fields.lo jni-arrays.lo jni-string.lo jni-helpers.lo
+	jni-fields.lo jni-arrays.lo jni-string.lo jni-helpers.lo \
+	jni-refs.lo
 libkaffejni_la_OBJECTS = $(am_libkaffejni_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/config
 depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
@@ -397,7 +398,8 @@
 	jni-fields.c \
 	jni-arrays.c \
 	jni-string.c \
-	jni-helpers.c
+	jni-helpers.c \
+	jni-refs.c
 
 noinst_HEADERS = \
 	jni_i.h \
@@ -460,6 +462,7 @@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni-callmethod.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni-fields.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni-helpers.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni-refs.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni-string.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/jni.Plo at am__quote@
 
Index: kaffe/kaffe/kaffevm/jni/jni-arrays.c
diff -u kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.8 kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.9
--- kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.8	Mon May 30 09:24:01 2005
+++ kaffe/kaffe/kaffevm/jni/jni-arrays.c	Tue Jul  5 17:20:41 2005
@@ -28,6 +28,7 @@
 
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (elem >= (jsize)obj_length((HArrayOfObject*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -43,6 +44,9 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
+  val = unveil(val);
+
   if (elem >= (jsize)obj_length((HArrayOfObject*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -59,6 +63,8 @@
 
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  cls = unveil(cls);
+  init = unveil(init);
   obj = (HArrayOfObject*)newArray((Hjava_lang_Class*)cls, len);
 
   /* I assume this is what init is for */
@@ -189,6 +195,7 @@
   jboolean* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -204,6 +211,7 @@
   jbyte* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -224,7 +232,8 @@
 {
   jchar* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
-
+  
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -240,6 +249,7 @@
   jshort* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -255,6 +265,7 @@
   jint* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -270,6 +281,7 @@
   jlong* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -285,6 +297,7 @@
   jfloat* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -300,6 +313,7 @@
   jdouble* array;
   BEGIN_EXCEPTION_HANDLING(NULL);
 
+  arr = unveil(arr);
   if (iscopy != NULL) {
     *iscopy = JNI_FALSE;
   }
@@ -314,6 +328,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfBoolean*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -338,6 +353,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfByte*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -368,6 +384,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfChar*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -392,6 +409,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfShort*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -416,6 +434,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfInt*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -440,6 +459,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfLong*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -464,6 +484,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfFloat*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -488,6 +509,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (elems != unhand_array((HArrayOfDouble*)arr)->body) {
     switch (mode) {
     case JNI_COMMIT:
@@ -512,6 +534,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfBoolean*)arr) || start + len > obj_length((HArrayOfBoolean*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -525,6 +548,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfByte*)arr) || start + len > obj_length((HArrayOfByte*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -538,6 +562,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfChar*)arr) || start + len > obj_length((HArrayOfChar*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -551,6 +576,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfShort*)arr) || start + len > obj_length((HArrayOfShort*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -564,6 +590,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfInt*)arr) || start + len > obj_length((HArrayOfInt*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -577,6 +604,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfLong*)arr) || start + len > obj_length((HArrayOfLong*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -590,6 +618,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfFloat*)arr) || start + len > obj_length((HArrayOfFloat*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -603,6 +632,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfDouble*)arr) || start + len > obj_length((HArrayOfDouble*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -616,6 +646,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfBoolean*)arr) || start+len > obj_length((HArrayOfBoolean*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -629,6 +660,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfByte*)arr) || start+len > obj_length((HArrayOfByte*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -642,6 +674,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfChar*)arr) || start+len > obj_length((HArrayOfChar*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -655,6 +688,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfShort*)arr) || start+len > obj_length((HArrayOfShort*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -668,6 +702,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfInt*)arr) || start+len > obj_length((HArrayOfInt*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -681,6 +716,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfLong*)arr) || start+len > obj_length((HArrayOfLong*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -693,7 +729,8 @@
 KaffeJNI_SetFloatArrayRegion(JNIEnv* env UNUSED, jfloatArray arr, jsize start, jsize len, jfloat* data)
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
-
+  
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfFloat*)arr) || start+len > obj_length((HArrayOfFloat*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
@@ -707,6 +744,7 @@
 {
   BEGIN_EXCEPTION_HANDLING_VOID();
 
+  arr = unveil(arr);
   if (start >= obj_length((HArrayOfDouble*)arr) || start+len > obj_length((HArrayOfDouble*)arr)) {
     throwException(ArrayIndexOutOfBoundsException);
   }
Index: kaffe/kaffe/kaffevm/jni/jni-callmethod.c
diff -u kaffe/kaffe/kaffevm/jni/jni-callmethod.c:1.7 kaffe/kaffe/kaffevm/jni/jni-callmethod.c:1.8
--- kaffe/kaffe/kaffevm/jni/jni-callmethod.c:1.7	Sat May  7 16:20:12 2005
+++ kaffe/kaffe/kaffevm/jni/jni-callmethod.c	Tue Jul  5 17:20:41 2005
@@ -57,7 +57,7 @@
 void
 KaffeJNI_CallVoidMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING_VOID();
@@ -66,7 +66,12 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, NULL);
+  /*
+   * callMethodA will have to unveil the objects contained in the argument lists.
+   * This is not really pretty but more efficient because we do not parse the signature
+   * twice.
+   */
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, NULL);
 
   END_EXCEPTION_HANDLING();
 }
@@ -88,7 +93,7 @@
 void
 KaffeJNI_CallVoidMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING_VOID();
@@ -97,7 +102,12 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, NULL, 0);
+  /*
+   * callMethodA will have to unveil the objects contained in the argument lists.
+   * This is not really pretty but more efficient because we do not parse the signature
+   * twice.
+   */
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, NULL, 0);
 
   END_EXCEPTION_HANDLING();
 }
@@ -119,6 +129,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
+  obj = unveil(obj);
   KaffeVM_callMethodV(m, METHOD_NATIVECODE(m), obj, args, &retval);
 
   ADD_REF(retval.l);
@@ -149,7 +160,8 @@
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(NULL);
-
+  
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -174,6 +186,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -208,6 +221,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -230,6 +244,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -264,6 +279,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -287,6 +303,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -321,6 +338,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -344,6 +362,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -378,6 +397,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -401,6 +421,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -435,6 +456,7 @@
 
   BEGIN_EXCEPTION_HANDLING(0);
 
+  obj = unveil(obj);
   if (METHOD_IS_STATIC(m)) {
     throwException(NoSuchMethodError(m->name->data));
   }
@@ -454,7 +476,7 @@
 KaffeJNI_CallObjectMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(NULL);
@@ -463,7 +485,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   ADD_REF(retval.l);
   END_EXCEPTION_HANDLING();
@@ -491,7 +513,7 @@
 KaffeJNI_CallObjectMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(NULL);
@@ -500,7 +522,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return (retval.l);
@@ -515,7 +537,7 @@
 KaffeJNI_CallBooleanMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -524,7 +546,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return ((jboolean) retval.i);
@@ -550,7 +572,7 @@
 KaffeJNI_CallBooleanMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -559,7 +581,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return ((jboolean) retval.i);
@@ -574,7 +596,7 @@
 KaffeJNI_CallByteMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -583,7 +605,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return ((jbyte) retval.i);
@@ -609,7 +631,7 @@
 KaffeJNI_CallByteMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -633,7 +655,7 @@
 KaffeJNI_CallCharMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -642,7 +664,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return ((jchar) retval.i);
@@ -668,7 +690,7 @@
 KaffeJNI_CallCharMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -677,7 +699,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return ((jchar) retval.i);
@@ -692,7 +714,7 @@
 KaffeJNI_CallShortMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -701,7 +723,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return ((jshort) retval.i);
@@ -727,7 +749,7 @@
 KaffeJNI_CallShortMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -736,7 +758,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return ((jshort) retval.i);
@@ -751,7 +773,7 @@
 KaffeJNI_CallIntMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -760,7 +782,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return (retval.i);
@@ -786,7 +808,7 @@
 KaffeJNI_CallIntMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -795,7 +817,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return (retval.i);
@@ -810,7 +832,7 @@
 KaffeJNI_CallLongMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -819,7 +841,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return (retval.j);
@@ -845,7 +867,7 @@
 KaffeJNI_CallLongMethodA(JNIEnv* env UNUSED, jobject obj, jmethodID meth, jvalue* args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -854,7 +876,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodA(m, getMethodFunc (m, o), obj, args, &retval, 0);
+  KaffeVM_callMethodA(m, getMethodFunc (m, o), o, args, &retval, 0);
 
   END_EXCEPTION_HANDLING();
   return (retval.j);
@@ -869,7 +891,7 @@
 KaffeJNI_CallFloatMethodV(JNIEnv* env UNUSED, jobject obj, jmethodID meth, va_list args)
 {
   jvalue retval;
-  Hjava_lang_Object* o = (Hjava_lang_Object*)obj;
+  Hjava_lang_Object* o = (Hjava_lang_Object*)unveil(obj);
   Method* m = (Method*)meth;
 
   BEGIN_EXCEPTION_HANDLING(0);
@@ -878,7 +900,7 @@
     throwException(NoSuchMethodError(m->name->data));
   }
 
-  KaffeVM_callMethodV(m, getMethodFunc (m, o), obj, args, &retval);
+  KaffeVM_callMethodV(m, getMethodFunc (m, o), o, args, &retval);
 
   END_EXCEPTION_HANDLING();
   return (retval.f);
@@ -904,7 +926,7 @@

*** Patch too long, truncated ***



More information about the kaffe mailing list