I came across a strange edge case today whereby I was getting a java.lang.VerifyError on code that should work. I've reduced it down to this code:
class Example {
[Str:Obj]? map1
Void main(Str[] args) {
map2 := map1 ?: Str:Obj?[:]
map3 := [,].reduce(Str:Obj?[:]) { it }
map2.setAll(map3)
echo("done")
}
}
which gives:
java.lang.VerifyError: (class: fan/acme/Example, method: main signature: (Lfan/sys/List;)V) Incompatible argument to function
at java.lang.Class.getDeclaredFields0(Native Method)
at java.lang.Class.privateGetDeclaredFields(Class.java:2583)
at java.lang.Class.getDeclaredFields(Class.java:1916)
at fan.sys.ClassType.finishSlots(ClassType.java:591)
at fan.sys.ClassType.finish(ClassType.java:553)
at fan.sys.Method$MethodFunc.isStatic(Method.java:489)
at fan.sys.Method$MethodFunc.callList(Method.java:205)
at fan.sys.Type.make(Type.java:246)
at fan.sys.ClassType.make(ClassType.java:110)
at fan.sys.Type.make(Type.java:236)
at fanx.tools.Fan.callMain(Fan.java:185)
at fanx.tools.Fan.executeType(Fan.java:147)
at fanx.tools.Fan.execute(Fan.java:41)
at fanx.tools.Fan.run(Fan.java:308)
at fanx.tools.Fan.main(Fan.java:346)
sys::Err: Method not mapped to java.lang.reflect correctly cwApp::Example.make
fan.sys.Method$MethodFunc.isStatic (Method.java:496)
fan.sys.Method$MethodFunc.callList (Method.java:205)
fan.sys.Type.make (Type.java:246)
fan.sys.ClassType.make (ClassType.java:110)
fan.sys.Type.make (Type.java:236)
fanx.tools.Fan.callMain (Fan.java:185)
fanx.tools.Fan.executeType (Fan.java:147)
fanx.tools.Fan.execute (Fan.java:41)
fanx.tools.Fan.run (Fan.java:308)
fanx.tools.Fan.main (Fan.java:346)
Changing any part of the code in any way (like removing the elvis, or not using a field), and it runs just fine as expected.
brianThu 8 Feb 2018
Thanks for reporting that. Was tricky and took me a while to track it down, but in the end it was a compiler bug where I explicitly left myself a TODO comment. I pushed a fix.
SlimerDude Wed 7 Feb 2018
I came across a strange edge case today whereby I was getting a
java.lang.VerifyErroron code that should work. I've reduced it down to this code:class Example { [Str:Obj]? map1 Void main(Str[] args) { map2 := map1 ?: Str:Obj?[:] map3 := [,].reduce(Str:Obj?[:]) { it } map2.setAll(map3) echo("done") } }which gives:
java.lang.VerifyError: (class: fan/acme/Example, method: main signature: (Lfan/sys/List;)V) Incompatible argument to function at java.lang.Class.getDeclaredFields0(Native Method) at java.lang.Class.privateGetDeclaredFields(Class.java:2583) at java.lang.Class.getDeclaredFields(Class.java:1916) at fan.sys.ClassType.finishSlots(ClassType.java:591) at fan.sys.ClassType.finish(ClassType.java:553) at fan.sys.Method$MethodFunc.isStatic(Method.java:489) at fan.sys.Method$MethodFunc.callList(Method.java:205) at fan.sys.Type.make(Type.java:246) at fan.sys.ClassType.make(ClassType.java:110) at fan.sys.Type.make(Type.java:236) at fanx.tools.Fan.callMain(Fan.java:185) at fanx.tools.Fan.executeType(Fan.java:147) at fanx.tools.Fan.execute(Fan.java:41) at fanx.tools.Fan.run(Fan.java:308) at fanx.tools.Fan.main(Fan.java:346) sys::Err: Method not mapped to java.lang.reflect correctly cwApp::Example.make fan.sys.Method$MethodFunc.isStatic (Method.java:496) fan.sys.Method$MethodFunc.callList (Method.java:205) fan.sys.Type.make (Type.java:246) fan.sys.ClassType.make (ClassType.java:110) fan.sys.Type.make (Type.java:236) fanx.tools.Fan.callMain (Fan.java:185) fanx.tools.Fan.executeType (Fan.java:147) fanx.tools.Fan.execute (Fan.java:41) fanx.tools.Fan.run (Fan.java:308) fanx.tools.Fan.main (Fan.java:346)Changing any part of the code in any way (like removing the elvis, or not using a field), and it runs just fine as expected.
brian Thu 8 Feb 2018
Thanks for reporting that. Was tricky and took me a while to track it down, but in the end it was a compiler bug where I explicitly left myself a TODO comment. I pushed a fix.