[kaffe] CVS kaffe (hkraemer): merged java.lang.ClassLoader from GNU Classpath

Kaffe CVS cvs-commits at kaffe.org
Tue Dec 21 08:56:33 PST 2004


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  <hkraemer at freenet.de>
 
+	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  <hkraemer at freenet.de>
+
 	* 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@ @am__quote at ./$(DEPDIR)/libnative_la-Math.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-MemoryAdvice.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-Method.Plo at am__quote@
- at AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-NativeLibrary.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-Object.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-PrimordialClassLoader.Plo at am__quote@
 @AMDEP_TRUE@@am__include@ @am__quote at ./$(DEPDIR)/libnative_la-Runtime.Plo at am__quote@
@@ -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
- at am__fastdepCC_TRUE@	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; \
- at am__fastdepCC_TRUE@	then mv -f "$(DEPDIR)/libnative_la-NativeLibrary.Tpo" "$(DEPDIR)/libnative_la-NativeLibrary.Plo"; else rm -f "$(DEPDIR)/libnative_la-NativeLibrary.Tpo"; exit 1; fi
- at AMDEP_TRUE@@am__fastdepCC_FALSE@	source='NativeLibrary.c' object='libnative_la-NativeLibrary.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) $(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 (mark at klomp.org)
+ */
+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 ***



More information about the kaffe mailing list