get module of exported datatypes and variables

138 views
Skip to first unread message

Mauro

unread,
Jun 12, 2014, 9:52:33 PM6/12/14
to julia...@googlegroups.com
I can get the module of an exported method like so:
```
julia> module BB
export B2, cc, f
type B2
a
end
f(x) = x+3
cc = 5
end

julia> using BB

julia> Base.function_module(f)
BB
```
How can I do the same for the datatype `B2` and the variable `cc`? (as
a bonus, what about macros?)

Mauro

unread,
Jun 13, 2014, 9:35:18 AM6/13/14
to julia...@googlegroups.com
For the datatype it is:
julia> B2.name.module

For variable bindings, Julia knows about it, as it displays a warning:

julia> cc = 1
Warning: imported binding for cc overwritten in module Main

This originates from the function `jl_get_binding_wr` in `src/module.c`,
which shows that a binding as a `owner`. I'll try and figure out how to
get to it.

For marcos it seems impossible to get hold of them without them being
evaluated.

Mauro

unread,
Jun 16, 2014, 12:15:18 PM6/16/14
to julia...@googlegroups.com
For posterity here a method to find the origin of variable bindings.
Adding to module.c:
```
// return module of binding
DLLEXPORT jl_module_t *jl_get_module_of_binding(jl_sym_t *var)
{
jl_binding_t *b = (jl_binding_t*)ptrhash_get(&jl_current_module->bindings, var);
}
```

and defining in reflection.jl:
```
function binding_module(var::Symbol)
if isdefined(var) # this returns true for 'used' bindings
mod = ccall(:jl_get_module_of_binding, Any, (Any,), var)
else
error("Symbol $var is not bound in the current module $(current_module()) and not exported in any 'used' module.")
end
end

macro binding_module(var)
:(binding_module(symbol($(string(var)))) )
end
```
(is there a better way to write that macro? I.e. how to get to the
Symbol of var?)


Now I can do:
```
julia> Base.@binding_module isa
Core

julia> module B3
export b3, t
b3 = 5
t() = 5
end

julia> Base.@binding_module t
ERROR: Symbol t is not bound in the current module Main and not exported in any 'used' module.
in error at error.jl:21
in binding_module at reflection.jl:171

julia> using B3

julia> Base.@binding_module t
B3

julia> b = B3.b3
5

julia> Base.@binding_module b
Main

julia> Base.@binding_module b3
B3
```

Brian Piper

unread,
Jun 19, 2014, 3:55:32 PM6/19/14
to julia...@googlegroups.com
This is pretty interesting, it seems odd that we have function_module, but nothing like a "variable_module". However, I can't seem to get this to work with the last commit in master (f548812). It gives an error:

julia> Base.@binding_module b3
Error showing value of type b3:
ERROR: type: subtype: expected Type{T<:Top}, got (Symbol,)
 in typeinf at ./inference.jl:1233
 in typeinf_ext at ./inference.jl:1207
 in print_response at REPL.jl:139
 in print_response at REPL.jl:124
 in anonymous at REPL.jl:539
 in run_interface at ./LineEdit.jl:1349
 in run_frontend at ./REPL.jl:761
 in run_repl at ./REPL.jl:169
 in _start at ./client.jl:398

Was there something else you changed?

Mauro

unread,
Jun 19, 2014, 6:55:30 PM6/19/14
to julia...@googlegroups.com
Due to popular demand I created a pull request ;-)

https://github.com/JuliaLang/julia/pull/7322

Let me know if that does not work for you.
--

Reply all
Reply to author
Forward
0 new messages