Skip to content

World age issues #83

@lucianolorenti

Description

@lucianolorenti

Hello! I am facing a worldage issue when I try to do something like this:

module A
using Requires
function __init__()
    @require SQLite="0aa819cd-b072-5ff4-a722-6bc24af294d9" begin
        function do_something(d::SQLite.DB)
            println(d)
        end
    end
end
end

module B
using Main.A
using Requires
function connect(cfg::Dict)
    if cfg["engine"] == "sqlite"
        @eval using SQLite
        f = Base.invokelatest(build_sqlite, "a")
        A.do_something(f)
        
    end

end
function __init__()
    @require SQLite="0aa819cd-b072-5ff4-a722-6bc24af294d9" begin
        function build_sqlite(file::String)
            return SQLite.DB(file)
        end
    end
end
end
using Main.B
Main.B.connect(Dict("engine"=>"sqlite"))
ERROR: MethodError: no method matching build_sqlite(::String)
The applicable method may be too new: running in world age 26781, while current world is 26792.

In module B, I would like to load SQLite only if a configuration dict says so. But then module A also uses Requires to load all the SQLite related functions when is loaded. And when B tries to call a function from A, the world age issue appears.

I really don't know if I am doing what I want in the correct way. There is a workaround or a different way to do it?

Can I avoid using invokelatest every time I call a function from A?

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions