评论者:alex yakushev
我对(链接:~alexmiller)建议的实现进行了尝试。附加的补丁使用getComponentType代替了字符串魔术,并且与第一个补丁相比有以下改进:
- 现在也支持aset。除了最后一个索引之外的所有索引都被展开为{{RT.aget}}调用,最外层的调用被展开为{{RT.aset}}。
- 如果内联版本在任何时候都无法解析数组的类型,那么它将不会展开为N个{{RT.aget}}调用(这将导致N个编译器反射点),而是生成对非内联{{aget}}调用的调用,这将使用{{Array.get}}(这更快)。
从另一方面来看,对{{aset}}的多参数调用现在会触发编译器的反射,而之前是{{Array.set}}。我 wonder whether平缓这些边缘也有意义,或者在这种情况下更可见的反射(在编译器警告中显示)会更好。
我还附上了验证示例的REPL日志(使用clj-java-decompiler)。将其转换为测试应该是很好的,但我还不知道如何做。
顺便说一下,我不得不使用一个{{((var aget) ...)}}的hack来强制调用非内联版本。我不太喜欢这种方法,但我还没有想出更好的办法。另一种方法是将其非内联版本分离成为一个单独的私有函数,但我不想把更多的变量添加到核心命名空间。