PatchSet 5700 
Date: 2004/12/21 16:51:01
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
merged java.lang.ClassLoader from GNU Classpath

Members: 
        ChangeLog:1.3245->1.3246 
        include/Makefile.am:1.79->1.80 
        include/Makefile.in:1.197->1.198 
        kaffe/kaffe/main.c:1.73->1.74 
        kaffe/kaffevm/classMethod.h:1.72->1.73 
        kaffe/kaffevm/classPool.c:1.31->1.32 
        kaffe/kaffevm/external.c:1.73->1.74 
        kaffe/kaffevm/external.h:1.9->1.10 
        kaffe/kaffevm/gcFuncs.c:1.61->1.62 
        kaffe/kaffevm/thread.c:1.87->1.88 
        libraries/clib/native/Class.c:1.77->1.78 
        libraries/clib/native/ClassLoader.c:1.39->1.40 
        libraries/clib/native/Makefile.am:1.37->1.38 
        libraries/clib/native/Makefile.in:1.163->1.164 
        libraries/clib/native/NativeLibrary.c:1.6->1.7(DEAD) 
        libraries/clib/native/Runtime.c:1.29->1.30 
        libraries/javalib/Makefile.am:1.278->1.279 
        libraries/javalib/Makefile.in:1.359->1.360 
        libraries/javalib/all.files:1.59->1.60 
        libraries/javalib/bootstrap.classlist:1.65->1.66 
        libraries/javalib/gnu/java/util/DoubleEnumeration.java:INITIAL->1.1 
        libraries/javalib/java/lang/Class.java:1.50->1.51 
        libraries/javalib/java/lang/ClassLoader.java:1.34->1.35 
        libraries/javalib/java/lang/NativeLibrary.java:1.5->1.6(DEAD) 
        libraries/javalib/java/lang/Runtime.java:1.30->1.31 
        libraries/javalib/java/lang/System.java:1.42->1.43 
        libraries/javalib/java/lang/VMClassLoader.java:INITIAL->1.1 
        libraries/javalib/kaffe/lang/PrimordialClassLoader.java:1.6->1.7 
        libraries/javalib/kaffe/lang/ThreadStack.java:1.3->1.4 
        test/regression/KaffeInternal.java:1.1->1.2 
        test/regression/Makefile.am:1.90->1.91 
        test/regression/Makefile.in:1.195->1.196 
        test/regression/PrimordialLoaderTest.java:INITIAL->1.1 
        test/regression/ProcessClassInst.java:1.11->1.12 
        test/regression/ProcessClassStop.java:1.10->1.11 
        test/regression/ProhibitedClass.java:1.5->1.6 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.3245 kaffe/ChangeLog:1.3246
--- kaffe/ChangeLog:1.3245      Tue Dec 21 11:46:51 2004
+++ kaffe/ChangeLog     Tue Dec 21 16:51:01 2004
@@ -1,5 +1,52 @@
 2004-12-21  Helmer Kraemer  <[EMAIL PROTECTED]>
 
+       Merged java.lang.ClassLoader from GNU Classpath
+
+       * kaffe/kaffevm/external.c, kaffe/kaffevm/external.h, 
kaffe/kaffevm/classPool.c,
+       kaffe/kaffe/main.c: keep track of the associated class loader of a 
native library;
+       unload native libraries when a class loader is gced, throw an exception 
if a
+       library is loaded by more than one class loader
+       
+       * kaffe/kaffevm/gcFuncs.c, kaffe/kaffevm/classMethod.h: add 
protectionDomain field
+       to Hjava_lang_Class
+
+       * libraries/javalib/kaffe/lang/ThreadStack.java, 
kaffe/kaffevm/thread.c: use
+       ClassLoader.getSystemClassLoader instead of AppClassLoader.getSingleton 
so we
+       don't mess up the initialization order of the runtime library
+
+       * libraries/javalib/java/lang/ClassLoader.java, 
gnu/java/util/DoubleEnumeration.java:
+       new files, taken from GNU classpath
+
+       * libraries/javalib/java/lang/VMClassLoader.java: new file
+
+       * libraries/javalib/java/lang/Class.java, libraries/clib/native/Class.c,
+       libraries/clib/native/ClassLoader.c: updated to class loader changes
+
+       * libraries/javalib/kaffe/lang/PrimordialClassLoader.java: deny loading 
of classes
+       from the gnu.classpath package
+       
+       * libraries/javalib/java/lang/System.java, 
libraries/javalib/java/lang/Runtime.java:
+       moved handling of native libraries into java.lang.Runtime.
+       
+       * libraries/javalib/java/lang/NativeLibrary.java,
+       libraries/clib/native/NativeLibrary.c: removed
+
+       * libraries/javalib/bootstrap.classlist, libraries/javalib/all.files,
+       libraries/javalib/Makefile.am, libraries/javalib/Makefile.in, 
include/Makefile.am,
+       include/Makefile.in: updated
+
+       * test/regression/ProcessClassInst.java, 
test/regression/ProcessClassStop.java,
+       ProhibitedClass.java: updated expected output
+
+       * test/regression/KaffeInternal.java: check that access to gnu.classpath
+       package is denied for non-bootstrap classes
+
+       * test/regression/Makefile.am, test/regression/Makefile.in,
+       test/regression/PrimordialLoaderTest.java: new test case for the java
+       interface to the primordial class loader
+
+2004-12-21  Helmer Kraemer  <[EMAIL PROTECTED]>
+
        * kaffe/kaffevm/threadData.h (THREAD_DATA_INITIALIZED): new macro
 
        * kaffe/kaffevm/kaffe-gc/gc-refs.c (liveThreadWalker): properly handle
