Marginally less opaque closures.
Specifically, a MistyClosure is comprises an OpaqueClosure paired with the IRCode that defines it.
This is useful if you generate an OpaqueClosure, and want to be able to retrieve the IRCode later on.
# Get the `IRCode` associated to `sin(5.0)`.
ir = Base.code_ircode_by_type(Tuple{typeof(sin), Float64})[1][1]
# Produce a `MistyClosure` using it. All kwargs are passed to the `OpaqueClosure`
# constructor.
mc = MistyClosure(ir; do_compile=true)
# Call it.
mc(5.0) == sin(5.0)Sometimes you'll already have an OpaqueClosure lying around, and not want to produce a new one from an IRCode (as this often takes a surprisingly large amount of time).
If ths is the case, you can simply use the default constructor for MistyClosure.
That is, write
mc = MistyClosure(existing_opaque_closure, ir)Of course, it is your responsibility so ensure that ir and existing_opaque_closure are in agreement.