欢迎!请查看关于页面以获取更多关于这个工作原理的信息。
摘要:不要为命名空间关键字访问发出 KeywordLookup 检查和机制
描述:当编译器看到 sexpr 开头是关键字时((:foo x)),它会发出一些机制,该机制考虑了 'x' 可能具有已定义的 'foo' 字段的 defrecord。这是为了实现快速路径以进入字段查找。以下是从目标 defrecord 中的支持代码:https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_deftype.clj#L185-L198当前编译器为 (:foo/bar x),即命名空间关键字访问,发出相同的机制,但 defrecords 对该字段没有快速路径的字段访问。这个小的补丁将此情况转换为普通调用。
以下是 (fn (link: x) (:foo/bar x)) 的反汇编 https://gist.github.com/anonymous/d94fc56fba4a1665f73f
IFn 对每个 kw 访问也有两个字段。
通过这个简单的补丁,它变成了一次普通的调用。(发出 fn 即命名空间关键字,然后是参数,即目标,然后调用 IFn invoke:kw.invoke(target))