PatchSet 4869 
Date: 2004/06/26 05:57:37
Author: guilhem
Branch: HEAD
Tag: (none) 
Log:
More JNI splitting

        * kaffe/kaffevm/jni/jni.c, kaffe/kaffevm/jni/jni_i.h:
        Moved out functions concerning native call handling to jni-native.c
        and jni_native.h.

        * kaffe/kaffevm/jni/jni-native.c, kaffe/kaffevm/jni/jni_native.h:
        New files.

        * kaffe/kaffevm/jni/Makefile.am: Added jni-native.c and jni_native.h.

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

Members: 
        ChangeLog:1.2435->1.2436 
        kaffe/kaffevm/jni/Makefile.am:1.3->1.4 
        kaffe/kaffevm/jni/Makefile.in:1.4->1.5 
        kaffe/kaffevm/jni/jni-arrays.c:1.1->1.2 
        kaffe/kaffevm/jni/jni-native.c:INITIAL->1.1 
        kaffe/kaffevm/jni/jni.c:1.3->1.4 
        kaffe/kaffevm/jni/jni_i.h:1.2->1.3 
        kaffe/kaffevm/jni/jni_native.h:INITIAL->1.1 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.2435 kaffe/ChangeLog:1.2436
--- kaffe/ChangeLog:1.2435      Fri Jun 25 16:04:33 2004
+++ kaffe/ChangeLog     Sat Jun 26 05:57:37 2004
@@ -1,4 +1,17 @@
-2004-06-52  Guilhem Lavaux <[EMAIL PROTECTED]>
+2004-06-26  Guilhem Lavaux <[EMAIL PROTECTED]>
+
+       * kaffe/kaffevm/jni/jni.c, kaffe/kaffevm/jni/jni_i.h:
+       Moved out functions concerning native call handling to jni-native.c
+       and jni_native.h.
+
+       * kaffe/kaffevm/jni/jni-native.c, kaffe/kaffevm/jni/jni_native.h:
+       New files.
+
+       * kaffe/kaffevm/jni/Makefile.am: Added jni-native.c and jni_native.h.
+
+       * kaffe/kaffevm/jni/Makefile.in: Regenerated.
+
+2004-06-25  Guilhem Lavaux <[EMAIL PROTECTED]>
 
        * kaffe/kaffevm/jni/jni.c, kaffe/kaffevm/jni/jni_funcs.h:
        Moved out functions concerning Field handling to jni-fields.c.
Index: kaffe/kaffe/kaffevm/jni/Makefile.am
diff -u kaffe/kaffe/kaffevm/jni/Makefile.am:1.3 kaffe/kaffe/kaffevm/jni/Makefile.am:1.4
--- kaffe/kaffe/kaffevm/jni/Makefile.am:1.3     Fri Jun 25 16:04:35 2004
+++ kaffe/kaffe/kaffevm/jni/Makefile.am Sat Jun 26 05:57:45 2004
@@ -29,9 +29,11 @@
        jni-base.c \
        jni-callmethod.c \
        jni-fields.c \
-       jni-arrays.c
+       jni-arrays.c \
+       jni-native.c
 
 noinst_HEADERS= \
        jni_i.h \
        jnirefs.h \
-       jni_funcs.h
+       jni_funcs.h \
+       jni_native.h
Index: kaffe/kaffe/kaffevm/jni/Makefile.in
diff -u kaffe/kaffe/kaffevm/jni/Makefile.in:1.4 kaffe/kaffe/kaffevm/jni/Makefile.in:1.5
--- kaffe/kaffe/kaffevm/jni/Makefile.in:1.4     Fri Jun 25 16:04:35 2004
+++ kaffe/kaffe/kaffevm/jni/Makefile.in Sat Jun 26 05:57:45 2004
@@ -75,7 +75,7 @@
 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-fields.lo jni-arrays.lo jni-native.lo
 libkaffejni_la_OBJECTS = $(am_libkaffejni_la_OBJECTS)
 DEFAULT_INCLUDES = -I. -I$(srcdir) -I$(top_builddir)/config 
-I$(top_builddir)/include/kaffe
 depcomp = $(SHELL) $(top_srcdir)/scripts/depcomp
@@ -83,7 +83,8 @@
 @[EMAIL PROTECTED] = ./$(DEPDIR)/jni-arrays.Plo \
 @AMDEP_TRUE@   ./$(DEPDIR)/jni-base.Plo \
 @AMDEP_TRUE@   ./$(DEPDIR)/jni-callmethod.Plo \
