Skip to content

Commit 38e7a6d

Browse files
committed
Support K"gc_preserve"
Note that this lowering may change in JuliaLang/julia#59129
1 parent 6da4dd4 commit 38e7a6d

File tree

3 files changed

+19
-0
lines changed

3 files changed

+19
-0
lines changed

src/desugaring.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4537,6 +4537,15 @@ function expand_forms_2(ctx::DesugaringContext, ex::SyntaxTree, docs=nothing)
45374537
]
45384538
elseif k == K"inert"
45394539
ex
4540+
elseif k == K"gc_preserve"
4541+
s = ssavar(ctx, ex)
4542+
r = ssavar(ctx, ex)
4543+
@ast ctx ex [K"block"
4544+
[K"=" s [K"gc_preserve_begin" children(ex)[2:end]...]]
4545+
[K"=" r expand_forms_2(ctx, children(ex)[1])]
4546+
[K"gc_preserve_end" s]
4547+
r
4548+
]
45404549
elseif k == K"&"
45414550
throw(LoweringError(ex, "invalid syntax"))
45424551
elseif k == K"$"

src/kinds.jl

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ function _register_kinds()
1111
# Flag for @generated parts of a functon
1212
"generated"
1313
# Temporary rooting of identifiers (GC.@preserve)
14+
"gc_preserve"
1415
"gc_preserve_begin"
1516
"gc_preserve_end"
1617
# A literal Julia value of any kind, as might be inserted into the

test/macros.jl

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,4 +310,13 @@ end
310310
MethodError: no method matching var"@sig_mismatch"(::JuliaLowering.MacroContext, ::JuliaLowering.SyntaxTree""")
311311
end
312312

313+
@testset "old macros producing exotic expr heads" begin
314+
@test JuliaLowering.include_string(test_mod, """
315+
let # example from @preserve docstring
316+
x = Ref{Int}(101)
317+
p = Base.unsafe_convert(Ptr{Int}, x)
318+
GC.@preserve x unsafe_load(p)
319+
end""") === 101 # Expr(:gc_preserve)
320+
end
321+
313322
end # module macros

0 commit comments

Comments
 (0)