@@ -176,12 +176,13 @@ function JITDylib(es::ExecutionSession, name; bare=false)
176
176
JITDylib (ref)
177
177
end
178
178
179
- @checked struct DefinitionGenerator
179
+ abstract type AbstractDefinitionGenerator end
180
+ @checked struct DefinitionGenerator <: AbstractDefinitionGenerator
180
181
ref:: API.LLVMOrcDefinitionGeneratorRef
181
182
end
182
183
Base. unsafe_convert (:: Type{API.LLVMOrcDefinitionGeneratorRef} , dg:: DefinitionGenerator ) = dg. ref
183
184
184
- function add! (jd:: JITDylib , dg:: DefinitionGenerator )
185
+ function add! (jd:: JITDylib , dg:: AbstractDefinitionGenerator )
185
186
API. LLVMOrcJITDylibAddGenerator (jd, dg)
186
187
end
187
188
@@ -191,7 +192,37 @@ function CreateDynamicLibrarySearchGeneratorForProcess(prefix)
191
192
DefinitionGenerator (ref[])
192
193
end
193
194
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} ()
195
226
196
227
function lookup_dylib (es:: ExecutionSession , name)
197
228
ref = API. LLVMOrcExecutionSessionGetJITDylibByName (es, name)
0 commit comments