From: SourceForge.net <no...@so...> - 2005-08-19 22:13:55
|
Bugs item #1264431, was opened at 2005-08-19 18:13 Message generated for change (Tracker Item Submitted) made by Item Submitter You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=712768&aid=1264431&group_id=128805 Please note that this message will contain a full copy of the comment thread, including the initial issue submission, for this request, not just the latest update. Category: runtime Group: None Status: Open Resolution: None Priority: 5 Submitted By: Jeremy Brown (jhbrown94) Assigned to: Nobody/Anonymous (nobody) Summary: JikesRVM doesn't initialize interfaces of a class Initial Comment: When JikesRVM initializes a class, it initializes that class's superclass, but not the class's interfaces. This can cause static constant fields of those interfaces to remain uninitialized even though they are used. I've got a demo which, if compiled with jikes or with 'javac -target 1.4' will cause JikesRVM to abort with an exception, but compiled with 'javac -target 1.2' will work. The demo is this, put in a file called TestImpl.java: ------------------------------------------------------------ interface DummyIF {static final Integer BASE_FIELD = new Integer(6);} public class TestImpl implements DummyIF { public static final int TEST_FIELD = BASE_FIELD.intValue(); public static void main(String argv[]) { System.out.println("Value: " + TEST_FIELD); } } ------------------------------------------------------------ The execution exhibits the bug like so: ------ > javac -target 1.2 TestImpl.java > rvm TestImpl Value: 6 > javac -target 1.4 TestImpl.java > rvm TestImpl Exception in thread "main": java.lang.ExceptionInInitializerError: While initializing TestImpl at com.ibm.JikesRVM.classloader.VM_Class.initialize(VM_Class. java:1414) Caused by: java.lang.NullPointerException at TestImpl.<clinit>(TestImpl.java:5) at com.ibm.JikesRVM.classloader.VM_Class.initialize(VM_Class. java:1410) JikesRVM: exit 113 ------ The source of the difference seems to be that at 1.2, the constant pool entry for BASE_FIELD in TestImpl.class refers to it as DummyIF. BASE_FIELD, whereas with 1.4 (or with jikes, which defaults to 1.4 semantics) the entry in TestImpl.class refers to it as TestImpl. BASE_FIELD. In the latter case, in JikesRVM 'fieldRef. needsDynamicLink(method)' returns false, which causes DummyIF never to get initialized. I am attaching a very simple patch which fixes the problem on the demo above. I am running the sanity regression tests now on my 600Mhz IA32 box, but they may take awhile to finish. ---------------------------------------------------------------------- You can respond by visiting: https://sourceforge.net/tracker/?func=detail&atid=712768&aid=1264431&group_id=128805 |