> > > 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; If class->superclass is 0, you check its state 'field' (?) --- this may not be what you want. It may segfault at this point, try to load NullPointerException.class and deadlock. > } > @@ -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; > } > } This looks better --- maybe try only this part of the patch(?) - Godmar