[kaffe] gnu.java.nio.charset.iconv.IconvCharset cannot be used
Ito Kazumitsu
kaz at maczuka.gcd.org
Fri Jun 3 16:33:39 PDT 2005
Hi,
ChangeLog says:
2005-05-30 Helmer Kraemer <hkraemer at freenet.de>
* libraries/javalib/kaffe/lang/AppClassLoader.java,
libraries/javalib/kaffe/lang/PrimordialClassLoader.java,
libraries/clib/native/PrimordialClassLoader.c: removed. Loading classes is
now handled completely by ClassLoader / VMClassLoader.
...
* libraries/javalib/META-INF/services/java.nio.charset.spi.CharsetProvider:
removed, as iconv is treated specially by java.nio.charset.Charset
The removal of META-INF/... is OK for me because I prefer using my own
CharsetProvider wrapping gnu.java.nio.charset.iconv.IconvProvider.
But the following simple program dumps core. This problem did not occur
when kaffe.lang.*ClassLoader was used.
bash-2.05b$ cat TestCharsetProviderMain.java
import java.nio.charset.*;
import java.nio.charset.spi.*;
public final class TestCharsetProviderMain
{
public static void main(String[] args) throws Exception
{
Class c = Class.forName("gnu.java.nio.charset.iconv.IconvProvider", true,
Thread.currentThread().getContextClassLoader());
System.out.println(c);
System.out.flush();
CharsetProvider p = (CharsetProvider)(c.newInstance());
System.out.println(p);
System.out.flush();
System.out.println(p.charsetForName(args[0]));
}
}
bash-2.05b$ kaffe TestCharsetProviderMain EUC-JP
class gnu.java.nio.charset.iconv.IconvProvider
gnu.java.nio.charset.iconv.IconvProvider at 8408c3c
charsetForName EUC-JP
IconvMetaData gnu.java.nio.charset.iconv.IconvMetaData at 844cebc
trying new IconvCharset(info)
Assertion failed: (cls != NULL), function createRawData, file gnu_java_nio_charset_iconv_IconvEncoder.c, line 192.
Abort trap (core dumped)
Please note that some files are modified for debugging purpose:
--- gnu/java/nio/charset/iconv/IconvProvider.java.orig Sat Apr 23 18:54:27 2005
+++ gnu/java/nio/charset/iconv/IconvProvider.java Fri Jun 3 07:34:02 2005
@@ -62,7 +62,7 @@
}
}
- private IconvProvider()
+ public IconvProvider()
{
IconvMetaData.setup();
}
@@ -88,13 +88,23 @@
{
try
{
+ System.out.println("charsetForName " + charsetName);
+ System.out.flush();
IconvMetaData info = IconvMetaData.get(charsetName);
+ System.out.println("IconvMetaData " + info);
+ System.out.flush();
// Try anyway if the set isn't found.
if (info == null)
info = new IconvMetaData(charsetName, 2.0f, 2.0f, 2.0f, 2.0f,
new String[] { }, charsetName);
- return new IconvCharset(info);
+ System.out.println("trying new IconvCharset(info)");
+ System.out.flush();
+ Charset cs = new IconvCharset(info);
+ System.out.println("new IconvCharset(info) " + cs);
+ System.out.flush();
+ return cs;
+ // return new IconvCharset(info);
}
catch (IllegalArgumentException e)
{
Note: Without changing private IconvProvider() to public IconvProvider(),
an instance of this class cannot be created newInstance().
--- libraries/clib/nio/gnu_java_nio_charset_iconv_IconvEncoder.c.~1.3.~ Fri May 20 23:46:49 2005
+++ libraries/clib/nio/gnu_java_nio_charset_iconv_IconvEncoder.c Sat Jun 4 07:04:23 2005
@@ -79,6 +79,7 @@
if (infid == NULL || outfid == NULL)
{
cls = (*env)->GetObjectClass (env, obj);
+ assert (cls != NULL);
infid = (*env)->GetFieldID (env, cls, "inremaining", "I");
assert (infid != 0);
outfid = (*env)->GetFieldID (env, cls, "outremaining", "I");
@@ -183,10 +184,12 @@
#ifdef POINTERS_ARE_64BIT
cls = (*env)->FindClass (env, "gnu/classpath/RawData64");
+ assert (cls != NULL);
method = (*env)->GetMethodID (env, cls, "<init>", "(J)V");
data = (*env)->NewObject (env, cls, method, (jlong) ptr);
#else
cls = (*env)->FindClass (env, "gnu/classpath/RawData32");
+ assert (cls != NULL);
method = (*env)->GetMethodID (env, cls, "<init>", "(I)V");
data = (*env)->NewObject (env, cls, method, (jint) ptr);
#endif
Note: "assert (cls != NULL)" is also written in lookupClassMethod
in kaffe/kaffevm/support.c. Without inserting "assert (cls != NULL)"
here, the failure will be checked there.
More information about the kaffe
mailing list