Index: kaffe/include/Makefile.am
diff -u kaffe/include/Makefile.am:1.79 kaffe/include/Makefile.am:1.80
--- kaffe/include/Makefile.am:1.79      Wed Dec  8 07:22:07 2004
+++ kaffe/include/Makefile.am   Tue Dec 21 16:51:11 2004
@@ -67,7 +67,6 @@
        java_lang_Integer.h \
        java_lang_Long.h \
        java_lang_Math.h \
-       java_lang_NativeLibrary.h \
        java_lang_Runtime.h \
        java_lang_Short.h \
        java_lang_System.h \
Index: kaffe/include/Makefile.in
diff -u kaffe/include/Makefile.in:1.197 kaffe/include/Makefile.in:1.198
--- kaffe/include/Makefile.in:1.197     Wed Dec  8 07:22:07 2004
+++ kaffe/include/Makefile.in   Tue Dec 21 16:51:11 2004
@@ -416,7 +416,6 @@
        java_lang_Integer.h \
        java_lang_Long.h \
        java_lang_Math.h \
-       java_lang_NativeLibrary.h \
        java_lang_Runtime.h \
        java_lang_Short.h \
        java_lang_System.h \
Index: kaffe/kaffe/kaffe/main.c
diff -u kaffe/kaffe/kaffe/main.c:1.73 kaffe/kaffe/kaffe/main.c:1.74
--- kaffe/kaffe/kaffe/main.c:1.73       Sat Dec 18 07:45:34 2004
+++ kaffe/kaffe/kaffe/main.c    Tue Dec 21 16:51:10 2004
@@ -198,7 +198,7 @@
                        libargs += 1;
                }
                
-               i = loadNativeLibrary(libpath, errbuf, sizeof(errbuf));
+               i = loadNativeLibrary(libpath, NULL, errbuf, sizeof(errbuf));
                if( i > 0 )
                {
                        jint (*onload_func)(JavaVM *jvm, char *, void *);
Index: kaffe/kaffe/kaffevm/classMethod.h
diff -u kaffe/kaffe/kaffevm/classMethod.h:1.72 
kaffe/kaffe/kaffevm/classMethod.h:1.73
--- kaffe/kaffe/kaffevm/classMethod.h:1.72      Tue Dec 21 05:49:59 2004
+++ kaffe/kaffe/kaffevm/classMethod.h   Tue Dec 21 16:51:05 2004
@@ -156,6 +156,7 @@
        short                   nr_inner_classes;
        struct _innerClass*     inner_classes;
 
+       /* misc other stuff */
        void*                   gcjPeer;        /* only needed if GCJ_SUPPORT */
 #ifdef KAFFE_VMDEBUG
        int                     live_count;
@@ -167,6 +168,9 @@
 
        /** The array of 'signer' objects; usually Certificates. */
        HArrayOfObject*         signers;
+
+       /** The protection domain */
+       struct Hjava_lang_Object*       protectionDomain;
 };
 
 #ifndef __DEFINED_CLASS
Index: kaffe/kaffe/kaffevm/classPool.c
diff -u kaffe/kaffe/kaffevm/classPool.c:1.31 
kaffe/kaffe/kaffevm/classPool.c:1.32
--- kaffe/kaffe/kaffevm/classPool.c:1.31        Sun Dec 19 06:25:07 2004
+++ kaffe/kaffe/kaffevm/classPool.c     Tue Dec 21 16:51:05 2004
@@ -242,6 +242,7 @@
         int rmoved;
 
         rmoved = removeClassEntries(loader);
