|
1 | 1 | # This file provides an adaptor to match the API expected by the Julia runtime
|
2 | 2 | # code in the binding Core._parse
|
3 | 3 |
|
| 4 | +function _set_core_parse_hook(parser) |
| 5 | + # HACK! Fool the runtime into allowing us to set Core._parse, even during |
| 6 | + # incremental compilation. (Ideally we'd just arrange for Core._parse to be |
| 7 | + # set to the JuliaSyntax parser. But how do we signal that to the dumping |
| 8 | + # code outside of the initial creation of Core?) |
| 9 | + i = findfirst(==(:incremental), fieldnames(Base.JLOptions)) |
| 10 | + ptr = convert(Ptr{fieldtype(Base.JLOptions, i)}, |
| 11 | + cglobal(:jl_options, Base.JLOptions) + fieldoffset(Base.JLOptions, i)) |
| 12 | + incremental = unsafe_load(ptr) |
| 13 | + if incremental != 0 |
| 14 | + unsafe_store!(ptr, 0) |
| 15 | + end |
| 16 | + |
| 17 | + Base.eval(Core, :(_parse = $parser)) |
| 18 | + |
| 19 | + if incremental != 0 |
| 20 | + unsafe_store!(ptr, incremental) |
| 21 | + end |
| 22 | +end |
| 23 | + |
4 | 24 | # Use caller's world age.
|
5 | 25 | const _caller_world = typemax(UInt)
|
6 | 26 | const _parser_world_age = Ref{UInt}(_caller_world)
|
@@ -152,8 +172,7 @@ function enable_in_core!(enable=true; freeze_world_age = true,
|
152 | 172 | close(_debug_log[])
|
153 | 173 | _debug_log[] = nothing
|
154 | 174 | end
|
155 |
| - parser = enable ? core_parser_hook : _default_parser |
156 |
| - Base.eval(Core, :(_parse = $parser)) |
| 175 | + _set_core_parse_hook(enable ? core_parser_hook : _default_parser) |
157 | 176 | nothing
|
158 | 177 | end
|
159 | 178 |
|
0 commit comments