[EMAIL PROTECTED]@      ./$(DEPDIR)/jni-fields.Plo ./$(DEPDIR)/jni.Plo
[EMAIL PROTECTED]@      ./$(DEPDIR)/jni-fields.Plo \
[EMAIL PROTECTED]@      ./$(DEPDIR)/jni-native.Plo ./$(DEPDIR)/jni.Plo
 COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \
        $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS)
 LTCOMPILE = $(LIBTOOL) --mode=compile $(CC) $(DEFS) \
@@ -362,12 +363,14 @@
        jni-base.c \
        jni-callmethod.c \
        jni-fields.c \
-       jni-arrays.c
+       jni-arrays.c \
+       jni-native.c
 
 noinst_HEADERS = \
        jni_i.h \
        jnirefs.h \
-       jni_funcs.h
+       jni_funcs.h \
+       jni_native.h
 
 all: all-am
 
@@ -424,6 +427,7 @@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
[EMAIL PROTECTED]@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 
 .c.o:
Index: kaffe/kaffe/kaffevm/jni/jni-arrays.c
diff -u kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.1 
kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.2
--- kaffe/kaffe/kaffevm/jni/jni-arrays.c:1.1    Fri Jun 25 16:04:35 2004
+++ kaffe/kaffe/kaffevm/jni/jni-arrays.c        Sat Jun 26 05:57:45 2004
@@ -20,6 +20,7 @@
 #include "Arrays.h"
 #include "jnirefs.h"
 #include "exception.h"
+#include "object.h"
 
 jobject
 KaffeJNI_GetObjectArrayElement(JNIEnv* env UNUSED, jobjectArray arr, jsize elem)
