评论者:alexyakushev
我尝试实现(链接: ~alexmiller)建议的方法。附带的补丁使用getComponentType而不是字符串魔法,并且与第一个补丁相比有如下改进
- 现在支持aset。除了最后一个索引之外的所有索引都展开为{{RT.aget}}调用,最外层的调用展开为{{RT.aset}}。
- 如果内联版本在任何时候都无法解析数组的类型,则将不再展开为N个{{RT.aget}}调用(这将引起N个编译器反射位置),而是生成一个非内联{{aget}}调用的调用,它将使用{{Array.get}}(这更快)。
缺点是,{{aset}}的多参数调用现在在编译器中触发反射,而不是像以前那样使用{{Array.set}}。我想知道是否有必要平滑这些角落,或者在这种情况下是否更有利于反映(在编译器警告中显示)。
我还附上了验证示例的REPL日志(使用cljjava-decompiler)。最好将其转换为测试,但我还不知道如何实现。
顺便提一下,我不得不使用一个黑客技巧 {{((var aget) ...)}} 来强制调用非内联版本。说实话,我不太喜欢这样,但我还没有想出更好的方法。另一种方法是将非内联版本分开成一个独立的私有函数,但我不想在核心命名空间中添加更多的变量。