[kaffe] CVS kaffe (hkraemer): new gc allocation types and minor fixes

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Mon Sep 22 08:34:02 2003


PatchSet 4055 
Date: 2003/09/22 15:31:22
Author: hkraemer
Branch: HEAD
Tag: (none) 
Log:
new gc allocation types and minor fixes

* Added several new gc allocation types so it's easier
to see how kaffe allocates memory.

* Modified our class loading stuff so it calls the correct
loadClass method of user class loaders.

* Searches for static fields now also consider implemented
interfaces; this is necessary since these fields need not
be included in the classfile itself (just the same as with
the miranda methods)

Members: 
	ChangeLog:1.1650->1.1651 
	kaffe/kaffevm/access.c:1.2->1.3 
	kaffe/kaffevm/classMethod.c:1.110->1.111 
	kaffe/kaffevm/classPool.c:1.21->1.22 
	kaffe/kaffevm/code-analyse.c:1.38->1.39 
	kaffe/kaffevm/code-analyse.h:1.17->1.18 
	kaffe/kaffevm/code.c:1.10->1.11 
	kaffe/kaffevm/exception.c:1.72->1.73 
	kaffe/kaffevm/external.c:1.49->1.50 
	kaffe/kaffevm/gc.h:1.19->1.20 
	kaffe/kaffevm/gcFuncs.c:1.48->1.49 
	kaffe/kaffevm/inflate.c:1.10->1.11 
	kaffe/kaffevm/locks.c:1.45->1.46 
	kaffe/kaffevm/lookup.c:1.33->1.34 
	kaffe/kaffevm/string.c:1.26->1.27 
	kaffe/kaffevm/support.h:1.24->1.25 
	kaffe/kaffevm/verify.c:1.27->1.28 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1650 kaffe/ChangeLog:1.1651
--- kaffe/ChangeLog:1.1650	Mon Sep 22 14:29:16 2003
+++ kaffe/ChangeLog	Mon Sep 22 15:31:22 2003
@@ -1,3 +1,36 @@
+2003-09-22  Helmer Kraemer  <hkraemer@freenet.de>
+
+	* kaffe/kaffevm/access.c: (findSuperMethod) minor tweak
+	to bail out immediately when the method is found
+	
+	* kaffe/kaffevm/classMethod.c: (userLoadClass) call
+	loadClass(String) instead of loadClass(String,boolean)
+	as per spec
+	(lookupClassField) search implemented interfaces when
+	searching for static fields; pass the class that owns
+	the field to resolveFieldType, not the class where we
+	started the search
+
+	* kaffe/kaffevm/exception.c: (throwException) when
+	allocating a new VMThrowable, we must also assign
+	it to eobj->vmState, so we don't loose stack traces
+	(floatingException) don't create the stack trace twice
+
+	* kaffe/kaffevm/lookup.c: (getField) initialise ret->class
+	with the class that owns the field, not the class that was
+	passed to getField
+
+	* kaffe/kaffevm/locks.c: (getHeavyLock) minor tweak so
+	we don't leak a heavy lock
+	
+	* kaffe/kaffevm/classMethod.c, kaffe/kaffevm/classPool.c,
+	kaffe/kaffevm/code-analyse.c, kaffe/kaffevm/code-analyse.h,
+	kaffe/kaffevm/code.c, kaffe/kaffevm/external.c,
+	kaffe/kaffevm/gc.h, kaffe/kaffevm/gcFuncs.c,
+	kaffe/kaffevm/inflate.c, kaffe/kaffevm/string.c,
+	kaffe/kaffevm/support.h, kaffe/kaffevm/verify.c:
+	added several new allocation types to the gc
+
 2003-09-22  Dalibor Topic <robilad@kaffe.org>
 
 	* developers/patch-libtool-ltdl-memory-header-warning.diff:
