Skip to content

Commit e46cc1a

Browse files
authored
Make version of opaque closure constructor in world (#56823)
Successor to #56808 which enables an opaque closure to be constructed with a specified world age (if, for example, the current world age isn't valid due to being in a generated function). Required for EnzymeAD/Reactant.jl#365
2 parents aa4cd70 + 6b169ef commit e46cc1a

File tree

2 files changed

+13
-7
lines changed

2 files changed

+13
-7
lines changed

src/jl_exported_funcs.inc

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -330,6 +330,8 @@
330330
XX(jl_new_method_table) \
331331
XX(jl_new_method_uninit) \
332332
XX(jl_new_module) \
333+
XX(jl_new_opaque_closure_from_code_info) \
334+
XX(jl_new_opaque_closure_from_code_info_in_world) \
333335
XX(jl_new_primitivetype) \
334336
XX(jl_new_struct) \
335337
XX(jl_new_structt) \

src/opaque_closure.c

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ JL_DLLEXPORT int jl_is_valid_oc_argtype(jl_tupletype_t *argt, jl_method_t *sourc
2828
}
2929

3030
static jl_opaque_closure_t *new_opaque_closure(jl_tupletype_t *argt, jl_value_t *rt_lb, jl_value_t *rt_ub,
31-
jl_value_t *source_, jl_value_t *captures, int do_compile)
31+
jl_value_t *source_, jl_value_t *captures, int do_compile, size_t world)
3232
{
3333
if (!jl_is_tuple_type((jl_value_t*)argt)) {
3434
jl_error("OpaqueClosure argument tuple must be a tuple type");
@@ -61,7 +61,6 @@ static jl_opaque_closure_t *new_opaque_closure(jl_tupletype_t *argt, jl_value_t
6161
}
6262
}
6363
jl_task_t *ct = jl_current_task;
64-
size_t world = ct->world_age;
6564
jl_code_instance_t *ci = NULL;
6665
if (do_compile) {
6766
ci = jl_compile_method_internal(mi, world);
@@ -140,13 +139,13 @@ jl_opaque_closure_t *jl_new_opaque_closure(jl_tupletype_t *argt, jl_value_t *rt_
140139
{
141140
jl_value_t *captures = jl_f_tuple(NULL, env, nenv);
142141
JL_GC_PUSH1(&captures);
143-
jl_opaque_closure_t *oc = new_opaque_closure(argt, rt_lb, rt_ub, source_, captures, do_compile);
142+
jl_opaque_closure_t *oc = new_opaque_closure(argt, rt_lb, rt_ub, source_, captures, do_compile, jl_current_task->world_age);
144143
JL_GC_POP();
145144
return oc;
146145
}
147146

148-
JL_DLLEXPORT jl_opaque_closure_t *jl_new_opaque_closure_from_code_info(jl_tupletype_t *argt, jl_value_t *rt_lb, jl_value_t *rt_ub,
149-
jl_module_t *mod, jl_code_info_t *ci, int lineno, jl_value_t *file, int nargs, int isva, jl_value_t *env, int do_compile, int isinferred)
147+
JL_DLLEXPORT jl_opaque_closure_t *jl_new_opaque_closure_from_code_info_in_world(jl_tupletype_t *argt, jl_value_t *rt_lb, jl_value_t *rt_ub,
148+
jl_module_t *mod, jl_code_info_t *ci, int lineno, jl_value_t *file, int nargs, int isva, jl_value_t *env, int do_compile, int isinferred, size_t world)
150149
{
151150
jl_value_t *root = NULL, *sigtype = NULL;
152151
jl_code_instance_t *inst = NULL;
@@ -156,7 +155,6 @@ JL_DLLEXPORT jl_opaque_closure_t *jl_new_opaque_closure_from_code_info(jl_tuplet
156155
root = jl_new_struct(jl_linenumbernode_type, root, file);
157156
jl_method_t *meth = jl_make_opaque_closure_method(mod, jl_nothing, nargs, root, ci, isva, isinferred);
158157
root = (jl_value_t*)meth;
159-
size_t world = jl_current_task->world_age;
160158
// these are only legal in the current world since they are not in any tables
161159
jl_atomic_store_release(&meth->primary_world, world);
162160

@@ -172,11 +170,17 @@ JL_DLLEXPORT jl_opaque_closure_t *jl_new_opaque_closure_from_code_info(jl_tuplet
172170
jl_mi_cache_insert(mi, inst);
173171
}
174172

175-
jl_opaque_closure_t *oc = new_opaque_closure(argt, rt_lb, rt_ub, root, env, do_compile);
173+
jl_opaque_closure_t *oc = new_opaque_closure(argt, rt_lb, rt_ub, root, env, do_compile, world);
176174
JL_GC_POP();
177175
return oc;
178176
}
179177

178+
JL_DLLEXPORT jl_opaque_closure_t *jl_new_opaque_closure_from_code_info(jl_tupletype_t *argt, jl_value_t *rt_lb, jl_value_t *rt_ub,
179+
jl_module_t *mod, jl_code_info_t *ci, int lineno, jl_value_t *file, int nargs, int isva, jl_value_t *env, int do_compile, int isinferred)
180+
{
181+
return jl_new_opaque_closure_from_code_info_in_world(argt, rt_lb, rt_ub, mod, ci, lineno, file, nargs, isva, env, do_compile, isinferred, jl_current_task->world_age);
182+
}
183+
180184
JL_CALLABLE(jl_new_opaque_closure_jlcall)
181185
{
182186
if (nargs < 5)

0 commit comments

Comments
 (0)