评论者:alexyakushev
我尝试实现了(链接: ~alexmiller)建议的实现。附带的补丁文件使用getComponentType而不是字符串魔法,与第一个补丁相比引入了以下改进:
- 现在也支持aset。除了最后一个索引之外的所有索引都展开成<{{RT.aget}}调用,最外层的调用展开为<{{RT.aset}}。
- 如果内联版本在某个点上无法解析数组类型,则不再展开成N个<{{RT.aget}}调用(这将导致N个编译器反射点),而是生成对非内联<{{aget}}调用的调用,该调用将使用<{{Array.get}}》(这更快)。
缺点是,对<{{aset}}>的多变参数调用现在触发了编译器反射,而之前是<{{Array.set}}>。我想知道是否应该平滑处理这些角落,还是使这些情况下的反射更明显(显示在编译器警告中)。
我还附上了验证示例的REPL日志(使用clj-java-decompiler)。将它们转换成测试会很好,但我还不知道如何做。
顺便提一下,我不得不使用一个漏洞 {{((var aget) ...)}} 来强迫调用非内联版本。不能说我非常喜欢它,但我还没有想出更好的方法。另一种方法是将非内联版本分离到单独的私有函数中,但我不想向核心命名空间添加更多的变量。