bug in processClass()

Patrick Tullmann tullmann at cs.utah.edu
Mon Aug 9 10:27:08 PDT 1999


I've found a bug in processClass() (I think).  If a class X
is a superclass and it blows up during initialization of subclass Y,
Y's state is set to CSTATE_FAILED.  Subsequent references to Y will
cause assert() failures where Kaffe asserts Y->state >=
CSTATE_COMPLETE.

Bug #535 has a test case that reproduces the problem.

I changed processClass() (attached diff) so that if the superclass
fails with "CSTATE_INIT_FAILED" the subclass is tagged with that
failure, too.  This seems right and fixes my problem, except
now ProcessClassTest deadlocks on test 'G'.  (Thank god for regression 
tests!)  Perhaps something else is wrong and the failed class
is being incorrectly looked up?

I'll continue looking into this, but any suggestions are appreciated!

-Pat

RCS file: /home/cvspublic/kaffe/kaffe/kaffevm/classMethod.c,v
retrieving revision 1.60
diff -u -b -u -r1.60 classMethod.c
--- classMethod.c	1999/07/11 00:14:26	1.60
+++ classMethod.c	1999/08/07 00:17:14
@@ -176,6 +176,8 @@
						     class, einfo);
			classLock = lockMutex(class);
			if (class->superclass == 0) {
+				if (class->superclass->state == CSTATE_INIT_FAILED)
+					SET_CLASS_STATE(CSTATE_INIT_FAILED);
				success = false;
				goto done;
			}
@@ -385,6 +387,8 @@
					     CSTATE_COMPLETE, einfo);
			classLock = lockMutex(class);
			if (success == false) {
+				if (class->superclass->state == CSTATE_INIT_FAILED)
+					SET_CLASS_STATE(CSTATE_INIT_FAILED);
				goto done;
			}
		}


More information about the kaffe mailing list