+       unloadNativeLibraries(loader);
 
        if (Kaffe_JavaVMArgs.enableVerboseGC > 0) {
                dprintf("<GC: destroying classloader "
Index: kaffe/kaffe/kaffevm/external.c
diff -u kaffe/kaffe/kaffevm/external.c:1.73 kaffe/kaffe/kaffevm/external.c:1.74
--- kaffe/kaffe/kaffevm/external.c:1.73 Tue Dec 21 05:49:59 2004
+++ kaffe/kaffe/kaffevm/external.c      Tue Dec 21 16:51:05 2004
@@ -40,6 +40,7 @@
 #include "jthread.h"
 #include "jsignal.h"
 #include "stats.h"
+#include "locks.h"
 #if defined(KAFFE_FEEDBACK)
 #include "feedback.h"
 #endif
@@ -68,40 +69,11 @@
 static struct _libHandle {
        LIBRARYHANDLE   desc;
        char*           name;
-       int             ref;
+       Hjava_lang_ClassLoader*         loader;
 } libHandle[MAXLIBS];
 
-static inline void *
-findLibraryFunction(const char *name) {
-  int i = 0;
-  void *ptr = NULL;
-  
-  while (!ptr && libHandle[i].ref && i < MAXLIBS) {
-    ptr = KaffeLib_GetSymbol(libHandle[i].desc, name);
-
-DBG(NATIVELIB,
-    if (ptr == NULL) {
-       dprintf("Couldn't find %s in library handle %d == %s.\nError message is 
%s.\n",
-               name,
-               i,
-               lt_dlgetinfo(libHandle[i].desc) == NULL ? "unknown" : 
lt_dlgetinfo(libHandle[i].desc)->name,
-               lt_dlerror());
-    }
-    else {
-       dprintf("Found %s in library handle %d == %s.\n",
-               name,
-               i,
-               lt_dlgetinfo(libHandle[i].desc) == NULL ? "unknown" : 
lt_dlgetinfo(libHandle[i].desc)->name);
-    }
-);
-
-    ++i;
-  }
-
-  return ptr;
-}
-
-static char *libraryPath = NULL;
+static iStaticLock     libraryLock = KAFFE_STATIC_LOCK_INITIALIZER; /* mutex 
on all intern operations */
+static const char *libraryPath = NULL;
 
 extern JavaVM Kaffe_JavaVM;
 
@@ -206,7 +178,7 @@
 
                DBG(INIT, dprintf("trying to load %s\n", lib); );
 
-               if (loadNativeLibrary(lib, NULL, 0) >= 0) {
+               if (loadNativeLibrary(lib, NULL, NULL, 0) >= 0) {
                        DBG(INIT, dprintf("initNative() done\n"); );
                        return;
                }
@@ -218,26 +190,20 @@
        EXIT(1);
 }
 
-int
-loadNativeLibrary(char* lib, char *errbuf, size_t errsiz)
-{
-       int retval;
-
-       retval = loadNativeLibrary2(lib, 1, errbuf, errsiz);
-       return( retval );
-}
-
 /*
  * Link in a native library. If successful, returns an index >= 0 that
  * can be passed to unloadNativeLibrary(). Otherwise, returns -1 and
  * fills errbuf (if not NULL) with the error message. Assumes synchronization.
  */
 int
-loadNativeLibrary2(char* path, int default_refs, char *errbuf, size_t errsiz)
+loadNativeLibrary(char* path, struct Hjava_lang_ClassLoader* loader, char 
*errbuf, size_t errsiz)
 {
        struct _libHandle *lib;
        int libIndex;
        void *func;
+       int iLockRoot;
+
+       lockStaticMutex(&libraryLock);
 
        /* Find a library handle.  If we find the library has already
         * been loaded, don't bother to get it again, just increase the
@@ -248,15 +214,24 @@
                if (lib->desc == 0) {
                        goto open;
                }
-               if (strcmp(lib->name, path) == 0) {
-                       lib->ref++;
+               if (strcmp(lib->name, path) != 0)
+                       continue;
+
+               if (lib->loader != loader) {
+                       if (errbuf != NULL) {
+                               strncpy(errbuf, "Already loaded\n", errsiz);
+                       }
+                       unlockStaticMutex(&libraryLock);
+                       return -1;
+               }
+
 DBG(NATIVELIB,
                        dprintf("Native lib %s\n"
-                           "\tLOAD desc=%p index=%d ++ref=%d\n",
-                           lib->name, lib->desc, libIndex, lib->ref);
+                           "\tLOAD desc=%p index=%d loader=%p\n",
+                           lib->name, lib->desc, libIndex, lib->loader);
     );
-                       return libIndex;
-               }
+               unlockStaticMutex(&libraryLock); 
+               return libIndex;
        }
        if (errbuf != 0) {
                assert(errsiz > 0);
@@ -264,6 +239,7 @@
                strncpy(errbuf, "Too many open libraries", errsiz);
                errbuf[errsiz - 1] = '\0';
        }
+       unlockStaticMutex(&libraryLock);
        return -1;
 
        /* Open the library */
@@ -283,10 +259,9 @@
 /* if we tested for existence here, libltdl wouldn't be able to look
    for system-dependent library names */
 
-       blockAsyncSignals();
        {
                 lib->desc = KaffeLib_Load(path);
-                if (lib->desc == 0)    
+                if (lib->desc == NULL) 
                        {
                                const char *err = KaffeLib_GetError();
 
@@ -322,25 +297,26 @@
                                        if (errbuf != 0)
                                                strncpy(errbuf, err, errsiz);
                                }
+                       
+                               unlockStaticMutex(&libraryLock);
+                               return -1;
                        }
                }
-       unblockAsyncSignals();
-
-       if (lib->desc == 0) {
-               return -1;
-       }
 
         lib->name = gc_malloc(strlen(path)+1, KGC_ALLOC_NATIVELIB);
         strcpy (lib->name, path);
 
-       lib->ref = default_refs;
+       lib->loader = loader;
        addToCounter(&ltmem, "vmmem-libltdl", 1, GCSIZEOF(lib->name));
 
+       unlockStaticMutex(&libraryLock);
+
 DBG(NATIVELIB,
        dprintf("Native lib %s\n"
-           "\tLOAD desc=%p index=%d ++ref=%d\n",
-           lib->name, lib->desc, libIndex, lib->ref);
+           "\tLOAD desc=%p index=%d loader=%p\n",
+           lib->name, lib->desc, libIndex, lib->loader);
     );
+
 #if defined(KAFFE_FEEDBACK)
        feedbackLibrary(path, true);
 #endif
@@ -361,28 +337,37 @@
  * never be unloaded. So index should never equal zero here.
  */
 void
-unloadNativeLibrary(int libIndex)
+unloadNativeLibraries(struct Hjava_lang_ClassLoader* loader)
 {
-       struct _libHandle *lib;
+       int libIndex;
+       int iLockRoot;
+
+       lockStaticMutex(&libraryLock);
+
+       /* we should never ever unload libraries of the bootstrap loader */
+       assert (loader != NULL);
+
+       for (libIndex = 0; libIndex < MAXLIBS; libIndex++) {
+               struct _libHandle* lib = &libHandle[libIndex];
+
+               if (lib->desc == NULL)
+                       continue;
 
-       assert(libIndex > 0 && libIndex < MAXLIBS);
-       lib = &libHandle[libIndex];
+               if (lib->loader != loader)
+                       continue;
 
 DBG(NATIVELIB,
-       dprintf("Native lib %s\n"
-           "\tUNLOAD desc=%p index=%d --ref=%d\n",
-           lib->name, lib->desc, libIndex, lib->ref - 1);
+    dprintf("Native lib %s\n"
+           "\tUNLOAD desc=%p index=%d loader=%p\n",
+           lib->name, lib->desc, libIndex, lib->loader);
     );
 
-       assert(lib->desc != 0);
-       assert(lib->ref > 0);
-       if (--lib->ref == 0) {
-               blockAsyncSignals();
                KaffeLib_Unload(lib->desc);
-               unblockAsyncSignals();
                KFREE(lib->name);
                lib->desc = NULL;
        }
+
+       unlockStaticMutex(&libraryLock);
 }
 
 /*
@@ -393,10 +378,11 @@
 {
   int i = 0;
   void* func = NULL;;
+  int iLockRoot;
 
-  blockAsyncSignals();
+  lockStaticMutex(&libraryLock);
   
-  while (!func && libHandle[i].ref && i < MAXLIBS) {
+  while (!func && i < MAXLIBS && libHandle[i].desc!=NULL) {
     func = KaffeLib_GetSymbol(libHandle[i].desc, name);
     
 DBG(NATIVELIB,
@@ -418,7 +404,7 @@
     ++i;
   }
 
-  unblockAsyncSignals();
+  unlockStaticMutex(&libraryLock);
 
   return func;
 }
Index: kaffe/kaffe/kaffevm/external.h
diff -u kaffe/kaffe/kaffevm/external.h:1.9 kaffe/kaffe/kaffevm/external.h:1.10
--- kaffe/kaffe/kaffevm/external.h:1.9  Wed Dec  8 07:22:07 2004
+++ kaffe/kaffe/kaffevm/external.h      Tue Dec 21 16:51:05 2004
@@ -28,9 +28,8 @@
 struct _errorInfo;
 
 void   initNative(void);
-int    loadNativeLibrary(char*, char*, size_t);
-int    loadNativeLibrary2(char*, int, char*, size_t);
-void   unloadNativeLibrary(int);
+int    loadNativeLibrary(char*, struct Hjava_lang_ClassLoader*, char*, size_t);
+void   unloadNativeLibraries(struct Hjava_lang_ClassLoader*);
 void*  loadNativeLibrarySym(const char*);
 nativecode*    native(struct _methods*, struct _errorInfo*);
 void   addNativeFunc(char*, void*);
Index: kaffe/kaffe/kaffevm/gcFuncs.c
diff -u kaffe/kaffe/kaffevm/gcFuncs.c:1.61 kaffe/kaffe/kaffevm/gcFuncs.c:1.62
--- kaffe/kaffe/kaffevm/gcFuncs.c:1.61  Tue Dec 21 08:06:36 2004
+++ kaffe/kaffe/kaffevm/gcFuncs.c       Tue Dec 21 16:51:05 2004
@@ -376,6 +376,8 @@
                 walkMethods(collector, gc_info, CLASS_METHODS(class), 
CLASS_NMETHODS(class));
         }
         KGC_markObject(collector, gc_info, class->loader);
+       KGC_markObject(collector, gc_info, class->signers);
+       KGC_markObject(collector, gc_info, class->protectionDomain);
 }
 
 /*****************************************************************************
Index: kaffe/kaffe/kaffevm/thread.c
diff -u kaffe/kaffe/kaffevm/thread.c:1.87 kaffe/kaffe/kaffevm/thread.c:1.88
--- kaffe/kaffe/kaffevm/thread.c:1.87   Tue Dec 21 05:49:59 2004
+++ kaffe/kaffe/kaffevm/thread.c        Tue Dec 21 16:51:05 2004
@@ -249,12 +249,19 @@
         /*
         * set context class loader of primordial thread to app classloader
         * must not be done earlier, since getCurrentThread() won't work
-         * before the KTHREAD(createfirst) and the jthreadID assignment
+         * before the KTHREAD(createfirst) and the jthreadID assignment.
+        *
+        * If we're creating the Thread instance of the main thread, this
+        * will trigger the initialization process of the java part of the
+        * runtime. One pitfall during initialization is that java.lang.System
+        * has to be initialized before kaffe.lang.AppClassLoader. Therefore,
+        * we cannot call AppClassLoader.getSingleton() here, since that would
+        * cause System and AppClassLoader to be initialized in the wrong order.
         */
-         do_execute_java_class_method (&retval, "kaffe/lang/AppClassLoader",
-                                       NULL,
-                                       "getSingleton",
-                                       "()Ljava/lang/ClassLoader;");
+       do_execute_java_class_method (&retval, "java/lang/ClassLoader",
+                                     NULL,
+                                     "getSystemClassLoader",
+                                     "()Ljava/lang/ClassLoader;");
         unhand(tid)->contextClassLoader = (struct Hjava_lang_ClassLoader *) 
retval.l;
 
        /* Attach thread to threadGroup */
Index: kaffe/libraries/clib/native/Class.c
diff -u kaffe/libraries/clib/native/Class.c:1.77 
kaffe/libraries/clib/native/Class.c:1.78
--- kaffe/libraries/clib/native/Class.c:1.77    Tue Dec 21 05:49:58 2004
+++ kaffe/libraries/clib/native/Class.c Tue Dec 21 16:51:13 2004
@@ -289,7 +289,13 @@
 void
 java_lang_Class_setSigners(struct Hjava_lang_Class* this, HArrayOfObject* sigs)
 {
-       this->signers = sigs;
+       unhand(this)->signers = sigs;
+}
+
+struct Hjava_lang_Object*
+java_lang_Class_getProtectionDomain (struct Hjava_lang_Class* this)
+{
+       return unhand(this)->protectionDomain;
 }
 
 /*
Index: kaffe/libraries/clib/native/ClassLoader.c
diff -u kaffe/libraries/clib/native/ClassLoader.c:1.39 
kaffe/libraries/clib/native/ClassLoader.c:1.40
--- kaffe/libraries/clib/native/ClassLoader.c:1.39      Fri May 21 15:19:24 2004
+++ kaffe/libraries/clib/native/ClassLoader.c   Tue Dec 21 16:51:13 2004
@@ -31,7 +31,8 @@
  * Translate an array of bytes into a class.
  */
 struct Hjava_lang_Class*
-java_lang_ClassLoader_defineClass0(struct Hjava_lang_ClassLoader* this, struct 
Hjava_lang_String* name, HArrayOfByte* data, jint offset, jint length)
+java_lang_VMClassLoader_defineClass(struct Hjava_lang_ClassLoader* this, 
struct Hjava_lang_String* name,
+                                   HArrayOfByte* data, jint offset, jint 
length, struct Hjava_lang_Object* protectionDomain)
 {
        Hjava_lang_Class *clazz, *dup_clazz;
        classFile hand;
@@ -67,6 +68,9 @@
                throwError(&info);
        }
 
+       /* set protection domain of new class */
+       unhand(clazz)->protectionDomain = protectionDomain;
+
        /*
         * See if an entry for that name and class loader already exists
         * create one if not.
@@ -116,9 +120,10 @@
  * Resolve classes reference by this class.
  */
 void
-java_lang_ClassLoader_resolveClass0(struct Hjava_lang_ClassLoader* this 
UNUSED, struct Hjava_lang_Class* class)
+java_lang_VMClassLoader_resolveClass(struct Hjava_lang_Class* class)
 {
        errorInfo info;
+
        if (processClass(class, CSTATE_COMPLETE, &info) == false) {
                throwError(&info);
        }
Index: kaffe/libraries/clib/native/Makefile.am
diff -u kaffe/libraries/clib/native/Makefile.am:1.37 
kaffe/libraries/clib/native/Makefile.am:1.38
--- kaffe/libraries/clib/native/Makefile.am:1.37        Wed Dec  8 07:22:12 2004
+++ kaffe/libraries/clib/native/Makefile.am     Tue Dec 21 16:51:13 2004
@@ -29,7 +29,6 @@
                Float.c \
                Math.c \
                MemoryAdvice.c \
-               NativeLibrary.c \
                Object.c \
                PrimordialClassLoader.c \
                Runtime.c \
Index: kaffe/libraries/clib/native/Makefile.in
diff -u kaffe/libraries/clib/native/Makefile.in:1.163 
kaffe/libraries/clib/native/Makefile.in:1.164
--- kaffe/libraries/clib/native/Makefile.in:1.163       Wed Dec  8 07:22:12 2004
+++ kaffe/libraries/clib/native/Makefile.in     Tue Dec 21 16:51:13 2004
@@ -95,7 +95,7 @@
 am__objects_2 = libnative_la-Class.lo libnative_la-ClassLoader.lo \
        libnative_la-Double.lo libnative_la-Float.lo \
        libnative_la-Math.lo libnative_la-MemoryAdvice.lo \
-       libnative_la-NativeLibrary.lo libnative_la-Object.lo \
+       libnative_la-Object.lo \
        libnative_la-PrimordialClassLoader.lo libnative_la-Runtime.lo \
        libnative_la-String.lo libnative_la-System.lo \
        libnative_la-Thread.lo libnative_la-ThreadStack.lo \
@@ -412,7 +412,6 @@
                Float.c \
                Math.c \
                MemoryAdvice.c \
-               NativeLibrary.c \
                Object.c \
                PrimordialClassLoader.c \
                Runtime.c \
@@ -548,7 +547,6 @@
 @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]@
@@ -653,13 +651,6 @@
 @AMDEP_TRUE@@am__fastdepCC_FALSE@      source='MemoryAdvice.c' 
object='libnative_la-MemoryAdvice.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) 
$(libnative_la_CFLAGS) $(CFLAGS) -c -o libnative_la-MemoryAdvice.lo `test -f 
'MemoryAdvice.c' || echo '$(srcdir)/'`MemoryAdvice.c
-
-libnative_la-NativeLibrary.lo: NativeLibrary.c
[EMAIL PROTECTED]@      if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libnative_la_CFLAGS) $(CFLAGS) -MT libnative_la-NativeLibrary.lo -MD -MP -MF 
"$(DEPDIR)/libnative_la-NativeLibrary.Tpo" -c -o libnative_la-NativeLibrary.lo 
`test -f 'NativeLibrary.c' || echo '$(srcdir)/'`NativeLibrary.c; \
[EMAIL PROTECTED]@      then mv -f "$(DEPDIR)/libnative_la-NativeLibrary.Tpo" 
"$(DEPDIR)/libnative_la-NativeLibrary.Plo"; else rm -f 
"$(DEPDIR)/libnative_la-NativeLibrary.Tpo"; exit 1; fi
[EMAIL PROTECTED]@@am__fastdepCC_FALSE@ source='NativeLibrary.c' 
object='libnative_la-NativeLibrary.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) 
$(libnative_la_CFLAGS) $(CFLAGS) -c -o libnative_la-NativeLibrary.lo `test -f 
'NativeLibrary.c' || echo '$(srcdir)/'`NativeLibrary.c
 
 libnative_la-Object.lo: Object.c
 @am__fastdepCC_TRUE@   if $(LIBTOOL) --tag=CC --mode=compile $(CC) $(DEFS) 
$(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) 
$(libnative_la_CFLAGS) $(CFLAGS) -MT libnative_la-Object.lo -MD -MP -MF 
"$(DEPDIR)/libnative_la-Object.Tpo" -c -o libnative_la-Object.lo `test -f 
'Object.c' || echo '$(srcdir)/'`Object.c; \
===================================================================
Checking out kaffe/libraries/clib/native/NativeLibrary.c
RCS:  /home/cvs/kaffe/kaffe/libraries/clib/native/Attic/NativeLibrary.c,v
VERS: 1.6
***************
--- kaffe/libraries/clib/native/NativeLibrary.c Tue Dec 21 16:56:29 2004
+++ /dev/null   Sun Aug  4 19:57:58 2002
@@ -1,95 +0,0 @@
-
-/*
- * java.lang.NativeLibrary.c
- *
- * Copyright (c) 2000
- *     Archie L. Cobbs.  All rights reserved.
- * Copyright (c) 2000
- *     Transvirtual Technologies, Inc.  All rights reserved.
- *
- * See the file "license.terms" for information on usage and redistribution 
- * of this file. 
- */
-
-#include "config.h"
-#include "config-std.h"
-#include "config-io.h"
-#include "config-mem.h"
-#include "defs.h"
-#include "gtypes.h"
-#include "object.h"
-#include "constants.h"
-#include "support.h"
-#include "external.h"
-#include "java_lang_String.h"
-#include "java_lang_NativeLibrary.h"
-#include <native.h>
-
-#ifndef LIBRARYPREFIX
-#define        LIBRARYPREFIX   "lib"
-#endif
-
-#ifndef LIBRARYSUFFIX
-#define LIBRARYSUFFIX  ""
-#endif
-
-/*
- * Return prefix to prepend to library names
- */
-struct Hjava_lang_String*
-java_lang_NativeLibrary_getLibPrefix(void)
-{
-       return checkPtr(stringC2Java(LIBRARYPREFIX));
-}
-
-/*
- * Return suffix to append to library names
- */
-struct Hjava_lang_String*
-java_lang_NativeLibrary_getLibSuffix(void)
-{
-       return checkPtr(stringC2Java(LIBRARYSUFFIX));
-}
-
-/*
- * Attempt to link in a shared library. Throws an UnsatisfiedLinkError
- * if the attempt fails.
- */
-int
-java_lang_NativeLibrary_linkLibrary(struct Hjava_lang_String *jpath)
-{
-       char path[MAXPATHLEN];
-       char errbuf[128];
-       errorInfo einfo;
-       int i = -1;
-
-       stringJava2CBuf(jpath, path, sizeof(path));
-       if ((i = loadNativeLibrary(path, errbuf, sizeof(errbuf))) < 0) {
-               if( strstr(errbuf, "File not found") ) {
-                       postExceptionMessage(&einfo,
-                                            JAVA_IO(FileNotFoundException),
-                                            "%s",
-                                            path);
-               } else {
-                       postExceptionMessage(&einfo, 
-                                            JAVA_LANG(UnsatisfiedLinkError),
-                                            "%s",
-                                            errbuf);
-                       throwError(&einfo);
-               }
-       }
-       if( i == -1 )
-               throwError(&einfo);
-
-       return i;
-}
-
-/*
- * Unlink a shared library.
- */
-void
-java_lang_NativeLibrary_unlinkLibrary(int i)
-{
-       unloadNativeLibrary(i);
-}
-
Index: kaffe/libraries/clib/native/Runtime.c
diff -u kaffe/libraries/clib/native/Runtime.c:1.29 
kaffe/libraries/clib/native/Runtime.c:1.30
--- kaffe/libraries/clib/native/Runtime.c:1.29  Mon Dec 20 03:40:03 2004
+++ kaffe/libraries/clib/native/Runtime.c       Tue Dec 21 16:51:15 2004
@@ -17,11 +17,21 @@
 #include "files.h"
 #include "defs.h"
 #include "java_io_File.h"
+#include "java_lang_String.h"
 #include "java_lang_Runtime.h"
 #include "external.h"
 #include "gc.h"
 #include "support.h"
 #include "stringSupport.h"
+#include "external.h"
+
+#ifndef LIBRARYPREFIX
+#define        LIBRARYPREFIX   "lib"
+#endif
+
+#ifndef LIBRARYSUFFIX
+#define LIBRARYSUFFIX  ""
+#endif
 
 extern jboolean runFinalizerOnExit;
 
@@ -130,4 +140,47 @@
 java_lang_Runtime_runFinalizersOnExit(jboolean on)
 {
        runFinalizerOnExit = on;
+}
+
+
+/*
+ * Attempt to link in a shared library. Throws an UnsatisfiedLinkError
+ * if the attempt fails.
+ */
+jboolean
+java_lang_Runtime_linkLibrary(struct Hjava_lang_String *jpath, struct 
Hjava_lang_ClassLoader* loader)
+{
+       char path[MAXPATHLEN];
+       char errbuf[128];
+       errorInfo einfo;
+
+       stringJava2CBuf(jpath, path, sizeof(path));
+       if (loadNativeLibrary(path, loader, errbuf, sizeof(errbuf)) < 0) {
+               if( strstr(errbuf, ": not found") ) {
+                       /* simply proceed if file was not found, java part
+                        * will throw an exception later if library could
+                        * not be found.
+                        */
+                       return false;
+               } else {
+                       postExceptionMessage(&einfo, 
+                                            JAVA_LANG(UnsatisfiedLinkError),
+                                            "%s",
+                                            errbuf);
+                       throwError(&einfo);
+               }
+       }
+       return true;
+}
+
+struct Hjava_lang_String*
+java_lang_Runtime_getLibPrefix()
+{
+       return checkPtr(stringC2Java(LIBRARYPREFIX));
+}
+
+struct Hjava_lang_String*
+java_lang_Runtime_getLibSuffix()
+{
+       return checkPtr(stringC2Java(LIBRARYSUFFIX));
 }
Index: kaffe/libraries/javalib/Makefile.am
diff -u kaffe/libraries/javalib/Makefile.am:1.278 
kaffe/libraries/javalib/Makefile.am:1.279
--- kaffe/libraries/javalib/Makefile.am:1.278   Tue Dec 21 08:47:11 2004
+++ kaffe/libraries/javalib/Makefile.am Tue Dec 21 16:51:06 2004
@@ -1508,6 +1508,7 @@
        gnu/java/text/StringFormatBuffer.java \
        gnu/java/text/WordBreakIterator.java
 gnu_java_util_SRCS = \
+       gnu/java/util/DoubleEnumeration.java \
        gnu/java/util/EmptyEnumeration.java
 gnu_java_util_prefs_SRCS = \
        gnu/java/util/prefs/FileBasedFactory.java \
@@ -2300,7 +2301,6 @@
        java/lang/LinkageError.java \
        java/lang/Long.java \
        java/lang/Math.java \
-       java/lang/NativeLibrary.java \
        java/lang/NegativeArraySizeException.java \
        java/lang/NoClassDefFoundError.java \
        java/lang/NoSuchFieldError.java \
@@ -2338,6 +2338,9 @@
        java/lang/UnsatisfiedLinkError.java \
        java/lang/UnsupportedClassVersionError.java \
        java/lang/UnsupportedOperationException.java \
+       java/lang/VerifyError.java \
+       java/lang/VirtualMachineError.java \
+       java/lang/VMClassLoader.java \
        java/lang/VMCompiler.java \
        java/lang/VMObject.java \
        java/lang/VMSecurityManager.java \
Index: kaffe/libraries/javalib/Makefile.in
diff -u kaffe/libraries/javalib/Makefile.in:1.359 
kaffe/libraries/javalib/Makefile.in:1.360
--- kaffe/libraries/javalib/Makefile.in:1.359   Tue Dec 21 08:47:14 2004
+++ kaffe/libraries/javalib/Makefile.in Tue Dec 21 16:51:07 2004
@@ -1945,6 +1945,7 @@
        gnu/java/text/WordBreakIterator.java
 
 gnu_java_util_SRCS = \
+       gnu/java/util/DoubleEnumeration.java \
        gnu/java/util/EmptyEnumeration.java
 
 gnu_java_util_prefs_SRCS = \
@@ -2772,7 +2773,6 @@
        java/lang/LinkageError.java \
        java/lang/Long.java \
        java/lang/Math.java \
-       java/lang/NativeLibrary.java \
        java/lang/NegativeArraySizeException.java \
        java/lang/NoClassDefFoundError.java \
        java/lang/NoSuchFieldError.java \
@@ -2810,6 +2810,9 @@
        java/lang/UnsatisfiedLinkError.java \
        java/lang/UnsupportedClassVersionError.java \
        java/lang/UnsupportedOperationException.java \
+       java/lang/VerifyError.java \
+       java/lang/VirtualMachineError.java \
+       java/lang/VMClassLoader.java \
        java/lang/VMCompiler.java \
        java/lang/VMObject.java \
        java/lang/VMSecurityManager.java \
Index: kaffe/libraries/javalib/all.files
diff -u kaffe/libraries/javalib/all.files:1.59 
kaffe/libraries/javalib/all.files:1.60
--- kaffe/libraries/javalib/all.files:1.59      Tue Dec 21 08:47:15 2004
+++ kaffe/libraries/javalib/all.files   Tue Dec 21 16:51:08 2004
@@ -1838,7 +1838,6 @@
 java/lang/LinkageError.java
 java/lang/Long.java
 java/lang/Math.java
-java/lang/NativeLibrary.java
 java/lang/NegativeArraySizeException.java
 java/lang/NoClassDefFoundError.java
 java/lang/NoSuchFieldError.java
Index: kaffe/libraries/javalib/bootstrap.classlist
diff -u kaffe/libraries/javalib/bootstrap.classlist:1.65 
kaffe/libraries/javalib/bootstrap.classlist:1.66
--- kaffe/libraries/javalib/bootstrap.classlist:1.65    Wed Dec  8 08:05:29 2004
+++ kaffe/libraries/javalib/bootstrap.classlist Tue Dec 21 16:51:08 2004
@@ -98,7 +98,6 @@
 java/lang/LinkageError.class
 java/lang/Long.class
 java/lang/Math.class
-java/lang/NativeLibrary.class
 java/lang/NegativeArraySizeException.class
 java/lang/NoClassDefFoundError.class
 java/lang/NoSuchMethodException.class
===================================================================
Checking out kaffe/libraries/javalib/gnu/java/util/DoubleEnumeration.java
RCS:  
/home/cvs/kaffe/kaffe/libraries/javalib/gnu/java/util/DoubleEnumeration.java,v
VERS: 1.1
***************
--- /dev/null   Sun Aug  4 19:57:58 2002
+++ kaffe/libraries/javalib/gnu/java/util/DoubleEnumeration.java        Tue Dec 
21 16:56:33 2004
@@ -0,0 +1,138 @@
+/* gnu.java.util.DoubleEnumeration
+   Copyright (C) 1998, 1999, 2001 Free Software Foundation, Inc.
+
+This file is part of GNU Classpath.
+
+GNU Classpath is free software; you can redistribute it and/or modify
+it under the terms of the GNU General Public License as published by
+the Free Software Foundation; either version 2, or (at your option)
+any later version.
+
+GNU Classpath is distributed in the hope that it will be useful, but
+WITHOUT ANY WARRANTY; without even the implied warranty of
+MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+General Public License for more details.
+
+You should have received a copy of the GNU General Public License
+along with GNU Classpath; see the file COPYING.  If not, write to the
+Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
+02111-1307 USA.
+
+Linking this library statically or dynamically with other modules is
+making a combined work based on this library.  Thus, the terms and
+conditions of the GNU General Public License cover the whole
+combination.
+
+As a special exception, the copyright holders of this library give you
+permission to link this library with independent modules to produce an
+executable, regardless of the license terms of these independent
+modules, and to copy and distribute the resulting executable under
+terms of your choice, provided that you also meet, for each linked
+independent module, the terms and conditions of the license of that
+module.  An independent module is a module which is not derived from
+or based on this library.  If you modify this library, you may extend
+this exception to your version of the library, but you are not
+obligated to do so.  If you do not wish to do so, delete this
+exception statement from your version. */
+
+package gnu.java.util;
+
+import java.util.Enumeration;
+import java.util.NoSuchElementException;
+
+
+/**
+ * This is a helper class that combines two Enumerations.
+ * It returns the elements of the first Enumeration until it has
+ * no more elements and then returns the elements of the second
+ * Enumeration.<br>
+ * 
+ * In the default case:
+ * <pre>
+ * doubleEnum = new DoubleEnumeration(enum1, enum2);
+ * while (doubleEnum.hasMoreElements()) {
+ *    Object o = doubleEnum.nextElement();
+ *    do_something(o);
+ * }
+ * </pre>
+ * it calls hasMoreElements of the Enumerations as few times as
+ * possible.
+ * The references to the Enumerations are cleared as soon as they have no
+ * more elements to help garbage collecting.
+ *
+ * @author Jochen Hoenicke
+ * @author Mark Wielaard ([EMAIL PROTECTED])
+ */
+public class DoubleEnumeration implements Enumeration
+{
+  /**
+   * This is true as long as one of the enumerations has more
+   * elements.  
+   * Only valid when hasChecked is true.
+   * Set in <code>hasMoreElements()</code>
+   */
+  private boolean hasMore;
+  /**
+   * This is true, if it is sure that hasMore indicates wether there are
+   * more elements.
+   * Set to true in <code>hasMoreElements()</code>.
+   * Set to false in <code>getNextElement()</code>.
+   */
+  private boolean hasChecked;
+  /**
+   * The first enumeration.
+   */
+  private Enumeration e1;
+  /**
+   * The second enumeration.
+   */
+  private Enumeration e2;
+
+  /**
+   * Creates a new Enumeration combining the given two enumerations.
+   * The enumerations mustn't be accessed by other classes.
+   */
+  public DoubleEnumeration(Enumeration e1, Enumeration e2)
+  {
+    this.e1 = e1;
+    this.e2 = e2;
+    hasChecked = false;
+  }
+
+  /**
+   * Returns true, if at least one of the two enumerations has more
+   * elements.
+   */
+  public boolean hasMoreElements()
+  {
+    if (hasChecked)
+      return hasMore;
+
+    hasMore = (e1 != null && e1.hasMoreElements());
+
+    if (!hasMore) {
+      e1 = e2;
+      e2 = null;
+      hasMore = (e1 != null && e1.hasMoreElements());
+    }
+
+    hasChecked = true;
+    return hasMore;
+  }
+
+  /**
+   * Returns the next element.  This returns the next element of the
+   * first enumeration, if it has more elements, otherwise the next
+   * element of the second enumeration. If both enumeration don't have
+   * any elements it throws a <code>NoSuchElementException</code>.
+   */
+  public Object nextElement()
+  {
+    if (!hasMoreElements())
+      throw new NoSuchElementException();
+    else {
+      hasChecked = false;

*** Patch too long, truncated ***

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

Reply via email to