Index: kaffe/kaffe/kaffevm/access.c
diff -u kaffe/kaffe/kaffevm/access.c:1.2 kaffe/kaffe/kaffevm/access.c:1.3
--- kaffe/kaffe/kaffevm/access.c:1.2	Mon Sep  1 03:06:58 2003
+++ kaffe/kaffe/kaffevm/access.c	Mon Sep 22 15:31:24 2003
@@ -203,7 +203,7 @@
 	{
 		int lpc;
 
-		for( lpc = 0; lpc < CLASS_NMETHODS(cl); lpc++ )
+		for( lpc = 0; lpc < CLASS_NMETHODS(cl) && !retval; lpc++ )
 		{
 			if( CLASS_METHODS(cl)[lpc].idx == meth->idx )
 			{
Index: kaffe/kaffe/kaffevm/classMethod.c
diff -u kaffe/kaffe/kaffevm/classMethod.c:1.110 kaffe/kaffe/kaffevm/classMethod.c:1.111
--- kaffe/kaffe/kaffevm/classMethod.c:1.110	Mon Sep  1 03:06:58 2003
+++ kaffe/kaffe/kaffevm/classMethod.c	Mon Sep 22 15:31:24 2003
@@ -690,9 +690,9 @@
 	}
 	else
 	*/
-	if( (new_methods = KREALLOC(CLASS_METHODS(cl),
-					 sizeof(Method) *
-					 (CLASS_NMETHODS(cl) + 1))) )
+	if( (new_methods = gc_realloc(CLASS_METHODS(cl),
+				      sizeof(Method) *
+				      (CLASS_NMETHODS(cl) + 1), GC_ALLOC_METHOD)) )
 	{
 		int index;
 		
@@ -1020,7 +1020,7 @@
 	} else {
 		basename++;
 	}
-	c->sourcefile = KMALLOC(strlen(basename) + 1);
+	c->sourcefile = gc_malloc(strlen(basename) + 1, GC_ALLOC_CLASSMISC);
 	if (c->sourcefile != 0) {
 		strcpy(c->sourcefile, basename);
 	} else {
@@ -1055,7 +1055,7 @@
 	if (! checkBufSize(fp, nr*(2*4), CLASS_CNAME(c), einfo))
 	    return false;
 
-	ic = KMALLOC(sizeof(innerClass) * nr);
+	ic = gc_malloc(sizeof(innerClass) * nr, GC_ALLOC_CLASSMISC);
 	if (!ic) {
 		postOutOfMemory(einfo);
 		return false;
@@ -1361,7 +1361,7 @@
 		env,
 		(*env)->GetObjectClass(env, loader),
 		"loadClass",
-		"(Ljava/lang/String;Z)Ljava/lang/Class;")) )
+		"(Ljava/lang/String;)Ljava/lang/Class;")) )
 	{
 		jthrowable excobj;
 		
@@ -1369,8 +1369,7 @@
 			(*env)->CallObjectMethod(env,
 						 loader,
 						 meth,
-						 jname,
-						 false);
+						 jname);
 		
 		/*
 		 * Check whether an exception occurred.  If one was pending,
@@ -1717,7 +1716,7 @@
 	 * a bitmap to help the gc scan the object.  The first part is
 	 * inherited from the superclass.
 	 */
