如何在 Julia codeinfo 的 slot 中区分参数和局部变量?

问题描述

我正在学习Julia静态分析,我有以下功能

function f(x,y,z)
  d=x+y
  d=d*2*z
  end

我使用 code_typed 来分析它。

julia> y=code_typed(f)
1-element Vector{Any}:
 CodeInfo(
1 ─ %1 = (x + y)::Any
│   %2 = (%1 * 2)::Any
│   %3 = (%2 * z)::Any
└──      return %3
) => Any

我可以获得它的插槽和插槽类型。

julia> y[1].first.slotnames
5-element Vector{Symbol}:
 Symbol("#self#")
 :x
 :y
 :z
 :d

julia> y[1].first.slottypes
5-element Vector{Any}:
 Core.Const(f)
 Any
 Any
 Any
 Any

但是我有没有办法知道插槽中哪个是参数,哪个是局部变量?

解决方法

您可以使用 Base.argnames 找出函数的参数:

julia> Base.method_argnames.(methods(f))
1-element Vector{Vector{Symbol}}:
 [Symbol("#self#"),:x,:y,:z]

您也可以从 CodeInfo 对象中提取:

julia> Base.method_argnames(y[1].first.parent.def)
4-element Vector{Symbol}:
 Symbol("#self#")
 :x
 :y
 :z