@@ -55,7 +56,7 @@
 KaffeJNI_NewObjectArray(JNIEnv* env UNUSED, jsize len, jclass cls, jobject init)
 {
        HArrayOfObject* obj;
-       int i;
+       unsigned int i;
 
        BEGIN_EXCEPTION_HANDLING(0);
 
===================================================================
Checking out kaffe/kaffe/kaffevm/jni/jni-native.c
RCS:  /home/cvs/kaffe/kaffe/kaffe/kaffevm/jni/jni-native.c,v
VERS: 1.1
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/jni/jni-native.c        Sat Jun 26 07:02:30 2004
@@ -0,0 +1,597 @@
+/*
+ * jni_native.c
+ * Java Native Interface - Handles native JNI call wrapping.
+ *
+ * Copyright (c) 2004
+ *      The Kaffe.org's developers. See ChangeLog for details.
+ *
+ * See the file "license.terms" for information on usage and redistribution 
+ * of this file. 
+ */
+
+#include "config.h"
+#include "config-std.h"
+#include "jtypes.h"
+#include "jni_i.h"
+#include "jnirefs.h"
+#include "threadData.h"
+#include "classMethod.h"
+#include "jni_native.h"
+#include "locks.h"
+#include "native.h"
+#include "external.h"
+#if defined(TRANSLATOR)
+#include "machine.h"
+#include "slots.h"
+#include "seq.h"
+#include "constpool.h"
+#include "registers.h"
+#include "labels.h"
+#include "codeproto.h"
+#include "basecode.h"
+#include "icode.h"
+#include "machine.h"
+#if defined(KAFFE_FEEDBACK)
+#include "feedback.h"
+#endif
+#endif
+
+static void
+strcatJNI(char* to, const char* from)
+{
+       char* ptr;
+
+       ptr = &to[strlen(to)];
+       for (; *from != 0; from++) {
+               switch (*from) {
+               case '(':
+                       /* Ignore */
+                       break;
+               case ')':
+                       /* Terminate here */
+                       goto end;
+               case '_':
+                       *ptr++ = '_';
+                       *ptr++ = '1';
+                       break;
+               case ';':
+                       *ptr++ = '_';
+                       *ptr++ = '2';
+                       break;
+               case '[':
+                       *ptr++ = '_';
+                       *ptr++ = '3';
+                       break;
+               case '/':
+                       *ptr++ = '_';
+                       break;
+               default:
+                       *ptr++ = *from;
+                       break;
+               }
+       }
+
+       end:;
+       *ptr = 0;
+}
+
+#if defined(NEED_JNIREFS)
+static void
+addJNIref(jref obj)
+{
+       jnirefs* table;
+       int idx;
+
+       table = THREAD_DATA()->jnireferences;
+
+       if (table->used == JNIREFS) {
+               abort();        /* FIX ME */
+       }
+
+       idx = table->next;
+       for (;;) {
+               if (table->objects[idx] == 0) {
+                       table->objects[idx] = obj;
+                       table->used++;
+                       table->next = (idx + 1) % JNIREFS;
+                       return;
+               }
+               idx = (idx + 1) % JNIREFS;
+       }
+}
+
+static void
+removeJNIref(jref obj)
+{
+       int idx;
+       jnirefs* table;
+
+       table = THREAD_DATA()->jnireferences;
+
+       for (idx = 0; idx < JNIREFS; idx++) {
+               if (table->objects[idx] == obj) {
+                       table->objects[idx] = 0;
+                       table->used--;
+                       return;
+               }
+       }
+}
+#endif /* NEED_JNIREFS */
+
+#if defined(TRANSLATOR)
+
+static void*
+startJNIcall(void)
+{
+       threadData      *thread_data = THREAD_DATA();
+#if defined(NEED_JNIREFS)
+       jnirefs* table;
+
+       table = gc_malloc(sizeof(jnirefs), &gcNormal);
+       table->prev = thread_data->jnireferences;
+       thread_data->jnireferences = table;
+#endif
+       /* No pending exception when we enter JNI routine */
+       thread_data->exceptObj = 0;
+       return( &thread_data->jniEnv ); 
+}
+
+static void
+finishJNIcall(void)
+{
+       jref eobj;
+       threadData      *thread_data = THREAD_DATA();
+
+#if defined(NEED_JNIREFS)
+       {
+               jnirefs* table;
+
+               table = thread_data->jnireferences;
+               thread_data->jnireferences = table->prev;
+       }
+#endif
+       /* If we have a pending exception, throw it */
+       eobj = thread_data->exceptObj;
+       if (eobj != 0) {
+               thread_data->exceptObj = 0;
+               throwExternalException(eobj);
+       }
+}
+
+/*
+ * Wrap up a native function in a calling wrapper, with JNI or KNI.
+ */
+static void
+Kaffe_wrapper(Method* xmeth, void* func, bool use_JNI)
+{
+       errorInfo info;
+       int count;
+       nativeCodeInfo ncode;
+       SlotInfo* tmp = 0;
+       bool success = true;
+       int j;
+       int an;
+       int iLockRoot;
+
+       isStatic = METHOD_IS_STATIC(xmeth) ? 1 : 0;
+       count = sizeofSigMethod(xmeth, false);
+       count += 1 - isStatic;
+
+#if defined(KAFFE_FEEDBACK)
+       if( kaffe_feedback_file )
+               lockMutex(kaffe_feedback_file);
+#endif
+       /* Construct a wrapper to call the JNI method with the correct
+        * arguments.
+        */
+       enterTranslator();
+
+#if defined(KAFFE_PROFILER)
+       if (profFlag) {
+               profiler_get_clicks(xmeth->jitClicks);
+               xmeth->callsCount = 0;
+               xmeth->totalClicks = 0;
+               xmeth->totalChildrenClicks = 0;
+       }
+#endif
+       globalMethod = xmeth;
+
+       maxArgs = maxLocal = count; /* make sure args are spilled if needed */
+       maxStack = 0;
+       success = initInsnSequence(xmeth, 0, maxLocal, maxStack, &info);
+       if (!success) {
+               goto done;
+       }
+
+       start_basic_block();
+       prologue(xmeth);
+
+       if (use_JNI) {
+               /* Start a JNI call */
+               slot_alloctmp(tmp);
+               begin_func_sync();
+               call_soft(startJNIcall);
+               end_func_sync();
+               return_ref(tmp);
+
+#if defined(NEED_JNIREFS)
+               {
+                       int j;
+                       int jcount;
+
+                       /* Make the necesary JNI ref calls first */
+                       if (!METHOD_IS_STATIC(xmeth)) {
+                               pusharg_ref(local(0), 0);
+                               end_sub_block();
+                               call_soft(addJNIref);
+                               popargs();
+                       }
+                       j = METHOD_NARGS(xmeth);
+                       jcount = count;
+                       while (j > 0) {
+                               j--;
+                               jcount -= sizeofSigChar(*METHOD_ARG_TYPE(xmeth, j));
+                               switch (*METHOD_ARG_TYPE(xmeth, j)) {
+                               case 'L':
+                               case '[':
+                                       pusharg_ref(local(jcount), 0);
+                                       end_sub_block();
+                                       call_soft(addJNIref);
+                                       popargs();
+                               }
+                       }
+                       start_sub_block();
+               }
+#endif
+       }
+
+       /* Add synchronisation if necessary */
+       if (xmeth->accflags & ACC_SYNCHRONISED) {
+               mon_enter(xmeth, local(0));
+       }
+
+#if defined(PUSHARG_FORWARDS)
+
+       if (use_JNI) {
+               /* Push the JNI info */
+               pusharg_ref(tmp, 0);
+
+               /* If static, push the class, else push the object */
+               if (METHOD_IS_STATIC(xmeth)) {
+                       pusharg_ref_const(xmeth->class, 1);
+                       an = 0;
+               }
+               else {
+                       pusharg_ref(local(0), 1);
+                       an = 1;
+               }
+               count = 2;
+       }
+       else {
+               /* If static, nothing, else push the object */
+               if (!METHOD_IS_STATIC(xmeth)) {
+                       pusharg_ref(local(0), 0);
+                       an = 1;
+               }
+               else {
+                       an = 0;
+               }
+               count = an;
+       }
+
+       /* Push the specified arguments */
+       for (j = 0; j < METHOD_NARGS(xmeth); j++) {
+               switch (*METHOD_ARG_TYPE(xmeth, j)) {
+               case 'L':
+               case '[':
+                       pusharg_ref(local(an), count);
+                       break;
+               case 'I':
+               case 'Z':
+               case 'S':
+               case 'B':
+               case 'C':
+                       pusharg_int(local(an), count);
+                       break;
+               case 'F':
+                       pusharg_float(local(an), count);
+                       break;
+               case 'J':
+                       pusharg_long(local(an), count);
+                       count += pusharg_long_idx_inc - 1;
+                       an++;
+                       break;
+               case 'D':
+                       pusharg_double(local(an), count);
+                       count += pusharg_long_idx_inc - 1;
+                       an++;
+                       break;
+               }
+               count++;
+               an++;
+       }
+
+#else
+       /* TODO: Deal with 64bits where J and D use only one slot.  */
+       /* Push the specified arguments */
+       count = maxArgs;
+       if (use_JNI) {
+               count++;
+               if (isStatic) {
+                       count++;
+               }
+       }
+       an = maxArgs;
+
+       for (j = METHOD_NARGS(xmeth); --j >= 0; ) {
+               count--;
+               an--;
+               switch (*METHOD_ARG_TYPE(xmeth, j)) {
+               case 'L':
+               case '[':
+                       pusharg_ref(local(an), count);
+                       break;
+               case 'I':
+               case 'Z':
+               case 'S':
+               case 'B':
+               case 'C':
+                       pusharg_int(local(an), count);
+                       break;
+               case 'F':
+                       pusharg_float(local(an), count);
+                       break;
+               case 'J':
+                       count--;
+                       an--;
+                       pusharg_long(local(an), count);
+                       break;
+               case 'D':
+                       count--;
+                       an--;
+                       pusharg_double(local(an), count);
+                       break;
+               }
+       }
+
+       if (use_JNI) {
+               /* If static, push the class, else push the object */
+               if (METHOD_IS_STATIC(xmeth)) {
+                       pusharg_ref_const(xmeth->class, 1);
+               }
+               else {
+                       pusharg_ref(local(0), 1);
+               }
+
+               /* Push the JNI info */
+               pusharg_ref(tmp, 0);
+       }
+       else {
+               /* If static, nothing, else push the object */
+               if (!METHOD_IS_STATIC(xmeth)) {
+                       pusharg_ref(local(0), 0);
+               }
+       }
+
+#endif
+
+       /* Make the call */
+       end_sub_block();
+       call_soft(func);
+       popargs();
+
+       if (use_JNI) {
+               slot_freetmp(tmp);
+       }
+       
+       start_sub_block();
+
+       /* Determine return type */
+       switch (*METHOD_RET_TYPE(xmeth)) {
+       case 'L':
+       case '[':
+               slot_alloctmp(tmp);
+               return_ref(tmp);
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI) {
+                       end_sub_block();
+                       call_soft(finishJNIcall);
+                       start_sub_block();
+               }
+               returnarg_ref(tmp);
+               break;
+       case 'I':
+       case 'Z':
+       case 'S':
+       case 'B':
+       case 'C':
+               slot_alloctmp(tmp);
+               return_int(tmp);
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI) {
+                       end_sub_block();
+                       call_soft(finishJNIcall);
+                       start_sub_block();
+               }
+               returnarg_int(tmp);
+               break;
+       case 'F':
+               slot_alloctmp(tmp);
+               return_float(tmp);
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI) {
+                       end_sub_block();
+                       call_soft(finishJNIcall);
+                       start_sub_block();
+               }
+               returnarg_float(tmp);
+               break;
+       case 'J':
+               slot_alloc2tmp(tmp);
+               return_long(tmp);
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI) {
+                       end_sub_block();
+                       call_soft(finishJNIcall);
+                       start_sub_block();
+               }
+               returnarg_long(tmp);
+               break;
+       case 'D':
+               slot_alloc2tmp(tmp);
+               return_double(tmp);
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI) {
+                       end_sub_block();
+                       call_soft(finishJNIcall);
+                       start_sub_block();
+               }
+               returnarg_double(tmp);
+               break;
+       case 'V':
+               /* Remove synchronisation if necessary */
+               if (xmeth->accflags & ACC_SYNCHRONISED) {
+                       mon_exit(xmeth, local(0));
+               }
+               if (use_JNI)
+                       call_soft(finishJNIcall);
+#if defined(ENABLE_JVMPI)
+               softcall_exit_method(globalMethod);
+#endif
+               ret();
+               break;
+       }
+
+       end_function();
+
+       /* Generate the code */
+       if (tmpslot > maxTemp) {
+               maxTemp = tmpslot;
+       }
+       /* The codeinfo argument is only used in linkLabel, and it is 
+        * only needed if we have labels referring to bytecode.  This is
+        * not the case here.
+        */
+       success = finishInsnSequence(0, &ncode, &info);
+       if (!success) {
+               goto done;
+       }
+
+       assert(xmeth->exception_table == 0);
+       installMethodCode(0, xmeth, &ncode);
+
+       if (use_JNI)
+               xmeth->accflags |= ACC_JNI;
+
+done:
+#if defined(TRANSLATOR) && defined(JIT3)
+       resetConstants();
+#endif
+       resetLabels();
+
+#if defined(KAFFE_PROFILER)
+       if (profFlag) {
+               profiler_click_t end;
+
+               profiler_get_clicks(end);
+               xmeth->jitClicks = end - xmeth->jitClicks;
+       }
+#endif
+       globalMethod = 0;
+
+       leaveTranslator();
+#if defined(KAFFE_FEEDBACK)
+       if( kaffe_feedback_file )
+               unlockMutex(kaffe_feedback_file);
+#endif
+       if (!success) {
+               throwError(&info);
+       }
+}
+
+void
+KaffeVM_JNI_wrapper(Method* xmeth, void* func)
+{
+       Kaffe_wrapper(xmeth, func, true);
+}
+
+void
+KaffeVM_KNI_wrapper(Method* xmeth, void* func)
+{
+       /* to build stackStace, we must be able to lookup this native
+          method.  So always create a wrapper.  */
+       Kaffe_wrapper(xmeth, func, false);
+}
+#endif
+#if defined(INTERPRETER)
+/*
+ * Wrap up a native function in a calling wrapper.  The interpreter
+ * lets the callMethod[AV] macros functions handle the JNI specifics.
+ */
+void
+KaffeVM_JNI_wrapper(Method* xmeth, void* func)
+{
+       SET_METHOD_NATIVECODE(xmeth, func);
+       xmeth->accflags |= ACC_JNI;
+}
+
+void
+KaffeVM_KNI_wrapper(Method* xmeth, void* func)
+{
+       SET_METHOD_NATIVECODE(xmeth, func);
+}
+#endif /* INTERPRETER */
+
+
+/*
+ * Look up a native function using the JNI interface system.
+ */
+jint
+KaffeVM_JNI_native(Method* meth)
+{
+       char name[1024];
+       void* func;
+
+       /* Build the simple JNI name for the method */
+#if defined(NO_SHARED_LIBRARIES)
+        strcpy(name, "Java_");
+#elif defined(HAVE_DYN_UNDERSCORE)
+       strcpy(name, "_Java_");
+#else
+       strcpy(name, "Java_");
+#endif
+       strcatJNI(name, meth->class->name->data);
+       strcat(name, "_");
+       strcatJNI(name, meth->name->data);
+
+       func = loadNativeLibrarySym(name);
+       if (func == NULL) {
+               /* Try the long signatures */
+               strcat(name, "__");
+               strcatJNI(name, METHOD_SIGD(meth));
+               func = loadNativeLibrarySym(name);
+               if (func == 0) {
+                       return (JNI_FALSE);
+               }
+       }
+
+       /* Wrap the function in a calling wrapper */
+       KaffeVM_JNI_wrapper(meth, func);
+
+       return (JNI_TRUE);
+}
Index: kaffe/kaffe/kaffevm/jni/jni.c
diff -u kaffe/kaffe/kaffevm/jni/jni.c:1.3 kaffe/kaffe/kaffevm/jni/jni.c:1.4
--- kaffe/kaffe/kaffevm/jni/jni.c:1.3   Fri Jun 25 16:04:35 2004
+++ kaffe/kaffe/kaffevm/jni/jni.c       Sat Jun 26 05:57:45 2004
@@ -43,13 +43,11 @@
 #include "basecode.h"
 #include "icode.h"
 #include "machine.h"
