@@ -176,12 +176,13 @@ function JITDylib(es::ExecutionSession, name; bare=false)
176176 JITDylib (ref)
177177end
178178
179- @checked struct DefinitionGenerator
179+ abstract type AbstractDefinitionGenerator end
180+ @checked struct DefinitionGenerator <: AbstractDefinitionGenerator
180181 ref:: API.LLVMOrcDefinitionGeneratorRef
181182end
182183Base. unsafe_convert (:: Type{API.LLVMOrcDefinitionGeneratorRef} , dg:: DefinitionGenerator ) = dg. ref
183184
184- function add! (jd:: JITDylib , dg:: DefinitionGenerator )
185+ function add! (jd:: JITDylib , dg:: AbstractDefinitionGenerator )
185186 API. LLVMOrcJITDylibAddGenerator (jd, dg)
186187end
187188
@@ -191,7 +192,37 @@ function CreateDynamicLibrarySearchGeneratorForProcess(prefix)
191192 DefinitionGenerator (ref[])
192193end
193194
194- # LLVMOrcCreateCustomCAPIDefinitionGenerator(F, Ctx)
195+ # We can do this async by copying content of `LookupState` and setting it to
196+ # C_NULL and returning ErrorSuccess. We then would need to call `LookupContinue`
197+ # but that function seems to be missing from teh CAPI.
198+ # Note LookupSet get's destroyed when we return here
199+ function DefinitionGeneratorTryToGenerateFunction (GeneratorObj:: API.LLVMOrcDefinitionGeneratorRef , ctx:: Ptr{Cvoid} , LookupState:: Ptr{API.LLVMOrcLookupStateRef} , Kind:: API.LLVMOrcLookupKind , JD:: API.LLVMOrcJITDylibRef , JDLookupFlags:: API.LLVMOrcJITDylibLookupFlags , LookupSet:: API.LLVMOrcCLookupSet , LookupSetSize:: Csize_t ):: API.LLVMErrorRef
200+ dg = Base. unsafe_pointer_to_objref (ctx):: CustomDefinitionGenerator
201+ @assert dg. dg. ref === GeneratorObj
202+ lookupSet = Base. unsafe_wrap (Array, LookupSet, LookupSetSize, own= false )
203+ return dg. callback (Kind, JITDylib (JD), JDLookupFlags, lookupSet):: API.LLVMErrorRef
204+ end
205+
206+ mutable struct CustomDefinitionGenerator <: AbstractDefinitionGenerator
207+ callback
208+ dg:: DefinitionGenerator
209+ function CustomDefinitionGenerator (callback)
210+ this = new (callback)
211+ push! (CUSTOM_DG_ROOTS, this)
212+
213+ ref = API. LLVMOrcCreateCustomCAPIDefinitionGenerator (
214+ @cfunction (DefinitionGeneratorTryToGenerateFunction, API. LLVMErrorRef, (API. LLVMOrcDefinitionGeneratorRef, Ptr{Cvoid}, Ptr{API. LLVMOrcLookupStateRef}, API. LLVMOrcLookupKind, API. LLVMOrcJITDylibRef, API. LLVMOrcJITDylibLookupFlags, API. LLVMOrcCLookupSet, Csize_t)),
215+ Base. pointer_from_objref (this)
216+ )
217+
218+ this. dg = DefinitionGenerator (ref)
219+ return this
220+ end
221+ end
222+ Base. cconvert (:: Type{API.LLVMOrcDefinitionGeneratorRef} , dg:: CustomDefinitionGenerator ) = dg. dg
223+
224+ # todo: Delete
225+ const CUSTOM_DG_ROOTS = Base. IdSet {CustomDefinitionGenerator} ()
195226
196227function lookup_dylib (es:: ExecutionSession , name)
197228 ref = API. LLVMOrcExecutionSessionGetJITDylibByName (es, name)
0 commit comments