评论人:alexnakushev
我尝试实现(链接:~alexmiller)提出的建议。这个附加的补丁使用getComponentType代替字符串魔法,并将以下改进与第一个补丁相比
- 现在支持aset。除了最后一个索引之外的所有索引都被展开到{{RT.aget}}调用中,最外层的调用被展开为{{RT.aset}}。
- 如果在任何时候无法解析内联版本的数组类型,则会生成对非内联{{aget}}的调用,而不是展开为N个{{RT.aget}}调用(这将导致N个编译器反射点)。
缺点是,现在多参数调用{{aset}}会在编译器中触发反射,而之前是由{{Array.set}}触发的。我想知道是否应该平滑处理这些角落问题,或者是否在这种情况下使反射更明显(显示在编译器警告中)。
我还附加了验证例子的REPL日志(使用clj-java-decompiler)。将它们转换为测试会很好,但我还不知道如何操作。
顺便说一下,我不得不使用一种Hack {{((var aget) ...)}} 来强制调用非内联版本。不太好接受,但我还没有想出更好的办法。另一种方法是将其分开为独立的私有函数,但是我不想在核心命名空间中添加更多变量。