Skip to content

Commit 250822b

Browse files
committed
Support renaming of old types
1 parent e1def10 commit 250822b

File tree

3 files changed

+26
-0
lines changed

3 files changed

+26
-0
lines changed

base/reflection.jl

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,20 @@ function resolve(g::GlobalRef; force::Bool=false)
108108
return g
109109
end
110110

111+
function rename_binding(mod::Module, oldname::Symbol, newname::Symbol)
112+
T = getfield(mod, oldname)
113+
ccall(:jl_rename_binding, Void, (Any, Any, Any), mod, oldname, newname)
114+
T.name.name = newname
115+
T
116+
end
117+
118+
function shunt_binding(mod::Module, oldname::Symbol)
119+
i = oldbinding_counter[] + 1 # oldbinding_counter created in refpointer.jl
120+
oldbinding_counter[] = i
121+
newname = Symbol(oldname, '#', i)
122+
rename_binding(mod, oldname, newname)
123+
end
124+
111125
"""
112126
fieldname(x::DataType, i::Integer)
113127

base/refpointer.jl

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -122,3 +122,5 @@ setindex!(b::RefValue, x) = (b.x = x; b)
122122
setindex!(b::RefArray, x) = (b.x[b.i] = x; b)
123123

124124
###
125+
126+
const oldbinding_counter = Ref(0)

src/module.c

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -519,6 +519,16 @@ void jl_binding_deprecation_warning(jl_binding_t *b)
519519
}
520520
}
521521

522+
JL_DLLEXPORT void jl_rename_binding(jl_module_t *m, jl_sym_t *oldvar, jl_sym_t *newvar)
523+
{
524+
jl_binding_t *b = jl_get_binding(m, oldvar);
525+
if (b) {
526+
b->name = newvar;
527+
ptrhash_remove(&m->bindings, oldvar);
528+
ptrhash_put(&m->bindings, newvar, b);
529+
}
530+
}
531+
522532
JL_DLLEXPORT void jl_checked_assignment(jl_binding_t *b, jl_value_t *rhs)
523533
{
524534
if (b->constp && b->value != NULL) {

0 commit comments

Comments
 (0)