-#if defined(KAFFE_FEEDBACK)
-#include "feedback.h"
-#endif
 #endif
 #include "jvmpi_kaffe.h"
 #include "jni_i.h"
 #include "jni_funcs.h"
+#include "jni_native.h"
 
 extern int Kaffe_Java_Major_Version;
 extern int Kaffe_Java_Minor_Version;
@@ -57,13 +55,6 @@
 extern JavaVMInitArgs Kaffe_JavaVMInitArgs;
 extern JavaVM Kaffe_JavaVM;
 
-static void Kaffe_JNI_wrapper(Method*, void*);
-#if defined(TRANSLATOR)
-static void *startJNIcall(void);
-static void finishJNIcall(void);
-static void Kaffe_wrapper(Method* xmeth, void* func, bool use_JNI);
-#endif
-
 static jint Kaffe_GetVersion(JNIEnv*);
 static jclass Kaffe_FindClass(JNIEnv*, const char*);
 static jint Kaffe_ThrowNew(JNIEnv*, jclass, const char*);
@@ -806,7 +797,7 @@
                        if (strcmp(meth[i].name->data, methodArray[j].name) == 0 &&
                            strcmp(METHOD_SIGD(&meth[i]), methodArray[j].signature) == 
0 &&
                            (meth[i].accflags & ACC_NATIVE) != 0) {
-                               Kaffe_JNI_wrapper(&meth[i], methodArray[j].fnPtr); 
+                               KaffeVM_JNI_wrapper(&meth[i], methodArray[j].fnPtr); 
                                goto found;
                        }
                }
