]> gcc.gnu.org Git - gcc.git/commitdiff
java-interp.h (_Jv_JNI_conversion_call): Declare.
authorTom Tromey <tromey@cygnus.com>
Wed, 2 Feb 2000 01:55:03 +0000 (01:55 +0000)
committerTom Tromey <tromey@gcc.gnu.org>
Wed, 2 Feb 2000 01:55:03 +0000 (01:55 +0000)
* include/java-interp.h (_Jv_JNI_conversion_call): Declare.
* resolve.cc (ncode): Use _Jv_JNI_conversion_call when
constructing the closure if the function is native.
* jni.cc (_Jv_JNI_conversion_call): Now returns `void'.  No longer
a template function, #if'd out, or static.
Include <java-interp.h>.

From-SVN: r31746

libjava/ChangeLog
libjava/include/java-interp.h
libjava/include/jvm.h
libjava/jni.cc
libjava/resolve.cc

index b9e61234f08619be121242c1413b5b755b71930a..2723767a0ce1a406f856af69c507294144c8055d 100644 (file)
@@ -1,5 +1,12 @@
 2000-02-01  Tom Tromey  <tromey@cygnus.com>
 
+       * include/java-interp.h (_Jv_JNI_conversion_call): Declare.
+       * resolve.cc (ncode): Use _Jv_JNI_conversion_call when
+       constructing the closure if the function is native.
+       * jni.cc (_Jv_JNI_conversion_call): Now returns `void'.  No longer
+       a template function, #if'd out, or static.
+       Include <java-interp.h>.
+
        * include/jni.h (class _Jv_JNIEnv): Corrected calls using `...'.
 
        * include/jni.h (class _Jv_JNIEnv): Added all C++ inline methods.
index 822545565c218a19feb235694918cae10e22a31a..0feab21762c61373aa89146cdd31f986aa902d31 100644 (file)
@@ -1,6 +1,6 @@
 // java-interp.h - Header file for the bytecode interpreter.  -*- c++ -*-
 
-/* Copyright (C) 1999  Red Hat, Inc.
+/* Copyright (C) 1999, 2000  Red Hat, Inc.
 
    This file is part of libgcj.
 
@@ -121,6 +121,9 @@ class _Jv_InterpMethod {
   friend class gnu::gcj::runtime::MethodInvocation;
 
   friend void _Jv_PrepareClass(jclass);
+
+  // This function is used when making a JNI call from the interpreter.
+  friend void _Jv_JNI_conversion_call (ffi_cif *, void *, ffi_raw *, void *);
 };
 
 class _Jv_InterpMethodInvocation {
index c9eb1b95c808a3c90be05400daa32eae8d6fc5c7..ccf552aaf192d2396a9c3e17a06d1b9343944017 100644 (file)
@@ -204,5 +204,4 @@ extern void _Jv_ThisExecutable (const char *);
 /* Initialize JNI.  */
 extern void _Jv_JNI_Init (void);
 
-
 #endif /* __JAVA_JVM_H__ */
index 1d8ee5560146ea0b89e25abc897869eb2a23a1d8..cb7226150c13495e35931c72016111715c416eef 100644 (file)
@@ -45,6 +45,8 @@ details.  */
 #include <gcj/method.h>
 #include <gcj/field.h>
 
+#include <java-interp.h>
+
 #define ClassClass _CL_Q34java4lang5Class
 extern java::lang::Class ClassClass;
 #define ObjectClass _CL_Q34java4lang6Object
@@ -1204,11 +1206,14 @@ _Jv_JNI_FromReflectedMethod (JNIEnv *, jobject method)
 
 // This function is the stub which is used to turn an ordinary (CNI)
 // method call into a JNI call.
-#if 0
-template<typename T>
-static T
-_Jv_JNI_conversion_call (fixme)
+void
+_Jv_JNI_conversion_call (ffi_cif *cif,
+                        void *ret,
+                        ffi_raw *args,
+                        void *__this)
 {
+  _Jv_InterpMethod* _this = (_Jv_InterpMethod*)__this;
+
   JNIEnv env;
   _Jv_JNI_LocalFrame *frame
     = (_Jv_JNI_LocalFrame *) alloca (sizeof (_Jv_JNI_LocalFrame)
@@ -1216,7 +1221,7 @@ _Jv_JNI_conversion_call (fixme)
 
   env.p = &_Jv_JNIFunctions;
   env.ex = NULL;
-  env.klass = FIXME;
+  env.klass = _this->defining_class;
   env.locals = frame;
 
   frame->marker = true;
@@ -1225,20 +1230,24 @@ _Jv_JNI_conversion_call (fixme)
   for (int i = 0; i < frame->size; ++i)
     frame->vec[i] = NULL;
 
-  T result = FIXME_ffi_call (args);
+  // FIXME: we should mark every reference parameter as a local.  For
+  // now we assume a conservative GC, and we assume that the
+  // references are on the stack somewhere.
+
+  ffi_raw_call (cif,
+               NULL, // FIXME: function pointer.
+               ret,
+               args);
 
   do
     {
-      _Jv_JNI_PopLocalFrame (&env, result);
+      _Jv_JNI_PopLocalFrame (&env, NULL);
     }
   while (env.locals != frame);
 
   if (env.ex)
     JvThrow (env.ex);
-
-  return T;
 }
-#endif
 
 \f
 
index 92d66c2728a6a4b104f44079455b2561165245b2..0bf6f8c580edae9a27a44d730b26d9ca3bad1698 100644 (file)
@@ -1022,7 +1022,13 @@ _Jv_InterpMethod::ncode ()
 
   args_raw_size = ffi_raw_size (&closure->cif);
 
-  if ((self->accflags & Modifier::SYNCHRONIZED) != 0)
+  if ((self->accflags & Modifier::NATIVE) != 0)
+    {
+      // FIXME: for now we assume that all native methods for
+      // interpreted code use JNI.
+      fun = (ffi_closure_fun) &_Jv_JNI_conversion_call;
+    }
+  else if ((self->accflags & Modifier::SYNCHRONIZED) != 0)
     {
       if (staticp)
        fun = (ffi_closure_fun)&_Jv_InterpMethod::run_synch_class;
This page took 0.078037 seconds and 5 git commands to generate.