Index: kaffe/kaffevm/exception.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/exception.c,v
retrieving revision 1.110
diff -u -r1.110 exception.c
--- kaffe/kaffevm/exception.c	19 Jan 2008 15:13:39 -0000	1.110
+++ kaffe/kaffevm/exception.c	19 Feb 2008 02:29:51 -0000
@@ -89,7 +89,6 @@
 	assert(eh != NULL);
 	assert(eh->meth == VMEXCEPTHANDLER_KAFFEJNI_HANDLER);
 	assert(fp != (JNIFrameAddress)0);
-
 	return (eh->frame.jni.fp == fp);
 }
 
@@ -97,8 +96,9 @@
 vmExcept_setJNIFrame(VmExceptHandler* eh, JNIFrameAddress fp)
 {
 	assert(eh != NULL);
+/*
 	assert(fp != (JNIFrameAddress)0);
-
+*/
 	eh->meth = VMEXCEPTHANDLER_KAFFEJNI_HANDLER;
 	eh->frame.jni.fp = fp;
 }
Index: kaffe/kaffevm/stackTrace.c
===================================================================
RCS file: /cvs/kaffe/kaffe/kaffe/kaffevm/stackTrace.c,v
retrieving revision 1.55
diff -u -r1.55 stackTrace.c
--- kaffe/kaffevm/stackTrace.c	22 Sep 2007 17:36:13 -0000	1.55
+++ kaffe/kaffevm/stackTrace.c	19 Feb 2008 02:29:51 -0000
@@ -52,23 +52,35 @@
 Hjava_lang_Object*
 buildStackTrace(struct _exceptionFrame* base)
 {
-	int cnt;
 	struct _stackTrace trace;
 	stackTraceInfo* info;
 	struct _exceptionFrame orig;
+	struct _exceptionFrame* previousframe;
+	int cnt;
+	int elements;
 
 	(void) orig;			/* avoid compiler warning in intrp */
 	DBG(STACKTRACE,
 	    dprintf("STACKTRACEINIT(trace, %p, %p, orig);\n", base, base); );
 	STACKTRACEINIT(trace, base, base, orig);
 	cnt = 0;
+	previousframe = trace.frame;
+
 	while(STACKTRACEFRAME(trace) && KTHREAD(on_current_stack) ((void *)STACKTRACEFP(trace))) {
+	DBG(STACKTRACE,
+	    dprintf("STACKTRACESTEP(%d, fp=%p, nextframe=%p);\n", 
+	             cnt, FPFRAME(trace.frame), NEXTFRAME(trace.frame)); );
 		cnt++;
 		STACKTRACESTEP(trace);
+		if (previousframe == trace.frame)
+			break;
+		else
+			previousframe = trace.frame;
 	}
+	elements = cnt;
 
 	/* Build an array of stackTraceInfo */
-	info = gc_malloc(sizeof(stackTraceInfo) * (cnt+1), KGC_ALLOC_NOWALK);
+	info = gc_malloc(sizeof(stackTraceInfo) * (elements+1), KGC_ALLOC_NOWALK);
 	if (!info) {
 	    dprintf("buildStackTrace(%p): can't allocate stackTraceInfo\n",
 		    base);
@@ -81,7 +93,7 @@
 	    dprintf("STACKTRACEINIT(trace, &orig, %p, orig);\n", base); );
 	STACKTRACEINIT(trace, &orig, base, orig);
 
-	while (STACKTRACEFRAME(trace) && KTHREAD(on_current_stack) ((void *)STACKTRACEFP(trace))) {
+	while (cnt < elements) {
 		info[cnt].pc = STACKTRACEPC(trace);
 		info[cnt].fp = STACKTRACEFP(trace);
 		info[cnt].meth = stacktraceFindMethod (info[cnt].fp, info[cnt].pc);
