评论者:alexYakushev
我尝试了(链接: ~alexmiller)提出实现的。附加的补丁使用getComponentType代替字符串魔法,与第一个补丁相比,引入了以下改进:
- 现在也支持aset。所有索引(除了最后一个)都被展开成{{RT.aget}}调用,最外层的调用被扩展为{{RT.aset}}。
- 如果内联版本在任何时候都无法解析数组的类型,则它会生成一个对非内联{{aget}}调用的调用,该调用将使用{{Array.get}}(这更快)。
缺点是,对{{aset}}的多算子调用现在触发编译器反射(而不是之前的{{Array.set}})。我想知道是否有必要平滑这些角落,或者在这种情况下是否让反射更明显(在编译器警告中显示)实际上是更好的。
我还附上了一些验证示例的REPL日志(使用clj-java-decompiler)。如果能将其转换为测试将很棒,但我还不知道如何做。
顺便说一句,我不得不使用一个黑客技巧{{((var aget) ...)}}来强制调用非内联版本。我不能说我喜欢它,但我还没有想出更好的方法。另一种方式是将非内联版本分离到一个单独的私有函数中,但我不想将更多的变量添加到核心命名空间。