This is the mail archive of the java@gcc.gnu.org mailing list for the Java project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: confusion when CLASSPATH includes compiled class


Per Bothner wrote:
Hm.  I'm getting the same GC-crash when I use gij.  So it probably
isn't related to confusion between compiled and dynamic classes.

I think I understand what is going on, at least for interpreted classes.


Class.forName("Foo", false, loader) leaves the loaded class as JV_STATE_LOADED.
The storage for the static fields is allocated by
_Jv_Linker::ensure_fields_laid_out, which is called just before class init,
before state becomes JV_STATE_PREPARED.

So while the state is JV_STATE_LOADED, we call cls.getField(...).getType().
This calls _Jv_Linker::resolve_field which clears the _Jv_FIELD_UNRESOLVED_FLAG.
But note that field->u.addr is still null (and field->bsize==0)!

This may be ok, but then the GC is called.  _Jv_MarkObj just checks that
field->isResolved(), but it doesn't check that field->u.addr is non-null
or that c->state >= JV_STATE_PREPARED.

Question 1: Is this a bug in the GC or in class linking/loading or in
Field::getType().?  I.e. is it ok for field->isResolved() to be true
even if storage for the field hasn't been allocated?

Question 2: What is the fix?  Assuming the answers to 1 are "GC" and "yes",
then we could fix _Jv_MarkObj either by
(a) only mark the values pointed to if field->u.addr != NULL; or
(b) check that c->state >= JV_STATE_PREPARED - or rather >= JV_STATE_COMPILED.

Does this analysis seem correct?
--
	--Per Bothner
per@bothner.com   http://per.bothner.com/


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]