@@ -2651,20 +2651,30 @@ JL_DLLEXPORT jl_value_t *jl_rettype_inferred_native(jl_method_instance_t *mi, si
2651
2651
2652
2652
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 ;
2653
2653
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
2655
2655
{
2656
2656
jl_code_instance_t * codeinst = jl_atomic_load_relaxed (& mi -> cache );
2657
2657
for (; codeinst ; codeinst = jl_atomic_load_relaxed (& codeinst -> next )) {
2658
2658
if (codeinst -> owner != jl_nothing )
2659
2659
continue ;
2660
2660
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 ;
2663
2666
}
2664
2667
}
2665
2668
return NULL ;
2666
2669
}
2667
2670
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
+
2668
2678
jl_mutex_t precomp_statement_out_lock ;
2669
2679
2670
2680
_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
3465
3475
3466
3476
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 )
3467
3477
{
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 );
3479
3483
}
3480
3484
int64_t last_alloc = jl_options .malloc_log ? jl_gc_diff_total_bytes () : 0 ;
3481
3485
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
3489
3493
errno = last_errno ;
3490
3494
if (jl_options .malloc_log )
3491
3495
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 );
3493
3497
jl_value_t * res = invoke (F , args , nargs , codeinst );
3494
3498
return verify_type (res );
3495
3499
}
0 commit comments