diff --git a/Project.toml b/Project.toml index 92b81e5..91c2a86 100644 --- a/Project.toml +++ b/Project.toml @@ -1,6 +1,6 @@ name = "LoweredCodeUtils" uuid = "6f1432cf-f94c-5a45-995e-cdbf5db27b0b" -version = "3.5.1" +version = "3.5.2" authors = ["Tim Holy "] [deps] diff --git a/src/signatures.jl b/src/signatures.jl index 6fe00ac..2746be8 100644 --- a/src/signatures.jl +++ b/src/signatures.jl @@ -242,7 +242,9 @@ end # try to normalize `def` to `GlobalRef` representation function normalize_defsig(@nospecialize(def), mod::Module) if def isa QuoteNode - def = nameof(def.value) + # A quoted Symbol (e.g. the callee of `:foo(x)`) is already a name; only + # other wrapped values (functions, types, modules) need `nameof`. + def = def.value isa Symbol ? def.value : nameof(def.value) end if def isa Symbol def = GlobalRef(mod, def) diff --git a/test/signatures.jl b/test/signatures.jl index 082e72c..5e02174 100644 --- a/test/signatures.jl +++ b/test/signatures.jl @@ -538,4 +538,19 @@ end LoweredCodeUtils.identify_framemethod_calls(frame) # make sure this does not throw end +@testset "normalize_defsig with a quoted Symbol callee (issue Revise#914)" begin + # A quoted Symbol is already a name and must not be passed to `nameof`. + @test LoweredCodeUtils.normalize_defsig(QuoteNode(:length), Main) === GlobalRef(Main, :length) + + # A method body containing a call to a quoted symbol, e.g. `:length(list)`, + # lowers to a `:call` whose callee is `QuoteNode(:length)`. Walking it must + # not throw. + ex = :(function f_rvs914(list) + m = zeros(3, 3) + m[:, :length(list)] + end) + frame = Frame(Main, ex) + @test LoweredCodeUtils.identify_framemethod_calls(frame) isa Any # must not throw +end + end # module signatures