- 
          
- 
                Notifications
    You must be signed in to change notification settings 
- Fork 5.7k
Closed
Labels
latencyLatencyLatency
Description
If you create a package that tries to precompile an Array constructor:
module PrecompileVector
struct Foo end
precompile(Tuple{Type{Array{Foo, 1}}, UndefInitializer, Tuple{Int64}})
export Foo
end # module PrecompileVectorThis doesn't seem to "stick":
$ julia +nightly --project=PrecompileVector --trace-compile=stderr -e "using PrecompileVector; Vector{Foo}(undef, (3,))"
precompile(Tuple{Type{Array{PrecompileVector.Foo, 1}}, UndefInitializer, Tuple{Int64}})The problem seems to be that this doesn't make it into our "newly-inferred" list:
julia> using PrecompileVector
julia> tt = Tuple{Type{Vector{Foo}}, UndefInitializer, Tuple{Int}}
julia> mi = ccall(:jl_method_lookup_by_tt, Any,
                   (Any, Csize_t, Any),
                   tt, Base.get_world_counter(), #= mt =# nothing)
julia> isdefined(mi, :cache)
false
julia> inferred = Any[]; ccall(:jl_set_newly_inferred, Cvoid, (Any,), inferred);
julia> Vector{Foo}(undef, (3,)); # trigger compilation
julia> ccall(:jl_set_newly_inferred, Cvoid, (Any,), nothing)
julia> mi.cache
CodeInstance for MethodInstance for Vector{Foo}(::UndefInitializer, ::Tuple{Int64})
julia> mi.cache in inferred
falseVector{Foo}(::UndefInitializer, ::Tuple{Int64}) was compiled (and inferred) for the first time, but it didn't make it into the list due to this m.module != Core check: 
Line 17 in 6f52a98
| if isa(m, Method) && m.module != Core | 
I'm not sure why we have that guard, but it has the un-intended side effect that precompile(...) statements are less effective over re-exported Core methods in Base.
nickrobinson251
Metadata
Metadata
Assignees
Labels
latencyLatencyLatency