apl-cornell/fabric

Inaccessibility of $classHash for nonpublic classes.

Opened this issue · 0 comments

So it looks like the current master of Fabric and Jif combined with commit 256b116e of Polyglot (latest version known to work, there's an issue with changes in master affecting Jif's build right now) has a problem with making sure the $classHash field is appropriately visible to the runtime. We found this issue trying to run commit ac93352b of @karannewatia FabIL Scrabble implementation. When attempting to run the application, we would get:

$ bin/start-store
Worker started
Store started

store> App
Nov 15, 2018 4:31:23 PM Creating InternalError exception:
================ BEGIN STACK TRACE ================
fabric.common.exceptions.InternalError: java.lang.IllegalAccessException: Class fabric.common.SysUtil can not access a member of class Board with modifiers "public static final"
        at fabric.common.SysUtil.classHashFieldValue(SysUtil.java:259)
        at fabric.common.SysUtil.classHashFieldValueOrNull(SysUtil.java:270)
        at fabric.common.SysUtil.hashPlatformClass(SysUtil.java:101)
        at fabric.common.ClassRef$PlatformClassRef.getHashImpl(ClassRef.java:300)
        at fabric.common.ClassRef.getHash(ClassRef.java:178)
        at fabric.common.ClassRef$PlatformClassRef.writeImpl(ClassRef.java:326)
        at fabric.common.ClassRef.write(ClassRef.java:927)
        at fabric.common.SerializedObject.write(SerializedObject.java:1007)
        at fabric.common.SerializedObject.<init>(SerializedObject.java:213)
        at fabric.store.InProcessStore$3.run(InProcessStore.java:107)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalAccessException: Class fabric.common.SysUtil can not access a member of class Board with modifiers "public static final"
        at sun.reflect.Reflection.ensureMemberAccess(Reflection.java:102)
        at java.lang.reflect.AccessibleObject.slowCheckMemberAccess(AccessibleObject.java:296)
        at java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:288)
        at java.lang.reflect.Field.get(Field.java:390)
        at fabric.common.SysUtil.classHashFieldValue(SysUtil.java:253)
        ... 14 more
================= END STACK TRACE =================

This IllegalAccessException happens because the nonpublic class Board was compiled to a nonpublic interface Board, whose public static final byte[] $classHash field is not legally accessible from fabric.common.SysUtil!

I'm not sure at what point this bug got introduced as it wasn't a problem when using the prepackaged release of Fabric version 0.3.0. It's possible this is a bug due to changes in either Jif or Polyglot (I doubt it is Jif). Worth figuring out when this regressed and, regardless, we need to fix this.