评论者:alexyakushev
我尝试了(链接: ~alexmiller)建议的实现。附加的补丁使用getComponentType代替字符串魔术,并且与第一个补丁相比有以下改进
- 现在也支持aset。所有索引(除了最后一个)都展开成{{RT.aget}}调用,最外层的调用展开成{{RT.aset}}。
- 如果内联版本在任何时候都无法解析数组类型,那么,而不是展开成N个{{RT.aget}}调用(这将导致N个编译器反射站点),它将生成对非内联{{aget}}调用的调用,该调用将使用{{Array.get}}(这是更快的)。
缺点是,现在对{{aset}}的多态调用会在编译器反射中触发,而之前它是{{Array.set}}。我怀疑是否最好让这些角落更加平滑,或者是否在这种情况下更明显的反射是更好的(它会在编译器警告中显示)。
我还附加了验证示例的REPL日志(使用clj-java-decompiler)。它将非常棒地转换成测试,但我还不知道如何做。
顺便说一下,我不得不使用一个重组 {{((var aget) ...)}} 来强制调用非内联版本。我不太喜欢这样做,但还没想出更好的方法。另一种方法是将其单独的非内联版本作为独立私用函数分割开来,但我不想向核心命名空间添加更多的变量。