摘要:不要发射KeywordLookup thunks和名称空间关键字访问的机械结构
描述:当编译器看到一个sexpr开头的键时(:foo x),它会发射一些机械结构,考虑到'x'可能是一个具有定义的'foo'字段的defrecord。这存在是为了快速执行字段查找。以下是目标defrecord的支持代码:[https://github.com/clojure/clojure/blob/master/src/clj/clojure/core_deftype.clj#L185-L198](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
对于每个kw访问,IFn也还有两个静态字段。
使用这个微小的补丁,它变成了一个正常的调用。(发射函数aka名称空间键,然后是参数Aka目标,并调用IFn的invoke: kw.invoke(target))