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  <[EMAIL PROTECTED]>
+
+       * 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  <[EMAIL PROTECTED]>
 
        * 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@@[EMAIL PROTECTED] = $(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
 @[EMAIL PROTECTED] = 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@ @[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]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
 @AMDEP_TRUE@@am__include@ @[EMAIL PROTECTED]/$(DEPDIR)/[EMAIL PROTECTED]@
@@ -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
[EMAIL PROTECTED]@      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; \
[EMAIL PROTECTED]@      then mv -f "$(DEPDIR)/libkaffevm_la-reference.Tpo" 
"$(DEPDIR)/libkaffevm_la-reference.Plo"; else rm -f 
"$(DEPDIR)/libkaffevm_la-reference.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='reference.c' 
object='libkaffevm_la-reference.lo' libtool=yes @AMDEPBACKSLASH@
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) 
$(depcomp) @AMDEPBACKSLASH@
[EMAIL PROTECTED]@      $(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 ***

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

Reply via email to