@@ -934,566 +925,6 @@
        default:
                return (JNI_EVERSION);
        }
-}
-
-static void
-strcatJNI(char* to, const char* from)
-{
-       char* ptr;
-
-       ptr = &to[strlen(to)];
-       for (; *from != 0; from++) {
-               switch (*from) {
-               case '(':
-                       /* Ignore */
-                       break;
-               case ')':
-                       /* Terminate here */
-                       goto end;
-               case '_':
-                       *ptr++ = '_';
-                       *ptr++ = '1';
-                       break;
-               case ';':
-                       *ptr++ = '_';
-                       *ptr++ = '2';
-                       break;
-               case '[':
-                       *ptr++ = '_';
-                       *ptr++ = '3';
-                       break;
-               case '/':
-                       *ptr++ = '_';
-                       break;
-               default:
-                       *ptr++ = *from;
-                       break;
-               }
-       }
-
-       end:;
-       *ptr = 0;
-}
-
-#if defined(TRANSLATOR)
-/*
- * Wrap up a native function in a calling wrapper, with JNI or KNI.
- */
-static void
-Kaffe_wrapper(Method* xmeth, void* func, bool use_JNI)
-{
-       errorInfo info;
-       int count;
-       nativeCodeInfo ncode;
-       SlotInfo* tmp = 0;
-       bool success = true;
-       int j;
-       int an;
-       int iLockRoot;
-
-       isStatic = METHOD_IS_STATIC(xmeth) ? 1 : 0;
-       count = sizeofSigMethod(xmeth, false);
-       count += 1 - isStatic;
-
-#if defined(KAFFE_FEEDBACK)
-       if( kaffe_feedback_file )
-               lockMutex(kaffe_feedback_file);
-#endif
-       /* Construct a wrapper to call the JNI method with the correct
-        * arguments.
-        */
-       enterTranslator();
-
-#if defined(KAFFE_PROFILER)
-       if (profFlag) {
-               profiler_get_clicks(xmeth->jitClicks);
-               xmeth->callsCount = 0;
-               xmeth->totalClicks = 0;
-               xmeth->totalChildrenClicks = 0;
-       }
-#endif
-       globalMethod = xmeth;
-
-       maxArgs = maxLocal = count; /* make sure args are spilled if needed */
-       maxStack = 0;
-       success = initInsnSequence(xmeth, 0, maxLocal, maxStack, &info);
-       if (!success) {
-               goto done;
-       }
-
-       start_basic_block();
-       prologue(xmeth);
-
-       if (use_JNI) {
-               /* Start a JNI call */
-               slot_alloctmp(tmp);
-               begin_func_sync();
-               call_soft(startJNIcall);
-               end_func_sync();
-               return_ref(tmp);
-
-#if defined(NEED_JNIREFS)
-               {
-                       int j;
-                       int jcount;
-
-                       /* Make the necesary JNI ref calls first */
-                       if (!METHOD_IS_STATIC(xmeth)) {
-                               pusharg_ref(local(0), 0);
-                               end_sub_block();
-                               call_soft(addJNIref);
-                               popargs();
-                       }
-                       j = METHOD_NARGS(xmeth);
-                       jcount = count;
-                       while (j > 0) {
-                               j--;
-                               jcount -= sizeofSigChar(*METHOD_ARG_TYPE(xmeth, j));
-                               switch (*METHOD_ARG_TYPE(xmeth, j)) {
-                               case 'L':
-                               case '[':
-                                       pusharg_ref(local(jcount), 0);
-                                       end_sub_block();
-                                       call_soft(addJNIref);
-                                       popargs();
-                               }
-                       }
-                       start_sub_block();
-               }
-#endif
-       }
-
-       /* Add synchronisation if necessary */
-       if (xmeth->accflags & ACC_SYNCHRONISED) {
-               mon_enter(xmeth, local(0));
-       }
-
-#if defined(PUSHARG_FORWARDS)
-
-       if (use_JNI) {
-               /* Push the JNI info */
-               pusharg_ref(tmp, 0);
-
-               /* If static, push the class, else push the object */
-               if (METHOD_IS_STATIC(xmeth)) {
-                       pusharg_ref_const(xmeth->class, 1);
-                       an = 0;
-               }
-               else {
-                       pusharg_ref(local(0), 1);
-                       an = 1;
-               }
-               count = 2;
-       }
-       else {
-               /* If static, nothing, else push the object */
-               if (!METHOD_IS_STATIC(xmeth)) {
-                       pusharg_ref(local(0), 0);
-                       an = 1;
-               }
-               else {
-                       an = 0;
-               }
-               count = an;
-       }
-
-       /* Push the specified arguments */
-       for (j = 0; j < METHOD_NARGS(xmeth); j++) {
-               switch (*METHOD_ARG_TYPE(xmeth, j)) {
-               case 'L':
-               case '[':
-                       pusharg_ref(local(an), count);
-                       break;
-               case 'I':
-               case 'Z':
-               case 'S':
-               case 'B':
-               case 'C':
-                       pusharg_int(local(an), count);
-                       break;
-               case 'F':
-                       pusharg_float(local(an), count);
-                       break;
-               case 'J':
-                       pusharg_long(local(an), count);
-                       count += pusharg_long_idx_inc - 1;
-                       an++;
-                       break;
-               case 'D':
-                       pusharg_double(local(an), count);
-                       count += pusharg_long_idx_inc - 1;
-                       an++;
-                       break;
-               }
-               count++;
-               an++;
-       }
-
-#else
-       /* TODO: Deal with 64bits where J and D use only one slot.  */
-       /* Push the specified arguments */
-       count = maxArgs;
-       if (use_JNI) {
-               count++;
-               if (isStatic) {
-                       count++;
-               }
-       }
-       an = maxArgs;
-
-       for (j = METHOD_NARGS(xmeth); --j >= 0; ) {
-               count--;
-               an--;

*** Patch too long, truncated ***

_______________________________________________
kaffe mailing list
[EMAIL PROTECTED]
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe

Reply via email to