Skip to content

Commit 92fc06f

Browse files
authored
Fix missing CodeInstance owner lookup in _jl_invoke (#58072)
`_jl_invoke` has a manually inlined version of `jl_method_compiled` that was missing the `->owner` check. I don't think there's any strong reason to duplicate this code path, so unify them and make sure the `->owner` path is there. This fixes an issue where calling `CompilerDevTools`'s `with_new_compiler` would cause the creation of CodeInstances that would then be dispatched to outside the `with_new_compiler` context.
1 parent 451766a commit 92fc06f

File tree

1 file changed

+19
-15
lines changed

1 file changed

+19
-15
lines changed

src/gf.c

Lines changed: 19 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -2651,20 +2651,30 @@ JL_DLLEXPORT jl_value_t *jl_rettype_inferred_native(jl_method_instance_t *mi, si
26512651

26522652
JL_DLLEXPORT jl_value_t *(*const jl_rettype_inferred_addr)(jl_method_instance_t *mi, size_t min_world, size_t max_world) JL_NOTSAFEPOINT = jl_rettype_inferred_native;
26532653

2654-
jl_code_instance_t *jl_method_compiled(jl_method_instance_t *mi, size_t world)
2654+
STATIC_INLINE jl_callptr_t jl_method_compiled_callptr(jl_method_instance_t *mi, size_t world, jl_code_instance_t **codeinst_out) JL_NOTSAFEPOINT
26552655
{
26562656
jl_code_instance_t *codeinst = jl_atomic_load_relaxed(&mi->cache);
26572657
for (; codeinst; codeinst = jl_atomic_load_relaxed(&codeinst->next)) {
26582658
if (codeinst->owner != jl_nothing)
26592659
continue;
26602660
if (jl_atomic_load_relaxed(&codeinst->min_world) <= world && world <= jl_atomic_load_relaxed(&codeinst->max_world)) {
2661-
if (jl_atomic_load_relaxed(&codeinst->invoke) != NULL)
2662-
return codeinst;
2661+
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
2662+
if (!invoke)
2663+
continue;
2664+
*codeinst_out = codeinst;
2665+
return invoke;
26632666
}
26642667
}
26652668
return NULL;
26662669
}
26672670

2671+
jl_code_instance_t *jl_method_compiled(jl_method_instance_t *mi, size_t world) JL_NOTSAFEPOINT
2672+
{
2673+
jl_code_instance_t *codeinst = NULL;
2674+
jl_method_compiled_callptr(mi, world, &codeinst);
2675+
return codeinst;
2676+
}
2677+
26682678
jl_mutex_t precomp_statement_out_lock;
26692679

26702680
_Atomic(uint8_t) jl_force_trace_compile_timing_enabled = 0;
@@ -3465,17 +3475,11 @@ STATIC_INLINE jl_value_t *verify_type(jl_value_t *v) JL_NOTSAFEPOINT
34653475

34663476
STATIC_INLINE jl_value_t *_jl_invoke(jl_value_t *F, jl_value_t **args, uint32_t nargs, jl_method_instance_t *mfunc, size_t world)
34673477
{
3468-
// manually inlined copy of jl_method_compiled
3469-
jl_code_instance_t *codeinst = jl_atomic_load_relaxed(&mfunc->cache);
3470-
while (codeinst) {
3471-
if (jl_atomic_load_relaxed(&codeinst->min_world) <= world && world <= jl_atomic_load_relaxed(&codeinst->max_world)) {
3472-
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
3473-
if (invoke != NULL) {
3474-
jl_value_t *res = invoke(F, args, nargs, codeinst);
3475-
return verify_type(res);
3476-
}
3477-
}
3478-
codeinst = jl_atomic_load_relaxed(&codeinst->next);
3478+
jl_code_instance_t *codeinst = NULL;
3479+
jl_callptr_t invoke = jl_method_compiled_callptr(mfunc, world, &codeinst);
3480+
if (invoke) {
3481+
jl_value_t *res = invoke(F, args, nargs, codeinst);
3482+
return verify_type(res);
34793483
}
34803484
int64_t last_alloc = jl_options.malloc_log ? jl_gc_diff_total_bytes() : 0;
34813485
int last_errno = errno;
@@ -3489,7 +3493,7 @@ STATIC_INLINE jl_value_t *_jl_invoke(jl_value_t *F, jl_value_t **args, uint32_t
34893493
errno = last_errno;
34903494
if (jl_options.malloc_log)
34913495
jl_gc_sync_total_bytes(last_alloc); // discard allocation count from compilation
3492-
jl_callptr_t invoke = jl_atomic_load_acquire(&codeinst->invoke);
3496+
invoke = jl_atomic_load_acquire(&codeinst->invoke);
34933497
jl_value_t *res = invoke(F, args, nargs, codeinst);
34943498
return verify_type(res);
34953499
}

0 commit comments

Comments
 (0)