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