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