[kaffe] completed bytecode verifier!
Timothy Stack
stack at cs.utah.edu
Fri Aug 8 09:24:01 PDT 2003
> Hi Tim,
hi,
> I think I managed to figure out what is going wrong here.
> Hopefully my explanations will not get too confusing.
Thanks, I understood it just fine.
> First of all, you might consider applying the attached patch,
> since it will give you some better error messages in case some
> type could not be resolved during verification (do you know why
> getClassFromSignature throws away the einfo from classFromSig?).
Its broken... It should return NULL immediately if classFromSig fails to
load the class. And the check for "consuming all characters in string"
should be done by the verifier. And, it might leak memory since it
doesn't call discardErrorInfo... Anyways...
> If you try running $JAVA at.dms.kjc.CSourceClass afterwards,
> you will see that kaffe thinks that it has detected a
> ClassCircularityError.
>
> Now comes the confusing part, since I'll try to explain what
> I think is going on here ;)
>
> First of all, CSourceClass is derived from CClass, which is derived
> from CMember (all in package at.dms.kjc). So when kaffe has to load
> CSourceClass, that will trigger loading CClass and loading CClass in
> turn will trigger loading CMember. This will cause kaffe to process
> CMember to state CSTATE_LINKED, while CSourceClass and CClass are
> both in the CSTATE_LOADED_SUPER state (and their classMappingState
> is NMS_LOADING).
>
> Processing CMember to CSTATE_LINKED however, includes verifcation
> of the class CMember (both, verify2 and verify3). But in order to
> do this, the verifier has to resolve the types CSourceClass and
> CClass (they are needed for type checking during verification of
> the getAccessorOwner method). Since the verifier uses loadClass()
> to resolve the type, the ClassCircularityError is thrown (because
> classMappingSearch detects that the state is NMS_LOADING and that
> the current thread is responsible for it).
>
> Next problem is that the verifier needs a class that is at least
> in state >= CSTATE_LOADED_SUPER (otherwise it could not check for
> inheritance).
> An idea how to fix this? My guess would be to defer verification
> of the superclass until after the subclass is in state CSTATE_LOADED_SUPER
> (and NMS_LOADED). This could probably be done by creating a special
> getClass() that returns a class that is only CSTATE_PREPARED,
I don't think this will work with user loaders since getClass() calls
loadClass(), which can call a user loader, which can do whatever it wants.
> but not
> CSTATE_LINKED. The subclass would load the superclass using this special
> getClass(), set its own state to CSTATE_LOADED_SUPER (and NMS_LOADING)
> and process the superclass to CSTATE_LINKED afterwards. That way, the
> verifier would be able to properly resolve the subclass while verifying
> the superclass, but detection of ClassCircularityErrors should still
> work?
I think the circularity checking is broken, its just checking to see if
there is a loop in calls to loadClass and not checking that its still
trying to load the super class. For example, in this case CMember would
have finished loading its super (java.lang.Object) so there is no
circularity.
I'm thinking the fix would involve a new class state and classEntry state
that break up the loading of the super class. I'll try to look at it more
over the weekend...
> Greetings,
> Helmer
tim
More information about the kaffe
mailing list