评论者:alexiflekov
我尝试按照(链接:~alexmiller)的推荐实现。这个补丁使用getComponentType代替字符串魔术,与第一个补丁相比引入以下改进:
- 现在也支持aset。所有索引除了最后一个都展开成{{RT.aget}}调用,最外层的调用展开为{{RT.aset}}。
- 如果展开的版本在任何时刻无法解析数组的类型,那么,而不是展开成N个{{RT.aget}}调用(这将导致N个编译器反射站点),它将生成调用非内联的{{aget}}调用,该调用将使用{{Array.get}}(更快)。
然而,对{{aset}}的多参数调用现在触发了编译器的反射,而这原本是{{Array.set}}的功能。我想知道,是否应该对这些问题的边缘进行平滑处理,或者在这种情况下,反射是否应该更加明显(显示在编译器警告中)。
我还附上了验证示例的REPL日志(使用clj-java-decompiler)。将其转换为测试将非常好,但我还不知道如何做到。
顺便说一下,我不得不使用{{((var aget) ...)}}这种hack来强制调用非内联版本。我并不喜欢这样做,但我还没有想出更好的方法。另一种方法是将其分离成独立的私有函数,但我不想在核心命名空间中添加更多的变量。