-	map = BITMAP_NEW(CLASS_FSIZE(class)/ALIGNMENTOF_VOIDP);
+	map = BITMAP_NEW(CLASS_FSIZE(class)/ALIGNMENTOF_VOIDP, GC_ALLOC_CLASSMISC);
 	if (map == 0) {
 		postOutOfMemory(einfo);
 		return (false);
@@ -1998,7 +1997,7 @@
 
 	if (methodNeedsTrampoline(meth)) {
 		/* XXX don't forget to pick those up at class gc time */
-		tramp = (methodTrampoline*)KMALLOC(sizeof(methodTrampoline));
+		tramp = (methodTrampoline*)gc_malloc(sizeof(methodTrampoline), GC_ALLOC_TRAMPOLINE);
 		if (tramp == 0) {
 			postOutOfMemory(einfo);
 			return (0);
@@ -2192,7 +2191,7 @@
 		return (true);
 	}
 
-	class->if2itable = KMALLOC(class->total_interface_len * sizeof(short));
+	class->if2itable = gc_malloc(class->total_interface_len * sizeof(short), GC_ALLOC_CLASSMISC);
 
 	if (class->if2itable == 0) {
 		postOutOfMemory(einfo);
@@ -2206,7 +2205,7 @@
 		j += 1;		/* add one word to store interface class */
 		j += class->interfaces[i]->msize;
 	}
-	class->itable2dtable = KMALLOC(j * sizeof(void *));
+	class->itable2dtable = gc_malloc(j * sizeof(void *), GC_ALLOC_CLASSMISC);
 	if (class->itable2dtable == 0) {
 		postOutOfMemory(einfo);
 		return (false);
@@ -2385,16 +2384,16 @@
 			short firstnewentry;
 			if (iface->implementors == NULL) {
 				len = (i + 1) + 4; /* 4 is slack only */
-				iface->implementors = KMALLOC(len * sizeof(short));
+				iface->implementors = gc_malloc(len * sizeof(short), GC_ALLOC_CLASSMISC);
 			} else {
 				/* double in size */
 				len = iface->implementors[0] * 2;
 				if (len <= i) {
 					len = i + 4;
 				}
-				iface->implementors = KREALLOC(
+				iface->implementors = gc_realloc(
 					iface->implementors,
-					len * sizeof(short));
+					len * sizeof(short), GC_ALLOC_CLASSMISC);
 			}
 
 			if (iface->implementors == 0) {
@@ -2603,6 +2602,7 @@
 		}
 		fptr++;
 	}
+
 	return (0);
 }
 
@@ -2619,15 +2619,34 @@
 		fptr = lookupClassFieldLocal(c, name, isStatic);
 		if (fptr) {
 			/* Resolve field if necessary */
-			if (resolveFieldType(fptr, clp, einfo) == 0) {
+			if (resolveFieldType(fptr, c, einfo) == 0) {
 				return (NULL);
 			}
 			return (fptr);
 		}
 	}
+
+	if (isStatic) {
+		int i = clp->total_interface_len;
+		Hjava_lang_Class **cp = &clp->interfaces[0];
+
+		while (--i >= 0) {
+			fptr = lookupClassFieldLocal (*cp, name, true);
+
+			if (fptr) {
+				if (resolveFieldType(fptr, *cp, einfo) == 0) {
+					return (NULL);
+				}
+				return (fptr);
+			}
+			cp++;
+		}	
+
+	}
+
 DBG(RESERROR,
-	dprintf("lookupClassField failed %s:%s\n",
-		clp->name->data, name->data);
+	dprintf("lookupClassField for %s failed %s:%s\n",
+		isStatic?"static":"non-static",clp->name->data, name->data);
     )
 	postExceptionMessage(einfo, JAVA_LANG(NoSuchFieldError), "%s", name->data);
 	return (0);
@@ -2788,7 +2807,7 @@
 
 	nargs = countArgsInSignature(signature->data);
 	sig = (parsed_signature_t*)gc_malloc(sizeof(*sig) +
-					     nargs * sizeof(sig->ret_and_args[0]), GC_ALLOC_FIXED);
+					     nargs * sizeof(sig->ret_and_args[0]), GC_ALLOC_CLASSMISC);
 	if (sig == NULL) {
 		postOutOfMemory(einfo);
 		return (NULL);
Index: kaffe/kaffe/kaffevm/classPool.c
diff -u kaffe/kaffe/kaffevm/classPool.c:1.21 kaffe/kaffe/kaffevm/classPool.c:1.22
--- kaffe/kaffe/kaffevm/classPool.c:1.21	Sun Jul 27 16:53:46 2003
+++ kaffe/kaffe/kaffevm/classPool.c	Mon Sep 22 15:31:24 2003
@@ -77,7 +77,7 @@
 		return (entry);
 
 	/* Failed to find class entry - create a new one */
-	entry = KMALLOC(sizeof(classEntry));
+	entry = gc_malloc(sizeof(classEntry), GC_ALLOC_CLASSPOOL);
 	if (entry == 0) {
 		postOutOfMemory(einfo);
 		return (0);
Index: kaffe/kaffe/kaffevm/code-analyse.c
diff -u kaffe/kaffe/kaffevm/code-analyse.c:1.38 kaffe/kaffe/kaffevm/code-analyse.c:1.39
--- kaffe/kaffe/kaffevm/code-analyse.c:1.38	Mon Jul  7 13:46:35 2003
+++ kaffe/kaffe/kaffevm/code-analyse.c	Mon Sep 22 15:31:24 2003
@@ -89,8 +89,8 @@
 		return false;
 	}
 
-	codeInfo = KMALLOC(sizeof(codeinfo) + (meth->c.bcode.codelen *
-					       sizeof(perPCInfo)));
+	codeInfo = gc_malloc(sizeof(codeinfo) + meth->c.bcode.codelen*sizeof(perPCInfo),
+			     GC_ALLOC_CODEANALYSE);
 	*pcodeinfo = codeInfo;
 	if (!codeInfo) {
 		postOutOfMemory(einfo);
@@ -99,7 +99,7 @@
 	/* Allocate space for local register info - we add in an extra one
 	 * to avoid mallocing 0 bytes.
 	 */
-	localuse = KCALLOC(sizeof(localUse), meth->localsz+1);
+	localuse = gc_malloc(sizeof(localUse) * (meth->localsz+1), GC_ALLOC_CODEANALYSE);
 	if (!localuse) {
 		KFREE(codeInfo);
 		postOutOfMemory(einfo);
Index: kaffe/kaffe/kaffevm/code-analyse.h
diff -u kaffe/kaffe/kaffevm/code-analyse.h:1.17 kaffe/kaffe/kaffevm/code-analyse.h:1.18
--- kaffe/kaffe/kaffevm/code-analyse.h:1.17	Thu Feb  6 21:35:07 2003
+++ kaffe/kaffe/kaffevm/code-analyse.h	Mon Sep 22 15:31:24 2003
@@ -147,7 +147,7 @@
 					  IS_STARTOFEXCEPTION(pc)) && \
 					  !IS_DONEVERIFY(pc))
 
-#define	ALLOCFRAME()			KMALLOC((codeInfo->stacksz+codeInfo->localsz+1) * sizeof(frameElement))
+#define	ALLOCFRAME()			gc_malloc((codeInfo->stacksz+codeInfo->localsz+1) * sizeof(frameElement), GC_ALLOC_CODEANALYSE)
 
 #define	ATTACH_NEW_BASICBLOCK(DPC)				\
 	if ((DPC) != 0 && !IS_STARTOFBASICBLOCK(DPC) &&		\
Index: kaffe/kaffe/kaffevm/code.c
diff -u kaffe/kaffe/kaffevm/code.c:1.10 kaffe/kaffe/kaffevm/code.c:1.11
--- kaffe/kaffe/kaffevm/code.c:1.10	Sun Aug 31 22:09:01 2003
+++ kaffe/kaffe/kaffevm/code.c	Mon Sep 22 15:31:24 2003
@@ -139,7 +139,7 @@
 
 	readu2(&nr, fp);
 
-	lines = KMALLOC(sizeof(lineNumbers)+sizeof(lineNumberEntry) * nr);
+	lines = gc_malloc(sizeof(lineNumbers)+sizeof(lineNumberEntry) * nr, GC_ALLOC_LINENRTABLE);
 	if (!lines) {
 		postOutOfMemory(info);
 		return false;
@@ -177,7 +177,7 @@
 	}
 
 	m->ndeclared_exceptions = nr;
-	idx = KMALLOC(sizeof(constIndex) * nr);
+	idx = gc_malloc(sizeof(constIndex) * nr, GC_ALLOC_DECLAREDEXC);
 	if (!idx) {
 		postOutOfMemory(info);
 		return false;
Index: kaffe/kaffe/kaffevm/exception.c
diff -u kaffe/kaffe/kaffevm/exception.c:1.72 kaffe/kaffe/kaffevm/exception.c:1.73
--- kaffe/kaffe/kaffevm/exception.c:1.72	Sun Aug 31 22:09:01 2003
+++ kaffe/kaffe/kaffevm/exception.c	Mon Sep 22 15:31:24 2003
@@ -253,6 +253,7 @@
 	if (vmstate == 0) {
 		vmstate =
 		  (Hjava_lang_VMThrowable*)newObject(javaLangVMThrowable);
+		unhand(eobj)->vmState = vmstate;
 	}
 	backtrace = buildStackTrace(0);
 	unhand(vmstate)->backtrace = backtrace;
@@ -315,7 +316,7 @@
 	/* XXX */
 	_Jv_Throw(eobj); /* no return */
 #endif
-  
+
 	/* Search down exception stack for a match */
 	DBG(ELOOKUP,
 	    dprintf ("dispatchException(): %s\n", ((Hjava_lang_Object*)eobj)->dtable->class->name->data);)
@@ -489,7 +490,6 @@
 
 	ae = (Hjava_lang_Throwable*)newObject(javaLangArithmeticException);
 	vmstate = (Hjava_lang_VMThrowable*)newObject(javaLangVMThrowable);
-	backtrace = buildStackTrace(frame);
 	backtrace = buildStackTrace(frame);
 	unhand(vmstate)->backtrace = backtrace;
 	unhand(ae)->vmState = vmstate;
Index: kaffe/kaffe/kaffevm/external.c
diff -u kaffe/kaffe/kaffevm/external.c:1.49 kaffe/kaffe/kaffevm/external.c:1.50
--- kaffe/kaffe/kaffevm/external.c:1.49	Thu Sep 11 16:51:20 2003
+++ kaffe/kaffe/kaffevm/external.c	Mon Sep 22 15:31:24 2003
@@ -54,7 +54,7 @@
 
 #ifndef LIBRARYINIT
 static inline lt_ptr_t kdlmalloc(size_t len) { 
-	void *ptr = KMALLOC(len);
+	void *ptr = gc_malloc(len, GC_ALLOC_NATIVELIB);
 	addToCounter(&ltmem, "vmmem-libltdl", 1, GCSIZEOF(ptr));
 	return (ptr);
 }
@@ -62,7 +62,7 @@
 	jlong len0;
 	void *ptr;
 	len0 = (jlong)GCSIZEOF(ptr0);
-	ptr = KREALLOC(ptr0, len);
+	ptr = gc_realloc(ptr0, len, GC_ALLOC_NATIVELIB);
 	addToCounter(&ltmem, "vmmem-libltdl", 1, ((jlong)GCSIZEOF(ptr))-len0);
 	return (ptr);
 }
@@ -156,7 +156,7 @@
 	/*
 	 * Build a library path from the given library path.
 	 */
-	libraryPath = KMALLOC(len+1);
+	libraryPath = gc_malloc(len+1, GC_ALLOC_NATIVELIB);
 	addToCounter(&ltmem, "vmmem-libltdl", 1, GCSIZEOF(libraryPath));
 	if (lpath != 0) {
 		strcat(libraryPath, lpath);
@@ -305,7 +305,7 @@
 		return -1;
 	}
 
-        lib->name = KMALLOC(strlen(path)+1);
+        lib->name = gc_malloc(strlen(path)+1, GC_ALLOC_NATIVELIB);
         strcpy (lib->name, path);
 
 	lib->ref = default_refs;
Index: kaffe/kaffe/kaffevm/gc.h
diff -u kaffe/kaffe/kaffevm/gc.h:1.19 kaffe/kaffe/kaffevm/gc.h:1.20
--- kaffe/kaffe/kaffevm/gc.h:1.19	Sun Sep 21 18:18:18 2003
+++ kaffe/kaffe/kaffevm/gc.h	Mon Sep 22 15:31:24 2003
@@ -33,38 +33,53 @@
 /*
  * Garbage collector interface.
  */
+/* allocation types for different kinds of java objects */
 #define	GC_ALLOC_JAVASTRING	0
 #define	GC_ALLOC_NOWALK		1
 #define	GC_ALLOC_NORMALOBJECT	2
 #define	GC_ALLOC_PRIMARRAY	3
 #define	GC_ALLOC_REFARRAY	4
-#define	GC_ALLOC_CLASSOBJECT	5
-#define	GC_ALLOC_FINALIZEOBJECT	6
-#define	GC_ALLOC_BYTECODE	7
-#define	GC_ALLOC_EXCEPTIONTABLE	8
-#define	GC_ALLOC_JITCODE	9
-#define	GC_ALLOC_STATICDATA	10
-#define	GC_ALLOC_CONSTANT	11
-#define	GC_ALLOC_FIXED		12
-#define	GC_ALLOC_DISPATCHTABLE	13
-#define	GC_ALLOC_METHOD		14
-#define	GC_ALLOC_FIELD		15
-#define	GC_ALLOC_UTF8CONST	16
-#define	GC_ALLOC_INTERFACE	17
-#define	GC_ALLOC_LOCK		18
-#define	GC_ALLOC_THREADCTX	19
-#define	GC_ALLOC_REF		20
-#define	GC_ALLOC_JITTEMP	21
-#define	GC_ALLOC_JAVALOADER	22
-#define	GC_ALLOC_JAR	        23
-#define	GC_ALLOC_JIT_SEQ	24
-#define	GC_ALLOC_JIT_CONST	25
-#define	GC_ALLOC_JIT_ARGS	26
-#define	GC_ALLOC_JIT_FAKE_CALL	27
-#define	GC_ALLOC_JIT_SLOTS	28
-#define	GC_ALLOC_JIT_CODEBLOCK	29
-#define	GC_ALLOC_JIT_LABELS	30
-#define	GC_ALLOC_MAX_INDEX	31
+#define	GC_ALLOC_FINALIZEOBJECT	5
+#define	GC_ALLOC_JAVALOADER     6
+
+/* allocation types related to the translator engines */
+#define	GC_ALLOC_JITCODE	7
+#define	GC_ALLOC_JITTEMP	8
+#define	GC_ALLOC_JIT_SEQ	9	
+#define	GC_ALLOC_JIT_CONST	10
+#define	GC_ALLOC_JIT_ARGS	11
+#define	GC_ALLOC_JIT_FAKE_CALL	12
+#define	GC_ALLOC_JIT_SLOTS	13
+#define	GC_ALLOC_JIT_CODEBLOCK	14
+#define	GC_ALLOC_JIT_LABELS	15
+#define	GC_ALLOC_TRAMPOLINE	16
+
+/* allocation types used for java.lang.Class and its parts */
+#define	GC_ALLOC_CLASSOBJECT	17
+#define	GC_ALLOC_BYTECODE	18
+#define	GC_ALLOC_EXCEPTIONTABLE	19
+#define	GC_ALLOC_STATICDATA	20
+#define	GC_ALLOC_CONSTANT	21
+#define	GC_ALLOC_DISPATCHTABLE  22
+#define	GC_ALLOC_METHOD         23
+#define	GC_ALLOC_FIELD          24
+#define	GC_ALLOC_INTERFACE      25
+#define	GC_ALLOC_LINENRTABLE	26
+#define	GC_ALLOC_DECLAREDEXC	27
+#define	GC_ALLOC_CLASSMISC	28
+
+/* miscelanious allocation types */
+#define	GC_ALLOC_FIXED         	29
+#define	GC_ALLOC_UTF8CONST	30
+#define	GC_ALLOC_LOCK          	31
+#define	GC_ALLOC_THREADCTX      32
+#define	GC_ALLOC_REF            33
+#define	GC_ALLOC_JAR            34
+#define	GC_ALLOC_CODEANALYSE    35
+#define	GC_ALLOC_CLASSPOOL	36
+#define	GC_ALLOC_VERIFIER	37
+#define	GC_ALLOC_NATIVELIB	38
+#define	GC_ALLOC_MAX_INDEX	39
 
 /*
  * Define a COM-like GC interface.
Index: kaffe/kaffe/kaffevm/gcFuncs.c
diff -u kaffe/kaffe/kaffevm/gcFuncs.c:1.48 kaffe/kaffe/kaffevm/gcFuncs.c:1.49
--- kaffe/kaffe/kaffevm/gcFuncs.c:1.48	Sun Sep 21 18:18:18 2003
+++ kaffe/kaffe/kaffevm/gcFuncs.c	Mon Sep 22 15:31:24 2003
@@ -637,7 +637,15 @@
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_THREADCTX, "thread-ctxts");
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_REF, "gc-refs");
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_JITTEMP, "jit-temp-data");
-        GC_registerFixedTypeByIndex(gc, GC_ALLOC_JAR, "jar");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_JAR, "jar");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_CODEANALYSE, "code-analyse");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_CLASSPOOL, "class-pool");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_LINENRTABLE, "linenr-table");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_DECLAREDEXC, "declared-exc");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_CLASSMISC, "class-misc");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_VERIFIER, "verifier");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_TRAMPOLINE, "trampoline");
+	GC_registerFixedTypeByIndex(gc, GC_ALLOC_NATIVELIB, "native-lib");
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_JIT_SEQ, "jit-seq");
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_JIT_CONST, "jit-const");
 	GC_registerFixedTypeByIndex(gc, GC_ALLOC_JIT_ARGS, "jit-args");
Index: kaffe/kaffe/kaffevm/inflate.c
diff -u kaffe/kaffe/kaffevm/inflate.c:1.10 kaffe/kaffe/kaffevm/inflate.c:1.11
--- kaffe/kaffe/kaffevm/inflate.c:1.10	Thu Jul 31 22:46:46 2003
+++ kaffe/kaffe/kaffevm/inflate.c	Mon Sep 22 15:31:24 2003
@@ -19,8 +19,8 @@
 #include "config-mem.h"
 #include "debug.h"
 #include "gtypes.h"
+#include "gc.h"
 #include "inflate.h"
-#include "kaffe/jmalloc.h"
 
 #define	WSIZE	0x8000
 
@@ -524,7 +524,7 @@
 {
 	inflateInfo* info;
 
-	info = KMALLOC(sizeof(inflateInfo));
+	info = gc_malloc(sizeof(inflateInfo), GC_ALLOC_FIXED);
 	if (!info) {
 		return 0;
 	}
@@ -532,9 +532,9 @@
 	info->fixed_td = 0;
 	info->fixed_bl = 0;
 	info->fixed_bd = 0;
-	info->slide = KMALLOC(WSIZE);
+	info->slide = gc_malloc(WSIZE, GC_ALLOC_FIXED);
 	if (!info->slide){
-		KFREE(info);
+		gc_free(info);
 		return 0;
 	}
 
@@ -616,8 +616,8 @@
       huft_free(pG->fixed_tl);
       pG->fixed_td = pG->fixed_tl = 0;
     }
-    KFREE(pG->slide);
-    KFREE(pG);
+    gc_free(pG->slide);
+    gc_free(pG);
   }
 
   return 0;
@@ -752,7 +752,7 @@
         l[h] = j;               /* set table size in stack */
 
         /* allocate and link in new table */
-        if ((q = (huft *)KMALLOC((z + 1)*sizeof(huft))) ==
+        if ((q = (huft *)gc_malloc((z + 1)*sizeof(huft), GC_ALLOC_FIXED)) ==
             0)
         {
           if (h)
@@ -829,7 +829,7 @@
   while (p != 0)
   {
     q = (--p)->v.t;
-    KFREE(p);
+    gc_free(p);
     p = q;
   }
   return 0;
Index: kaffe/kaffe/kaffevm/locks.c
diff -u kaffe/kaffe/kaffevm/locks.c:1.45 kaffe/kaffe/kaffevm/locks.c:1.46
--- kaffe/kaffe/kaffevm/locks.c:1.45	Sat Jul 26 16:50:49 2003
+++ kaffe/kaffe/kaffevm/locks.c	Mon Sep 22 15:31:24 2003
@@ -108,7 +108,9 @@
 DBG(SLOWLOCKS,
     			dprintf("    got cached lock\n");
 )
-			/* XXX is it possible to leak a heavyLock here ? */
+			if (lk != heavyLock) {
+				gc_free (lk);
+			}
 
 			lk = (iLock*)(((uintp)old) & (uintp)-2);
 		}
Index: kaffe/kaffe/kaffevm/lookup.c
diff -u kaffe/kaffe/kaffevm/lookup.c:1.33 kaffe/kaffe/kaffevm/lookup.c:1.34
--- kaffe/kaffe/kaffevm/lookup.c:1.33	Sun Aug 31 22:09:02 2003
+++ kaffe/kaffe/kaffevm/lookup.c	Mon Sep 22 15:31:24 2003
@@ -288,7 +288,7 @@
 	/* XXX Should we verify that ret->signature matches field? */
 
 	ret->field = field;
-	ret->class = class;
+	ret->class = field->clazz;
 	return (true);
 }
 
Index: kaffe/kaffe/kaffevm/string.c
diff -u kaffe/kaffe/kaffevm/string.c:1.26 kaffe/kaffe/kaffevm/string.c:1.27
--- kaffe/kaffe/kaffevm/string.c:1.26	Thu Jul 31 22:46:46 2003
+++ kaffe/kaffe/kaffevm/string.c	Mon Sep 22 15:31:24 2003
@@ -38,7 +38,7 @@
 {
 	char* str;
 
-	str = KMALLOC(STRING_SIZE(js) + 1);
+	str = gc_malloc(STRING_SIZE(js) + 1, GC_ALLOC_FIXED);
 	if (str != 0) {
 		stringJava2CBuf(js, str, STRING_SIZE(js) + 1);
 	}
@@ -86,7 +86,7 @@
 
 	/* Get buffer */
 	if (len * sizeof(*ary) > sizeof(buf)) {
-		ary = KMALLOC(len * sizeof(*ary));
+		ary = gc_malloc(len * sizeof(*ary), GC_ALLOC_FIXED);
 		if (!ary) return 0;
 	} else {
 		ary = buf;
@@ -162,7 +162,7 @@
 
 	/* Get buffer */
 	if (uniLen * sizeof(jchar) > sizeof(buf)) {
-		jc = KMALLOC(uniLen * sizeof(*jc));
+		jc = gc_malloc(uniLen * sizeof(*jc), GC_ALLOC_FIXED);
 		if (!jc) return 0;
 	} else {
 		jc = buf;
@@ -205,7 +205,7 @@
 	/* convert characters only if necessary */
 	if (slength != 0 && from != to) {
 		int i;
-		chars = KMALLOC(sizeof(jchar) * slength);
+		chars = gc_malloc(sizeof(jchar) * slength, GC_ALLOC_FIXED);
 
 		for (i = 0; i < slength; i++) {
 			jchar ci = ((jchar *)STRING_DATA(str))[i];
@@ -279,7 +279,7 @@
 
 	/* XXX assumes stringLock isn't acquired recursively (which it isn't) */
 	locks_internal_unlockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);
-	p = KCALLOC(1, sz);
+	p = gc_malloc(sz, GC_ALLOC_FIXED);
 	locks_internal_lockMutex(&stringLock.lock, myRoot, &stringLock.heavyLock);
 	stringLockRoot = myRoot;
 	return (p);
@@ -432,8 +432,8 @@
 
 		/* Construct a temporary and fake String object */
 		if (sizeof(*fakeAry) + (len * sizeof(*data)) > sizeof(buf)) {
-			fakeAry = KMALLOC(sizeof(*fakeAry)
-					+ (len * sizeof(*data)));
+			fakeAry = gc_malloc(sizeof(*fakeAry) + len * sizeof(*data),
+					    GC_ALLOC_FIXED);
 		} else {
 			fakeAry = (HArrayOfChar*)buf;
 		}
Index: kaffe/kaffe/kaffevm/support.h
diff -u kaffe/kaffe/kaffevm/support.h:1.24 kaffe/kaffe/kaffevm/support.h:1.25
--- kaffe/kaffe/kaffevm/support.h:1.24	Sun Aug 31 22:09:02 2003
+++ kaffe/kaffe/kaffevm/support.h	Mon Sep 22 15:31:24 2003
@@ -143,8 +143,8 @@
 #define BITMAP_BYTE_SIZE(b) (((b) + BITMAP_BPI - 1) / BITMAP_BPI)
 
 /* create a new bitmap for b bits */
-#define BITMAP_NEW(b)	\
-    (int *)KCALLOC(BITMAP_BYTE_SIZE(b), sizeof(int))
+#define BITMAP_NEW(b, gctype)	\
+    (int *)gc_calloc(BITMAP_BYTE_SIZE(b), sizeof(int), (gctype))
 
 /* set nth bit, counting from MSB to the right */
 #define BITMAP_SET(m, n) \
Index: kaffe/kaffe/kaffevm/verify.c
diff -u kaffe/kaffe/kaffevm/verify.c:1.27 kaffe/kaffe/kaffevm/verify.c:1.28
--- kaffe/kaffe/kaffevm/verify.c:1.27	Thu Sep 11 16:51:20 2003
+++ kaffe/kaffe/kaffevm/verify.c	Mon Sep 22 15:31:24 2003
@@ -1253,7 +1253,7 @@
 	 **************************************************************************************************/
 	DBG(VERIFY3, dprintf("        allocating memory for verification (codelen = %d)...\n", codelen); );
 	
-        status   = checkPtr((char*)KMALLOC(codelen * sizeof(uint32)));
+        status   = checkPtr((char*)gc_malloc(codelen * sizeof(uint32), GC_ALLOC_VERIFIER));
 	
 	// find basic blocks and allocate memory for them
 	blocks = verifyMethod3a(einfo, method, status, &numBlocks);
@@ -1940,7 +1940,7 @@
 	
 	DBG(VERIFY3, dprintf("    Verifier Pass 3a: third pass to allocate memory for basic blocks...\n"); );
 	
-	blocks = checkPtr((BlockInfo**)KMALLOC(blockCount * sizeof(BlockInfo*)));
+	blocks = checkPtr((BlockInfo**)gc_malloc(blockCount * sizeof(BlockInfo*), GC_ALLOC_VERIFIER));
 	
 	for (inABlock = true, n = 0, pc = 0; pc < codelen; pc++) {
 		if (status[pc] & START_BLOCK) {
@@ -3316,11 +3316,11 @@
 				
 				sig = CLASS_NAMED(idx, pool);
 				if (*sig == '[') {
-					namestr = checkPtr(KMALLOC(sizeof(char) * (strlen(sig) + 2)));
+					namestr = checkPtr(gc_malloc(sizeof(char) * (strlen(sig) + 2), GC_ALLOC_VERIFIER));
 					*sigs = pushSig(*sigs, namestr);
 					sprintf(namestr, "[%s", sig);
 				} else {
-					namestr = checkPtr(KMALLOC(sizeof(char) * (strlen(sig) + 4)));
+					namestr = checkPtr(gc_malloc(sizeof(char) * (strlen(sig) + 4), GC_ALLOC_VERIFIER));
 					*sigs = pushSig(*sigs, namestr);
 					sprintf(namestr, "[L%s;", sig);
 				}
@@ -3902,7 +3902,7 @@
 	uint32 nargs                     = countSizeOfArgsInSignature(sig);
 	
 	uint32 paramIndex                = 0;
-	char* argbuf                     = checkPtr(KMALLOC(strlen(sig) * sizeof(char)));
+	char* argbuf                     = checkPtr(gc_malloc(strlen(sig) * sizeof(char), GC_ALLOC_VERIFIER));
 	
 	
 	DBG(VERIFY3, dprintf("%scalling method %s%s\n", indent, METHODREF_NAMED(idx, pool), sig); );
@@ -4164,7 +4164,7 @@
 	
 	// the +1 skips the initial '('
 	const char* sig = METHOD_SIGD(method) + 1;
-	char* argbuf    = checkPtr(KMALLOC((strlen(sig)+1) * sizeof(char)));
+	char* argbuf    = checkPtr(gc_malloc((strlen(sig)+1) * sizeof(char), GC_ALLOC_VERIFIER));
 	char* newsig    = NULL;
 	
 	Type* locals = block->locals;
@@ -4219,7 +4219,7 @@
 			
 		case '[':
 		case 'L':
-			newsig = checkPtr(KMALLOC((strlen(argbuf) + 1) * sizeof(char)));
+			newsig = checkPtr(gc_malloc((strlen(argbuf) + 1) * sizeof(char), GC_ALLOC_VERIFIER));
 			*sigs = pushSig(*sigs, newsig);
 			sprintf(newsig, "%s", argbuf);
 			locals[paramCount].tinfo = TINFO_SIG;
@@ -4281,7 +4281,7 @@
 		sig = type->data.sig;
 		
 		if (*sig != '[') {
-			tmp = checkPtr(KMALLOC((strlen(sig) + 3) * sizeof(char)));
+			tmp = checkPtr(gc_malloc((strlen(sig) + 3) * sizeof(char), GC_ALLOC_VERIFIER));
 			sprintf(tmp, "L%s;", sig);
 			sig = tmp;
 		}
@@ -4653,14 +4653,14 @@
 {
 	int i;
 	
-	BlockInfo* binfo = checkPtr((BlockInfo*)KMALLOC(sizeof(BlockInfo)));
+	BlockInfo* binfo = checkPtr((BlockInfo*)gc_malloc(sizeof(BlockInfo), GC_ALLOC_VERIFIER));
 	
 	binfo->startAddr   = 0;
 	binfo->status      = IS_INSTRUCTION | START_BLOCK;  // not VISITED or CHANGED
 	
 	// allocate memory for locals
 	if (method->localsz > 0) {
-		binfo->locals = checkPtr(KMALLOC(method->localsz * sizeof(Type)));
+		binfo->locals = checkPtr(gc_malloc(method->localsz * sizeof(Type), GC_ALLOC_VERIFIER));
 		
 		for (i = 0; i < method->localsz; i++) {
 			binfo->locals[i] = *TUNSTABLE;
@@ -4673,7 +4673,7 @@
 	// allocate memory for operand stack
 	binfo->stacksz = 0;
 	if (method->stacksz > 0) {
-		binfo->opstack = checkPtr(KMALLOC(method->stacksz * sizeof(Type)));
+		binfo->opstack = checkPtr(gc_malloc(method->stacksz * sizeof(Type), GC_ALLOC_VERIFIER));
 		
 		for (i = 0; i < method->stacksz; i++) {
 			binfo->opstack[i] = *TUNSTABLE;
@@ -4763,7 +4763,7 @@
 SigStack*
 pushSig(SigStack* sigs, const char* sig)
 {
-	SigStack* new_sig = checkPtr(KMALLOC(sizeof(SigStack)));
+	SigStack* new_sig = checkPtr(gc_malloc(sizeof(SigStack), GC_ALLOC_VERIFIER));
 	new_sig->sig = sig;
 	new_sig->next = sigs;
 	return new_sig;
@@ -4825,7 +4825,7 @@
 UninitializedType*
 pushUninit(UninitializedType* uninits, const Type* type)
 {
-	UninitializedType* uninit = checkPtr(KMALLOC(sizeof(UninitializedType)));
+	UninitializedType* uninit = checkPtr(gc_malloc(sizeof(UninitializedType), GC_ALLOC_VERIFIER));
 	uninit->type = *type;
 	uninit->prev = NULL;