[kaffe] CVS kaffe (guilhem): Added JNI references and java.lang.ref
support.
Kaffe CVS
cvs-commits at kaffe.org
Sun Jan 30 04:48:07 PST 2005
PatchSet 5949
Date: 2005/01/30 12:42:34
Author: guilhem
Branch: HEAD
Tag: (none)
Log:
Added JNI references and java.lang.ref support.
* include/Makefile.in,
kaffe/kaffevm/Makefile.in,
libraries/clib/native/Makefile.in,
test/regression/Makefile.in,
libraries/javalib/Makefile.am,
libraries/javalib/Makefile.in: Regenerated.
* include/Makefile.am: Build java_lang_ref_Reference.h.
* include/native.h
(Hjava_lang_Object): Added finalizer_call.
* kaffe/kaffevm/Makefile.am: Added reference.[ch].
* kaffe/kaffevm/locks.c
(slowUnlockMutex): Clear holder if heavylock is static.
* kaffe/kaffevm/baseClasses.c
(javaLangRefReference, javaLangRefSoftReference,
javaLangRefWeakReference, javaLangRefPhantomReference): New static
classes.
(initBaseClasses): Invoke KaffeVM_referenceInit.
* kaffe/kaffevm/baseClasses.h: Likewise.
* kaffe/kaffevm/reference.c, kaffe/kaffevm/reference.h: New files
to handle java references.
* kaffe/kaffevm/classMethod.c
(processClass): Do not use JNI anymore.
(userLoadClass): Set retval to NULL if an exception is raised.
* kaffe/kaffevm/classMethod.h:
(Hjava_lang_Class): New field finalizer_call to handle different
type of object finalizing whether it is referenced or not.
* kaffe/kaffevm/exception.h: Fixed documentation.
* kaffe/kaffevm/gcFuncs.c
(finalizeObject): Invoke finalizer_call for finalization process.
* kaffe/kaffevm/intrp/machine.c:
(virtualMachine) Updated function prefix.
* kaffe/kaffevm/jit/native-wrapper.c:
(startJNIcall) Always handle JNI references now.
(Kaffe_wrapper) Updated function prefix and handle JNI references.
* kaffe/kaffevm/intrp/method-calls.c
(startJNIcall, finishJNIcall): Copied from jit/method-calls.c.
(engine_callMethod): Use startJNIcall and finishJNIcall.
* kaffe/kaffevm/jni/jni-base.c
(JNI_CreateJavaVM): Build a JNI reference table for the invoking
thread.
* kaffe/kaffevm/jni/jni-callmethod.c: Updated function prefix.
* kaffe/kaffevm/jni.c
(KaffeJNI_addJNIref, KaffeJNI_removeJNIref): Fixed and activated
JNI references counting.
* kaffe/kaffevm/jni/jni_i.h: Externalized addJNIref and
removeJNIref.
* kaffe/kaffevm/jni/jnirefs.h: Updated to handle multiple frames
by thread.
* kaffe/kaffevm/kaffe-gc/gc-refs.c: Protected the access to the
weaek and strong reference lists.
* kaffe/kaffevm/object.c:
(newObjectChecked, newClass, newArrayChecked): Set the finalizer type
to the newly created object.
* kaffe/kaffevm/support.c,
kaffe/kaffevm/support.h
(KaffeVM_safeCallMethodA, KaffeVM_safeCallMethodV): New functions.
(KaffeVM_callMethodA, KaffeVM_callMethodV): Renamed.
* kaffe/kaffevm/thread.c
(linkNativeAndJavaThread): Initialize jnireferences.
* kaffe/kaffevm/threadData.h
(jnireferences): New field.
* kaffe/kaffevm/utf8const.c
(utfLockRoot): Initialize it to NULL.
* libraries/clib/native/Makefile.am: Added new file
java_lang_ref_Reference.c.
* libraries/clib/native/java_lang_ref_Reference.c:
New file.
* libraries/javalib/bootstrap.classlist: Updated.
* libraries/javalib/java/lang/ref/PhantomReference.java,
libraries/javalib/java/lang/ref/Reference.java,
libraries/javalib/java/lang/ref/ReferenceQueue.java,
libraries/javalib/java/lang/ref/SoftReference.java,
libraries/javalib/java/lang/ref/WeakReference.java:
Imported from GNU Classpath.
* test/regression/Makefile.am: Added new regression test RefTest.
* test/regression/RefTest.java: New test.
Members:
ChangeLog:1.3488->1.3489
include/Makefile.am:1.87->1.88
include/Makefile.in:1.209->1.210
include/native.h:1.17->1.18
kaffe/kaffevm/Makefile.am:1.69->1.70
kaffe/kaffevm/Makefile.in:1.186->1.187
kaffe/kaffevm/baseClasses.c:1.57->1.58
kaffe/kaffevm/baseClasses.h:1.18->1.19
kaffe/kaffevm/classMethod.c:1.131->1.132
kaffe/kaffevm/classMethod.h:1.75->1.76
kaffe/kaffevm/exception.h:1.28->1.29
kaffe/kaffevm/gcFuncs.c:1.63->1.64
kaffe/kaffevm/ksem.c:1.10->1.11
kaffe/kaffevm/locks.c:1.54->1.55
kaffe/kaffevm/object.c:1.31->1.32
kaffe/kaffevm/reference.c:INITIAL->1.1
kaffe/kaffevm/reference.h:INITIAL->1.1
kaffe/kaffevm/support.c:1.80->1.81
kaffe/kaffevm/support.h:1.37->1.38
kaffe/kaffevm/thread.c:1.90->1.91
kaffe/kaffevm/threadData.h:1.5->1.6
kaffe/kaffevm/utf8const.c:1.44->1.45
kaffe/kaffevm/intrp/machine.c:1.44->1.45
kaffe/kaffevm/intrp/methodcalls.c:1.5->1.6
kaffe/kaffevm/jit/native-wrapper.c:1.6->1.7
kaffe/kaffevm/jni/jni-base.c:1.11->1.12
kaffe/kaffevm/jni/jni-callmethod.c:1.5->1.6
kaffe/kaffevm/jni/jni.c:1.15->1.16
kaffe/kaffevm/jni/jni_i.h:1.5->1.6
kaffe/kaffevm/jni/jnirefs.h:1.1->1.2
kaffe/kaffevm/kaffe-gc/gc-incremental.c:1.17->1.18
kaffe/kaffevm/kaffe-gc/gc-refs.c:1.10->1.11
kaffe/kaffevm/systems/unix-pthreads/lock-impl.c:1.16->1.17
kaffe/kaffevm/systems/unix-pthreads/thread-internal.h:1.31->1.32
libraries/clib/native/Makefile.am:1.38->1.39
libraries/clib/native/Makefile.in:1.168->1.169
libraries/clib/native/java_lang_ref_Reference.c:INITIAL->1.1
libraries/javalib/bootstrap.classlist:1.69->1.70
libraries/javalib/java/lang/ref/PhantomReference.java:1.2->1.3
libraries/javalib/java/lang/ref/Reference.java:1.4->1.5
libraries/javalib/java/lang/ref/ReferenceQueue.java:1.3->1.4
libraries/javalib/java/lang/ref/SoftReference.java:1.2->1.3
libraries/javalib/java/lang/ref/WeakReference.java:1.2->1.3
test/internal/jitBasic.c:1.5->1.6
test/regression/Makefile.am:1.91->1.92
test/regression/Makefile.in:1.200->1.201
test/regression/RefTest.java:INITIAL->1.1
Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3488 kaffe/ChangeLog:1.3489
--- kaffe/ChangeLog:1.3488 Sun Jan 30 12:31:03 2005
+++ kaffe/ChangeLog Sun Jan 30 12:42:34 2005
@@ -1,3 +1,113 @@
+2005-01-23 Guilhem Lavaux <guilhem at kaffe.org>
+
+ * include/Makefile.in,
+ kaffe/kaffevm/Makefile.in,
+ libraries/clib/native/Makefile.in,
+ test/regression/Makefile.in,
+ libraries/javalib/Makefile.am,
+ libraries/javalib/Makefile.in: Regenerated.
+
+ * include/Makefile.am: Build java_lang_ref_Reference.h.
+
+ * include/native.h
+ (Hjava_lang_Object): Added finalizer_call.
+
+ * kaffe/kaffevm/Makefile.am: Added reference.[ch].
+
+ * kaffe/kaffevm/locks.c
+ (slowUnlockMutex): Clear holder if heavylock is static.
+
+ * kaffe/kaffevm/baseClasses.c
+ (javaLangRefReference, javaLangRefSoftReference,
+ javaLangRefWeakReference, javaLangRefPhantomReference): New static
+ classes.
+ (initBaseClasses): Invoke KaffeVM_referenceInit.
+
+ * kaffe/kaffevm/baseClasses.h: Likewise.
+
+ * kaffe/kaffevm/reference.c, kaffe/kaffevm/reference.h: New files
+ to handle java references.
+
+ * kaffe/kaffevm/classMethod.c
+ (processClass): Do not use JNI anymore.
+ (userLoadClass): Set retval to NULL if an exception is raised.
+
+ * kaffe/kaffevm/classMethod.h:
+ (Hjava_lang_Class): New field finalizer_call to handle different
+ type of object finalizing whether it is referenced or not.
+
+ * kaffe/kaffevm/exception.h: Fixed documentation.
+
+ * kaffe/kaffevm/gcFuncs.c
+ (finalizeObject): Invoke finalizer_call for finalization process.
+
+ * kaffe/kaffevm/intrp/machine.c:
+ (virtualMachine) Updated function prefix.
+
+ * kaffe/kaffevm/jit/native-wrapper.c:
+ (startJNIcall) Always handle JNI references now.
+ (Kaffe_wrapper) Updated function prefix and handle JNI references.
+
+ * kaffe/kaffevm/intrp/method-calls.c
+ (startJNIcall, finishJNIcall): Copied from jit/method-calls.c.
+ (engine_callMethod): Use startJNIcall and finishJNIcall.
+
+ * kaffe/kaffevm/jni/jni-base.c
+ (JNI_CreateJavaVM): Build a JNI reference table for the invoking
+ thread.
+
+ * kaffe/kaffevm/jni/jni-callmethod.c: Updated function prefix.
+
+ * kaffe/kaffevm/jni.c
+ (KaffeJNI_addJNIref, KaffeJNI_removeJNIref): Fixed and activated
+ JNI references counting.
+
+ * kaffe/kaffevm/jni/jni_i.h: Externalized addJNIref and
+ removeJNIref.
+
+ * kaffe/kaffevm/jni/jnirefs.h: Updated to handle multiple frames
+ by thread.
+
+ * kaffe/kaffevm/kaffe-gc/gc-refs.c: Protected the access to the
+ weaek and strong reference lists.
+
+ * kaffe/kaffevm/object.c:
+ (newObjectChecked, newClass, newArrayChecked): Set the finalizer type
+ to the newly created object.
+
+ * kaffe/kaffevm/support.c,
+ kaffe/kaffevm/support.h
+ (KaffeVM_safeCallMethodA, KaffeVM_safeCallMethodV): New functions.
+ (KaffeVM_callMethodA, KaffeVM_callMethodV): Renamed.
+
+ * kaffe/kaffevm/thread.c
+ (linkNativeAndJavaThread): Initialize jnireferences.
+
+ * kaffe/kaffevm/threadData.h
+ (jnireferences): New field.
+
+ * kaffe/kaffevm/utf8const.c
+ (utfLockRoot): Initialize it to NULL.
+
+ * libraries/clib/native/Makefile.am: Added new file
+ java_lang_ref_Reference.c.
+
+ * libraries/clib/native/java_lang_ref_Reference.c:
+ New file.
+
+ * libraries/javalib/bootstrap.classlist: Updated.
+
+ * libraries/javalib/java/lang/ref/PhantomReference.java,
+ libraries/javalib/java/lang/ref/Reference.java,
+ libraries/javalib/java/lang/ref/ReferenceQueue.java,
+ libraries/javalib/java/lang/ref/SoftReference.java,
+ libraries/javalib/java/lang/ref/WeakReference.java:
+ Imported from GNU Classpath.
+
+ * test/regression/Makefile.am: Added new regression test RefTest.
+
+ * test/regression/RefTest.java: New test.
+
2005-01-29 Dalibor Topic <robilad at kaffe.org>
* config/Makefile.am (EXTRA_DIST): Added
Index: kaffe/include/Makefile.am
diff -u kaffe/include/Makefile.am:1.87 kaffe/include/Makefile.am:1.88
--- kaffe/include/Makefile.am:1.87 Sat Jan 29 12:17:33 2005
+++ kaffe/include/Makefile.am Sun Jan 30 12:42:37 2005
@@ -214,6 +214,7 @@
NOINSTALL_JNI_DERIVED_HDRS = \
java_math_BigInteger.h \
+ java_lang_ref_Reference.h \
gnu_classpath_VMSystemProperties.h \
gnu_java_nio_channels_FileChannelImpl.h \
gnu_java_nio_SelectorImpl.h \
Index: kaffe/include/Makefile.in
diff -u kaffe/include/Makefile.in:1.209 kaffe/include/Makefile.in:1.210
--- kaffe/include/Makefile.in:1.209 Sat Jan 29 12:17:33 2005
+++ kaffe/include/Makefile.in Sun Jan 30 12:42:37 2005
@@ -556,6 +556,7 @@
@COND_CLASSPATH_GTK_AWT_TRUE@@COND_NATIVE_AWT_TRUE at MAYBE_LIBGTKPEER_JNI_HDRS = $(LIBGTKPEER_JNI_HDRS)
NOINSTALL_JNI_DERIVED_HDRS = \
java_math_BigInteger.h \
+ java_lang_ref_Reference.h \
gnu_classpath_VMSystemProperties.h \
gnu_java_nio_channels_FileChannelImpl.h \
gnu_java_nio_SelectorImpl.h \
Index: kaffe/include/native.h
diff -u kaffe/include/native.h:1.17 kaffe/include/native.h:1.18
--- kaffe/include/native.h:1.17 Sat Dec 11 20:49:39 2004
+++ kaffe/include/native.h Sun Jan 30 12:42:39 2005
@@ -36,9 +36,15 @@
struct _dispatchTable;
struct _iLock;
+
+
typedef struct Hjava_lang_Object {
struct _dispatchTable* vtable;
struct _iLock* lock;
+ /* This pointer contains the VM function which should be called
+ * to handle object finalization.
+ */
+ void* finalizer_call;
/* Data follows on immediately */
} Hjava_lang_Object;
Index: kaffe/kaffe/kaffevm/Makefile.am
diff -u kaffe/kaffe/kaffevm/Makefile.am:1.69 kaffe/kaffe/kaffevm/Makefile.am:1.70
--- kaffe/kaffe/kaffevm/Makefile.am:1.69 Mon Aug 2 10:44:55 2004
+++ kaffe/kaffe/kaffevm/Makefile.am Sun Jan 30 12:42:40 2005
@@ -112,6 +112,7 @@
utf8const.c \
gcFuncs.c \
reflect.c \
+ reference.c \
$(BINRELOC_SOURCES)
noinst_HEADERS = \
@@ -152,6 +153,7 @@
threadData.h \
utf8const.h \
reflect.h \
+ reference.h \
../../binreloc/prefix.h
md.c: stamp-h01
Index: kaffe/kaffe/kaffevm/Makefile.in
diff -u kaffe/kaffe/kaffevm/Makefile.in:1.186 kaffe/kaffe/kaffevm/Makefile.in:1.187
--- kaffe/kaffe/kaffevm/Makefile.in:1.186 Fri Jan 28 15:31:08 2005
+++ kaffe/kaffe/kaffevm/Makefile.in Sun Jan 30 12:42:40 2005
@@ -104,7 +104,7 @@
hashtab.c inflate.c itypes.c jar.c ksem.c locks.c lookup.c \
object.c readClass.c soft.c stackTrace.c stats.c string.c \
stringParsing.c support.c thread.c utf8const.c gcFuncs.c \
- reflect.c ../../binreloc/prefix.c
+ reflect.c reference.c ../../binreloc/prefix.c
@ENABLE_BINRELOC_TRUE at am__objects_1 = libkaffevm_la-prefix.lo
am_libkaffevm_la_OBJECTS = libkaffevm_la-access.lo \
libkaffevm_la-baseClasses.lo libkaffevm_la-classMethod.lo \
@@ -123,7 +123,8 @@
libkaffevm_la-string.lo libkaffevm_la-stringParsing.lo \
libkaffevm_la-support.lo libkaffevm_la-thread.lo \
libkaffevm_la-utf8const.lo libkaffevm_la-gcFuncs.lo \
- libkaffevm_la-reflect.lo $(am__objects_1)
+ libkaffevm_la-reflect.lo libkaffevm_la-reference.lo \
+ $(am__objects_1)
am__objects_2 = libkaffevm_la-md.lo
nodist_libkaffevm_la_OBJECTS = $(am__objects_2)
libkaffevm_la_OBJECTS = $(am_libkaffevm_la_OBJECTS) \
@@ -512,6 +513,7 @@
utf8const.c \
gcFuncs.c \
reflect.c \
+ reference.c \
$(BINRELOC_SOURCES)
noinst_HEADERS = \
@@ -552,6 +554,7 @@
threadData.h \
utf8const.h \
reflect.h \
+ reference.h \
../../binreloc/prefix.h
CLEANFILES = so_locations
@@ -652,6 +655,7 @@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-object.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-prefix.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-readClass.Plo at am__quote@
+ at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-reference.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-reflect.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-soft.Plo at am__quote@
@AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libkaffevm_la-stackTrace.Plo at am__quote@
@@ -920,6 +924,13 @@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ source='reflect.c' object='libkaffevm_la-reflect.lo' libtool=yes @AMDEPBACKSLASH@
@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
@am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libkaffevm_la_CFLAGS) $(CFLAGS) -c -o libkaffevm_la-reflect.lo `test -f 'reflect.c' || echo '$(srcdir)/'`reflect.c
+
+libkaffevm_la-reference.lo: reference.c
+ at am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libkaffevm_la_CFLAGS) $(CFLAGS) -MT libkaffevm_la-reference.lo -MD -MP -MF "$(DEPDIR)/libkaffevm_la-reference.Tpo" -c -o libkaffevm_la-reference.lo `test -f 'reference.c' || echo '$(srcdir)/'`reference.c; \
+ at am__fastdepCC_TRUE@ then mv -f "$(DEPDIR)/libkaffevm_la-reference.Tpo" "$(DEPDIR)/libkaffevm_la-reference.Plo"; else rm -f "$(DEPDIR)/libkaffevm_la-reference.Tpo"; exit 1; fi
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ source='reference.c' object='libkaffevm_la-reference.lo' libtool=yes @AMDEPBACKSLASH@
+ at AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
+ at am__fastdepCC_FALSE@ $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libkaffevm_la_CFLAGS) $(CFLAGS) -c -o libkaffevm_la-reference.lo `test -f 'reference.c' || echo '$(srcdir)/'`reference.c
libkaffevm_la-prefix.lo: ../../binreloc/prefix.c
@am__fastdepCC_TRUE@ if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(libkaffevm_la_CFLAGS) $(CFLAGS) -MT libkaffevm_la-prefix.lo -MD -MP -MF "$(DEPDIR)/libkaffevm_la-prefix.Tpo" -c -o libkaffevm_la-prefix.lo `test -f '../../binreloc/prefix.c' || echo '$(srcdir)/'`../../binreloc/prefix.c; \
Index: kaffe/kaffe/kaffevm/baseClasses.c
diff -u kaffe/kaffe/kaffevm/baseClasses.c:1.57 kaffe/kaffe/kaffevm/baseClasses.c:1.58
--- kaffe/kaffe/kaffevm/baseClasses.c:1.57 Sat Dec 25 19:09:13 2004
+++ kaffe/kaffe/kaffevm/baseClasses.c Sun Jan 30 12:42:40 2005
@@ -64,6 +64,11 @@
Hjava_lang_Class* PtrClass;
Hjava_lang_Class* ClassLoaderClass;
+Hjava_lang_Class* javaLangRefReference;
+Hjava_lang_Class* javaLangRefSoftReference;
+Hjava_lang_Class* javaLangRefWeakReference;
+Hjava_lang_Class* javaLangRefPhantomReference;
+
Hjava_lang_Class* javaLangVoidClass;
Hjava_lang_Class* javaLangBooleanClass;
Hjava_lang_Class* javaLangByteClass;
@@ -162,6 +167,9 @@
stringInit();
utf8ConstInit();
+ /* Initialize the reference tracking subsystem */
+ KaffeVM_referenceInit();
+
/* Setup CLASSPATH */
initClasspath();
@@ -309,6 +317,12 @@
loadStaticClass(&javaLangNoClassDefFoundError, "java/lang/NoClassDefFoundError");
loadStaticClass(&javaLangStackOverflowError, "java/lang/StackOverflowError");
loadStaticClass(&javaIoIOException, "java/io/IOException");
+
+ /* Object references. */
+ loadStaticClass(&javaLangRefReference, "java/lang/ref/Reference");
+ loadStaticClass(&javaLangRefWeakReference, "java/lang/ref/WeakReference");
+ loadStaticClass(&javaLangRefSoftReference, "java/lang/ref/SoftReference");
+ loadStaticClass(&javaLangRefPhantomReference, "java/lang/ref/PhantomReference");
DBG(INIT, dprintf("initBaseClasses() done\n"); );
Index: kaffe/kaffe/kaffevm/baseClasses.h
diff -u kaffe/kaffe/kaffevm/baseClasses.h:1.18 kaffe/kaffe/kaffevm/baseClasses.h:1.19
--- kaffe/kaffe/kaffevm/baseClasses.h:1.18 Sun Sep 5 12:24:48 2004
+++ kaffe/kaffe/kaffevm/baseClasses.h Sun Jan 30 12:42:40 2005
@@ -38,6 +38,11 @@
extern struct Hjava_lang_Class* ClassLoaderClass;
extern struct Hjava_lang_Class* kaffeLangAppClassLoaderClass;
+extern struct Hjava_lang_Class* javaLangRefReference;
+extern struct Hjava_lang_Class* javaLangRefSoftReference;
+extern struct Hjava_lang_Class* javaLangRefWeakReference;
+extern struct Hjava_lang_Class* javaLangRefPhantomReference;
+
extern struct Hjava_lang_Class* javaLangVoidClass;
extern struct Hjava_lang_Class* javaLangBooleanClass;
extern struct Hjava_lang_Class* javaLangByteClass;
Index: kaffe/kaffe/kaffevm/classMethod.c
diff -u kaffe/kaffe/kaffevm/classMethod.c:1.131 kaffe/kaffe/kaffevm/classMethod.c:1.132
--- kaffe/kaffe/kaffevm/classMethod.c:1.131 Sat Dec 25 19:09:13 2004
+++ kaffe/kaffe/kaffevm/classMethod.c Sun Jan 30 12:42:40 2005
@@ -85,17 +85,13 @@
static void
determineAllocType(Hjava_lang_Class *class)
{
- if (StringClass != 0 && instanceof(StringClass, class)) {
- class->alloc_type = KGC_ALLOC_JAVASTRING;
- } else
- if (ClassLoaderClass != 0 && instanceof(ClassLoaderClass, class)) {
- class->alloc_type = KGC_ALLOC_JAVALOADER;
- } else
- if (class->finalizer != 0) {
- class->alloc_type = KGC_ALLOC_FINALIZEOBJECT;
- } else {
- class->alloc_type = KGC_ALLOC_NORMALOBJECT;
- }
+ if (StringClass != 0 && StringClass == class)
+ class->alloc_type = KGC_ALLOC_JAVASTRING;
+ else
+ if (ClassLoaderClass != 0 && instanceof(ClassLoaderClass, class))
+ class->alloc_type = KGC_ALLOC_JAVALOADER;
+ else
+ class->alloc_type = KGC_ALLOC_FINALIZEOBJECT;
}
/*
@@ -510,8 +506,8 @@
}
DO_CLASS_STATE(CSTATE_COMPLETE) {
- JNIEnv *env = THREAD_JNIENV();
jthrowable exc = NULL;
+ jthrowable excpending;
JavaVM *vms[1];
jsize jniworking;
@@ -551,26 +547,15 @@
/* give classLock up for the duration of this call */
unlockClass(class);
- /* we use JNI to catch possible exceptions, except
- * during initialization, when JNI doesn't work yet.
- * Should an exception occur at that time, we're
- * lost anyway.
+ /* We use here an exception safe call method to be able
+ * to catch possible exceptions which may occur.
*/
- JNI_GetCreatedJavaVMs(vms, 1, &jniworking);
- if (jniworking) {
-DBG(STATICINIT,
- dprintf("using JNI\n");
-);
- (*env)->ExceptionClear(env);
- (*env)->CallStaticVoidMethodA(env, class, (jmethodID)meth, NULL);
- exc = (*env)->ExceptionOccurred(env);
- (*env)->ExceptionClear(env);
- } else {
-DBG(STATICINIT,
- dprintf("using callMethodA\n");
- );
- callMethodA(meth, METHOD_NATIVECODE(meth), NULL, NULL, NULL, 1);
- }
+ excpending = THREAD_DATA()->exceptObj;
+ THREAD_DATA()->exceptObj = NULL;
+
+ KaffeVM_safeCallMethodA(meth, METHOD_NATIVECODE(meth), NULL, NULL, NULL, 0);
+ exc = THREAD_DATA()->exceptObj;
+ THREAD_DATA()->exceptObj = excpending;
lockClass(class);
@@ -1333,44 +1318,58 @@
JNIEnv *env = THREAD_JNIENV();
Hjava_lang_String *jname;
jthrowable excpending;
- jmethodID meth;
+ Method *meth;
+ Hjava_lang_Class *class_of_loader;
/*
* If an exception is already pending, for instance because we're
* resolving one that has occurred, save it and clear it for the
* upcall.
*/
- excpending = (*env)->ExceptionOccurred(env);
- (*env)->ExceptionClear(env);
+ excpending = THREAD_DATA()->exceptObj;
+ THREAD_DATA()->exceptObj = NULL;
- if( (jname = utf8Const2JavaReplace(ce->name, '/', '.')) &&
+ class_of_loader = OBJECT_CLASS((Hjava_lang_Object *)loader);
+
+ if( (jname = utf8Const2JavaReplace(ce->name, '/', '.')) )
+ {
+ jvalue jretval;
+ jvalue args[1];
+ jthrowable excobj;
+
+ /* If we fail to resolve loadClass then we just have to set retval to NULL.
+ * einfo is already set.
+ */
+ if ((meth = lookupClassMethod(class_of_loader, "loadClass",
+ "(Ljava/lang/String;)Ljava/lang/Class;",
+ einfo)) == NULL)
+ {
+ retval = NULL;
+ goto userload_done;
+ }
+
+ if (METHOD_IS_STATIC(meth))
+ {
+ postExceptionMessage(einfo, "java/lang/NoSuchMethodError",
+ "loadClass is wrongly a static method in %s", CLASS_CNAME(class_of_loader));
+ retval = NULL;
+ goto userload_done;
+ }
+
+ /* ClassLoader is not an interface so we may use NATIVECODE directly. */
+ args[0].l = jname;
+ KaffeVM_safeCallMethodA(meth, METHOD_NATIVECODE(meth), loader, args, &jretval, false);
+ retval = jretval.l;
+
/*
- * We use JNI here so that all exceptions are caught and we'll
- * always return.
+ * Check whether an exception occurred. If one was pending,
+ * the new exception will override this one.
*/
- (meth = (*env)->GetMethodID(
- env,
- (*env)->GetObjectClass(env, loader),
- "loadClass",
- "(Ljava/lang/String;)Ljava/lang/Class;")) )
- {
- jthrowable excobj;
-
- retval = (Hjava_lang_Class*)
- (*env)->CallObjectMethod(env,
- loader,
- meth,
- jname);
-
- /*
- * Check whether an exception occurred. If one was pending,
- * the new exception will override this one.
- */
- excobj = (*env)->ExceptionOccurred(env);
- (*env)->ExceptionClear(env);
-
- if( excobj != 0 )
- {
+ excobj = THREAD_DATA()->exceptObj;
+ THREAD_DATA()->exceptObj = NULL;
+
+ if( excobj != 0 )
+ {
/* There was an exception. */
einfo->type = KERR_RETHROW;
einfo->throwable = excobj;
@@ -1381,50 +1380,55 @@
/* Set this for the verifier. */
einfo->type |= KERR_NO_CLASS_FOUND;
}
- }
- else if( retval == NULL )
- {
- /* No class returned. */
- postExceptionMessage(einfo,
- JAVA_LANG(ClassNotFoundException),
- "%s",
- ce->name->data);
- /* Set this for the verifier. */
- einfo->type |= KERR_NO_CLASS_FOUND;
- }
- else if( !utf8ConstEqual(retval->name, ce->name) )
- {
- /*
- * Its a valid class, but the name differs from the one
- * that was requested.
+ /* We must clear the return value as safeCallMethod does not
+ * handle this.
*/
- postExceptionMessage(
- einfo,
- JAVA_LANG(ClassNotFoundException),
- "Bad class name (expect: %s, get: %s)",
- ce->name->data,
- retval->name->data);
- /* Set this for the verifier. */
- einfo->type |= KERR_NO_CLASS_FOUND;
retval = NULL;
- }
- else
- {
- retval = classMappingLoaded(ce, retval);
- }
-
- }
+ }
+ else if( retval == NULL )
+ {
+ /* No class returned. */
+ postExceptionMessage(einfo,
+ JAVA_LANG(ClassNotFoundException),
+ "%s",
+ ce->name->data);
+ /* Set this for the verifier. */
+ einfo->type |= KERR_NO_CLASS_FOUND;
+ }
+ else if( !utf8ConstEqual(retval->name, ce->name) )
+ {
+ /*
+ * Its a valid class, but the name differs from the one
+ * that was requested.
+ */
+ postExceptionMessage(
+ einfo,
+ JAVA_LANG(ClassNotFoundException),
+ "Bad class name (expect: %s, get: %s)",
+ ce->name->data,
+ retval->name->data);
+ /* Set this for the verifier. */
+ einfo->type |= KERR_NO_CLASS_FOUND;
+ retval = NULL;
+ }
+ else
+ {
+ retval = classMappingLoaded(ce, retval);
+ }
+ }
else
- {
- postOutOfMemory(einfo);
- }
+ {
+ postOutOfMemory(einfo);
+ }
+ userload_done:
/* rethrow pending exception */
if( excpending != NULL )
{
- (*env)->Throw(env, excpending);
+ THREAD_DATA()->exceptObj = excpending;
}
- return( retval );
+
+ return retval;
}
Hjava_lang_Class *loadClass(Utf8Const *name,
@@ -1665,6 +1669,7 @@
int maxalign;
int oldoffset;
int *map;
+ jbool is_reference;
/* Find start of new fields in this object. If start is zero, we must
* allow for the object headers.
@@ -1714,6 +1719,10 @@
/* recall old offset */
offset = oldoffset;
+ /* Check whether the class is java.lang.ref.Reference */
+ is_reference =
+ (strcmp(CLASS_CNAME(class), "java/lang/ref/Reference") == 0);
+
/* Now that we know how big that object is going to be, create
* a bitmap to help the gc scan the object. The first part is
* inherited from the superclass.
@@ -1767,11 +1776,12 @@
if (!FIELD_RESOLVED(fld)) {
Utf8Const *sig = fld->signature;
if ((sig->data[0] == 'L' || sig->data[0] == '[') &&
- strcmp(sig->data, PTRCLASSSIG)) {
+ strcmp(sig->data, PTRCLASSSIG) &&
+ (!is_reference || strcmp(FIELD_NAME(fld), "referent") != 0)) {
BITMAP_SET(map, nbits);
}
} else {
- if (FIELD_ISREF(fld)) {
+ if (FIELD_ISREF(fld) ) {
BITMAP_SET(map, nbits);
}
}
Index: kaffe/kaffe/kaffevm/classMethod.h
diff -u kaffe/kaffe/kaffevm/classMethod.h:1.75 kaffe/kaffe/kaffevm/classMethod.h:1.76
--- kaffe/kaffe/kaffevm/classMethod.h:1.75 Sat Jan 1 11:35:43 2005
+++ kaffe/kaffe/kaffevm/classMethod.h Sun Jan 30 12:42:40 2005
@@ -47,6 +47,7 @@
struct _jitCodeHeader;
#include <java_lang_ClassLoader.h>
+#include "reference.h"
/**
* Builtin stab type IDs.
@@ -83,12 +84,13 @@
Hjava_lang_Object head; /* A class is an object too */
struct _iLock* lock; /* Lock for internal use */
+ void *finalizer_call;
/* Link to class entry */
struct _classEntry* centry;
Utf8Const* name;
- unsigned int packageLength;
+ unsigned int packageLength;
char* sourcefile; /* source file name if known */
accessFlags accflags;
@@ -144,6 +146,9 @@
int* gc_layout;
class_state_t state;
void* processingThread;
+ /* This pointer contains the method which should be called
+ * at object finalization.
+ */
Method* finalizer;
int alloc_type; /* allocation type */
@@ -339,7 +344,7 @@
typedef struct _dispatchTable {
Hjava_lang_Class* class;
- void* __dummy0; /* For GCJ/C++ compatibility */
+ void* __dummy0; /* For GCJ/C++ compatibility. */
void* method[1];
} dispatchTable;
@@ -378,6 +383,7 @@
&& CLASS_IS_PRIMITIVE(FIELD_TYPE(FLD)))
#define FIELD_ISREF(FLD) (!FIELD_ISPRIM(FLD) \
&& FIELD_TYPE(FLD) != PtrClass)
+#define FIELD_NAME(FLD) ((FLD)->name->data)
#define CLASSMAXSIG 256
Index: kaffe/kaffe/kaffevm/exception.h
diff -u kaffe/kaffe/kaffevm/exception.h:1.28 kaffe/kaffe/kaffevm/exception.h:1.29
--- kaffe/kaffe/kaffevm/exception.h:1.28 Tue Oct 12 17:00:10 2004
+++ kaffe/kaffe/kaffevm/exception.h Sun Jan 30 12:42:40 2005
@@ -56,7 +56,7 @@
/*
* A VmExceptHandle is used to handle *any* exception in native code
* in the core of the VM. Set up when entering Kaffe_JNI methods, or
- * when callMethodA or callMethodV are invoked.
+ * when KaffeVM_callMethodA or KaffeVM_callMethodV are invoked.
*
* Each thread in the system has a exceptPtr, which points
* to the most recent VmExceptHandler buffer (the buffers
Index: kaffe/kaffe/kaffevm/gcFuncs.c
diff -u kaffe/kaffe/kaffevm/gcFuncs.c:1.63 kaffe/kaffe/kaffevm/gcFuncs.c:1.64
--- kaffe/kaffe/kaffevm/gcFuncs.c:1.63 Sat Dec 25 19:09:13 2004
+++ kaffe/kaffe/kaffevm/gcFuncs.c Sun Jan 30 12:42:40 2005
@@ -573,8 +573,7 @@
walkClassEntries(collector, gc_info, (Hjava_lang_ClassLoader*)base);
}
-static
-void
+static void
/* ARGSUSED */
finalizeObject(Collector* collector UNUSED, void* ob)
{
@@ -587,17 +586,8 @@
/* Suppose we catch ThreadDeath inside newObject() */
return;
}
- objclass = OBJECT_CLASS(obj);
- final = objclass->finalizer;
-
- if (!final) {
- assert(objclass->alloc_type == KGC_ALLOC_JAVALOADER);
- return;
- }
-
- (*env)->CallVoidMethod(env, obj, final);
- /* ignore any resulting exception */
- (*env)->ExceptionClear(env);
+ assert(obj->finalizer_call != NULL);
+ ((KaffeVM_Finalizer)obj->finalizer_call)(obj);
}
/*
Index: kaffe/kaffe/kaffevm/ksem.c
diff -u kaffe/kaffe/kaffevm/ksem.c:1.10 kaffe/kaffe/kaffevm/ksem.c:1.11
--- kaffe/kaffe/kaffevm/ksem.c:1.10 Thu Dec 16 06:13:50 2004
+++ kaffe/kaffe/kaffevm/ksem.c Sun Jan 30 12:42:41 2005
@@ -51,6 +51,8 @@
if (timeout == 0)
timeout = NOTIMEOUT;
+ dprintf("ksem_get sp=%p\n", &r);
+
KMUTEX(lock)(&sem->mux);
/* If no stored wakeups, then sleep. */
if (sem->count == 0) {
Index: kaffe/kaffe/kaffevm/locks.c
diff -u kaffe/kaffe/kaffevm/locks.c:1.54 kaffe/kaffe/kaffevm/locks.c:1.55
--- kaffe/kaffe/kaffevm/locks.c:1.54 Mon Dec 20 02:12:53 2004
+++ kaffe/kaffe/kaffevm/locks.c Sun Jan 30 12:42:41 2005
@@ -257,6 +257,9 @@
if (lk != heavyLock) {
gc_free(lk);
}
+ else {
+ lk->holder = NULL;
+ }
putHeavyLock(lkp, LOCKFREE);
}
KTHREAD(enable_stop)();
Index: kaffe/kaffe/kaffevm/object.c
diff -u kaffe/kaffe/kaffevm/object.c:1.31 kaffe/kaffe/kaffevm/object.c:1.32
--- kaffe/kaffe/kaffevm/object.c:1.31 Mon Dec 20 02:12:53 2004
+++ kaffe/kaffe/kaffevm/object.c Sun Jan 30 12:42:41 2005
@@ -51,6 +51,7 @@
postOutOfMemory(info);
} else {
/* Fill in object information */
+ KaffeVM_setFinalizer(obj, KGC_DEFAULT_FINALIZER);
obj->vtable = class->vtable;
#if defined(ENABLE_JVMPI)
@@ -114,6 +115,7 @@
}
/* Fill in object information */
+ KaffeVM_setFinalizer(cls, KGC_DEFAULT_FINALIZER);
cls->head.vtable = ClassClass->vtable;
done:
DBG(NEWOBJECT,
@@ -152,6 +154,7 @@
}
}
if (obj != NULL) {
+ KaffeVM_setFinalizer(obj, KGC_DEFAULT_FINALIZER);
obj->vtable = class->vtable;
ARRAY_SIZE(obj) = count;
===================================================================
Checking out kaffe/kaffe/kaffevm/reference.c
RCS: /home/cvs/kaffe/kaffe/kaffe/kaffevm/reference.c,v
VERS: 1.1
***************
--- /dev/null Sun Aug 4 19:57:58 2002
+++ kaffe/kaffe/kaffevm/reference.c Sun Jan 30 12:48:07 2005
@@ -0,0 +1,257 @@
+/* reference.c
+ * Maintain the table of Java references.
+ * Implement special finalizer for reclaiming or clearing the references.
+ *
+ * Copyright (c) 2005
+ * The Kaffe.org's developers. See ChangeLog for details.
+ *
+ * See the file "license.terms" for information on usage and redistribution
+ * of this file.
+ */
+
+#include "gtypes.h"
+#include "hashtab.h"
+#include "baseClasses.h"
+#include "reference.h"
+#include "locks.h"
+#include "gc.h"
+#include "classMethod.h"
+#include "native.h"
+#include "thread.h"
+#include "utf8const.h"
+#include "kaffe/jmalloc.h"
+
+typedef struct _referenceLinkList {
+ jobject reference;
+ kgc_reference_type weight;
+ struct _referenceLinkList *next;
+} referenceLinkList;
+
+typedef struct _referenceLinkListHead {
+ jobject obj;
+ referenceLinkList *references;
+} referenceLinkListHead;
+
+static iStaticLock referencesLock = KAFFE_STATIC_LOCK_INITIALIZER;
+static hashtab_t referencesHashTable;
+static uint32 referentOffset = ~((uint32)0);
+
+static int
+objectHash(const void *p)
+{
+ const referenceLinkListHead *head = (const referenceLinkListHead *)p;
+ void *obj = head->obj;
+
+#if SIZEOF_INT == SIZEOF_VOID_P && SIZEOF_INT == 4
+ return (int)(obj) & ((1UL << 31) - 1);
+#elif SIZEOF_INT == SIZEOF_VOID_P && SIZEOF_INT == 8
+ return (int)(obj) & ((1ULL << 63) - 1);
+#elif SIZEOF_INT == 4 && SIZEOF_VOID_P == 8
+ return (int)( ((uintp)obj >> 32) ^ ((uintp)obj & 0xffffffff));
+#else
+#error "Don't know what to do to build a hash function for objects."
+#endif
+}
+
+static int
+objectComp(const void *p1, const void *p2)
+{
+ const referenceLinkListHead *head1 = (const referenceLinkListHead *)p1;
+ const referenceLinkListHead *head2 = (const referenceLinkListHead *)p2;
+ return !(head1->obj == head2->obj);
+}
+
+void KaffeVM_referenceInit(void)
+{
+ referencesHashTable = hashInit(objectHash, objectComp, NULL, NULL);
+}
+
+void KaffeVM_registerObjectReference(jobject reference, jobject obj, kgc_reference_type reftype)
+{
+ int iLockRoot;
+ referenceLinkList *ll;
+ referenceLinkListHead *head, *temp;
+
+ ll = KMALLOC(sizeof(referenceLinkList));
+ ll->reference = reference;
+ ll->weight = reftype;
+
+ head = KMALLOC(sizeof(referenceLinkListHead));
+ head->references = ll;
+ head->obj = obj;
+
+ lockStaticMutex(&referencesLock);
+ temp = (referenceLinkListHead *)hashAdd(referencesHashTable, head);
+ /* Check whether the hash entry was already filled by someone. */
*** Patch too long, truncated ***
More information about the kaffe
mailing list