Hi, I was toying around with NamedTuple
and Iām wondering if my code is type-stable.
struct A end
name(::A) = :a
value(::A) = "test"
struct B end
name(::B) = :b
value(::B) = ones(3, 3)
function get_values(inputs)
names = name.(inputs)
values = value.(inputs)
NamedTuple{names}(values)
end
@inferred get_values((A(), B())) # works properly
@code_warntype get_values((A(), B()))
Here is the output of @code_warntype
:
MethodInstance for get_values(::Tuple{A, B})
from get_values(inputs) @ Main [redacted]
Arguments
#self#::Core.Const(Main.get_values)
inputs::Core.Const((A(), B()))
Locals
values::Tuple{String, Matrix{Float64}}
names::Tuple{Symbol, Symbol}
Body::@NamedTuple{a::String, b::Matrix{Float64}}
1 ā %1 = Base.broadcasted(Main.name, inputs)::Core.Const(Base.Broadcast.Broadcasted(name, ((A(), B()),)))
ā (names = Base.materialize(%1))
ā %3 = Base.broadcasted(Main.value, inputs)::Core.Const(Base.Broadcast.Broadcasted(value, ((A(), B()),)))
ā (values = Base.materialize(%3))
ā %5 = names::Core.Const((:a, :b))
ā %6 = Core.apply_type(Main.NamedTuple, %5)::Core.Const(NamedTuple{(:a, :b)})
ā %7 = values::Core.PartialStruct(Tuple{String, Matrix{Float64}}, Any[Core.Const("test"), Matrix{Float64}])
ā %8 = (%6)(%7)::Core.PartialStruct(@NamedTuple{a::String, b::Matrix{Float64}}, Any[Core.Const("test"), Matrix{Float64}])
āāā return %8
I was wondering what Core.PartialStruct(@NamedTuple{a::String, b::Matrix{Float64}}, Any[Core.Const("test"), Matrix{Float64}])
means, and if having Any
inside it is a sign of type instability.