Re: [kaffe] CVS kaffe (hkraemer): fix for Kaffe_FindClass

2005-06-04 Thread Ito Kazumitsu
From: Kaffe CVS <[EMAIL PROTECTED]>
Subject: [kaffe] CVS kaffe (hkraemer): fix for Kaffe_FindClass
Date: Sat, 04 Jun 2005 14:03:26 -0700

> +2005-06-04  Helmer Kraemer  <[EMAIL PROTECTED]>
> +
> + * kaffe/kaffevm/jni/jni.c (Kaffe_FindClass): fixed so it works correctly
> + for native methods of system classes.
> +

Thanks. The problem "gnu.java.nio.charset.iconv.IconvCharset cannot be used"
has been solved now.

___
kaffe mailing list
kaffe@kaffe.org
http://kaffe.org/cgi-bin/mailman/listinfo/kaffe


[kaffe] CVS kaffe (hkraemer): fix for Kaffe_FindClass

2005-06-04 Thread Kaffe CVS
PatchSet 6608 
Date: 2005/06/04 20:58:29
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
fix for Kaffe_FindClass

Members: 
ChangeLog:1.4134->1.4135 
kaffe/kaffevm/jni/jni.c:1.31->1.32 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.4134 kaffe/ChangeLog:1.4135
--- kaffe/ChangeLog:1.4134  Thu Jun  2 17:35:47 2005
+++ kaffe/ChangeLog Sat Jun  4 20:58:29 2005
@@ -1,3 +1,8 @@
+2005-06-04  Helmer Kraemer  <[EMAIL PROTECTED]>
+
+   * kaffe/kaffevm/jni/jni.c (Kaffe_FindClass): fixed so it works correctly
+   for native methods of system classes.
+
 2005-06-02  Guilhem Lavaux  <[EMAIL PROTECTED]>
 
* kaffe/kaffevm/jni/jni.c
Index: kaffe/kaffe/kaffevm/jni/jni.c
diff -u kaffe/kaffe/kaffevm/jni/jni.c:1.31 kaffe/kaffe/kaffevm/jni/jni.c:1.32
--- kaffe/kaffe/kaffevm/jni/jni.c:1.31  Thu Jun  2 17:35:51 2005
+++ kaffe/kaffe/kaffevm/jni/jni.c   Sat Jun  4 20:58:33 2005
@@ -317,34 +317,56 @@
return (cls);
 }
 
-/*
- * For this routine, we defer most of the work to Class.forName(),
- * which handles the task of figuring out the right ClassLoader to
- * use based on the calling method, which requires examining the
- * stack backtrace.
- */
-
 static jclass
 Kaffe_FindClass(JNIEnv UNUSED *env, const char* name)
 {
stackTraceInfo  *trace;
-   jstring nameString;
Utf8Const* utf8;
-   jvalue retval;
+   Hjava_lang_ClassLoader  *loader;
+   Hjava_lang_Class*clazz;
+   errorInfo   einfo;
int i;
+   char*   pathname;
 
BEGIN_EXCEPTION_HANDLING(NULL);
 
-   /* We accepts slashes, but Class.forName() does not */
-   utf8 = checkPtr(utf8ConstNew(name, -1));
-   nameString = utf8Const2JavaReplace(utf8, '/', '.');
-   utf8ConstRelease(utf8);
-   checkPtr(nameString);
+   /* convert name to the form used inside the vm */
+   pathname = checkPtr(KMALLOC(strlen (name) + 1));
+   classname2pathname (name, pathname);
+
+   /* create a new utf8 constant */
+   utf8 = utf8ConstNew(pathname, -1);
+
+   /* free the internal form of name */
+   KFREE(pathname);
+
+   /* bail out if we could not create the utf8 constant */
+   if (utf8 == NULL)
+   {
+   postOutOfMemory (&einfo);
+   throwError (&einfo);
+   }
 
+   /* Quote from the JNI documentation:
+*
+* "In the Java 2 Platform, FindClass locates the class loader 
associated with the current native method.
+*  If the native code belongs to a system class, no class loader will 
be involved. Otherwise, the proper
+*  class loader will be invoked to load and link the named class. When 
FindClass is called through the
+*  Invocation Interface, there is no current native method or its 
associated class loader. In that case,
+*  the result of ClassLoader.getBaseClassLoader is used."
+*
+* So we ...
+*/
+
+   /* ... get the stacktrace ... */
trace = (stackTraceInfo *)buildStackTrace (NULL);
if (trace == NULL)
-   return NULL;
+   {
+   postOutOfMemory (&einfo);
+   goto error_out;
+   }
 
+   /* ... find the first java method on the stack ... */
for (i=0; trace[i].meth != ENDOFSTACK; i++)
{
if ((trace[i].meth != NULL) &&
@@ -352,27 +374,58 @@
break;
}
 
+   /* ... determine the loader to be used ... */
if (trace[i].meth == ENDOFSTACK) {
-   /* if there are no java methods on the stack, we use the system 
class loader */
+   jvalue retval;
+
do_execute_java_class_method (&retval, "java/lang/ClassLoader",
  NULL,
  "getSystemClassLoader",
  "()Ljava/lang/ClassLoader;");
 
-   do_execute_java_class_method(&retval, "java.lang.Class", NULL,
-"forName", 
"(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;",
-nameString, true, retval.l);
+   loader = (Hjava_lang_ClassLoader *)retval.l;
} else {
-   /* otherwise, we use the first java method on the stack */
-   do_execute_java_class_method(&retval, "java.lang.Class", NULL,
-"forName", 
"(Ljava/lang/String;ZLjava/lang/ClassLoader;)Ljava/lang/Class;",
-nameString, true, 
trace[i].meth->class->loader);
+   loader = trace[i].meth->class->loader;
}
 
-   ADD_REF(retval.l);
+   /* ... and finally call loadArray or loadClass.
+*
+* Why don't we delegate to Class.forName? Our implementation of
+* VMClassLoader.loadClass denies access t