评论由:alexyakushev发表
我尝试了(链接: ~alexmiller)建议的实现。附加的补丁文件使用getComponentType代替字符串魔术,与第一个补丁相比,引入了以下改进
- 现在也支持aset。除了最后的索引外,所有索引都展开成{{RT.aget}}调用,最外层的调用展开成{{RT.aset}}。
- 如果内联版本在任何时候都不能解析数组类型,那么,而不是展开成N个{{RT.aget}}调用(这将导致N个编译器反射位置),它将生成对非内联{{aget}}调用的调用,该调用将使用{{Array.get}}(这更快)。
不利的一面,现在多参数调用{{aset}}会触发编译器反射,而以前那里是{{Array.set}}。我想知道是否应该平滑这些角落,或者这样更能显式地反映反射(显示在编译器警告中)。
我还附上了验证示例的REPL日志(使用clj-java-decompiler)。把它转换成测试会很好,但我还不知道如何做。
顺便说一下,我不得不使用一个技巧{{((var aget) ...)}}来强迫调用非内联版本。我不得不这么说,但我还没有想出什么更好的方法。另一种方法是将其分离为独立的私有函数,但我不想在核心命名空间中添加更多变量。