Skip to content

Commit bdb7807

Browse files
committed
Adapt to upstream changes wrt. generated function world age handling.
1 parent 4d661f8 commit bdb7807

File tree

1 file changed

+31
-12
lines changed

1 file changed

+31
-12
lines changed

src/ConstructionBase.jl

Lines changed: 31 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -48,27 +48,46 @@ getfields(x::NamedTuple) = x
4848
getproperties(o::NamedTuple) = o
4949
getproperties(o::Tuple) = o
5050

51-
function is_propertynames_overloaded(T::Type)::Bool
52-
which(propertynames, Tuple{T}).sig !== Tuple{typeof(propertynames), Any}
51+
@static if fieldcount(Core.GeneratedFunctionStub) == 3
52+
53+
# after JuliaLang/julia#48611, generated functions should respect world ages
54+
55+
function is_propertynames_overloaded_generator(world::UInt, source, self, obj)
56+
sig = Base.signature_type(propertynames, Tuple{obj})
57+
m = Base._which(sig; world)
58+
has_overload = m.method.sig !== Tuple{typeof(propertynames), Any}
59+
stub = Core.GeneratedFunctionStub(identity, Core.svec(:is_propertynames_overloaded, :obj), Core.svec())
60+
stub(world, source, :(return $has_overload))
61+
end
62+
63+
@eval function is_propertynames_overloaded(obj)
64+
$(Expr(:meta, :generated_only))
65+
$(Expr(:meta, :generated, is_propertynames_overloaded_generator))
66+
end
67+
68+
else
69+
70+
@generated function is_propertynames_overloaded(obj)
71+
sig = Base.signature_type(propertynames, Tuple{obj})
72+
m = Base._which(sig)
73+
has_overload = m.method.sig !== Tuple{typeof(propertynames), Any}
74+
:(return $has_overload)
75+
end
76+
5377
end
5478

55-
@generated function check_properties_are_fields(obj)
79+
80+
function check_properties_are_fields(obj::T) where T
5681
if is_propertynames_overloaded(obj)
57-
return quote
58-
T = typeof(obj)
59-
msg = """
82+
error("""
6083
The function `Base.propertynames` was overloaded for type `$T`.
6184
Please make sure the following methods are also overloaded for this type:
6285
```julia
6386
ConstructionBase.setproperties
6487
ConstructionBase.getproperties # optional in VERSION >= julia v1.7
65-
```
66-
"""
67-
error(msg)
68-
end
69-
else
70-
:(nothing)
88+
```""")
7189
end
90+
return
7291
end
7392

7493
# names are consecutive integers: return tuple

0 commit comments

Comments
 (0)