@@ -172,7 +172,7 @@ static jl_method_instance_t *jl_specializations_get_linfo_(jl_method_t *m JL_PRO
172
172
if (!hv )
173
173
i -= 1 ;
174
174
assert (jl_svecref (specializations , i ) == jl_nothing );
175
- jl_svecset (specializations , i , mi ); // jl_atomic_store_release ?
175
+ jl_svecset (specializations , i , mi ); // jl_atomic_store_relaxed ?
176
176
if (hv ) {
177
177
// TODO: fuse lookup and insert steps?
178
178
jl_smallintset_insert (& m -> speckeyset , (jl_value_t * )m , speccache_hash , i , specializations );
@@ -471,39 +471,38 @@ int foreach_mtable_in_module(
471
471
int (* visit )(jl_methtable_t * mt , void * env ),
472
472
void * env )
473
473
{
474
- size_t i ;
475
- void * * table = m -> bindings .table ;
476
- for (i = 0 ; i < m -> bindings .size ; i += 2 ) {
477
- if (table [i + 1 ] != HT_NOTFOUND ) {
478
- jl_sym_t * name = (jl_sym_t * )table [i ];
479
- jl_binding_t * b = (jl_binding_t * )table [i + 1 ];
480
- JL_GC_PROMISE_ROOTED (b );
481
- if (jl_atomic_load_relaxed (& b -> owner ) == b && b -> constp ) {
482
- jl_value_t * v = jl_atomic_load_relaxed (& b -> value );
483
- if (v ) {
484
- jl_value_t * uw = jl_unwrap_unionall (v );
485
- if (jl_is_datatype (uw )) {
486
- jl_typename_t * tn = ((jl_datatype_t * )uw )-> name ;
487
- if (tn -> module == m && tn -> name == name && tn -> wrapper == v ) {
488
- // this is the original/primary binding for the type (name/wrapper)
489
- jl_methtable_t * mt = tn -> mt ;
490
- if (mt != NULL && (jl_value_t * )mt != jl_nothing && mt != jl_type_type_mt && mt != jl_nonfunction_mt ) {
491
- if (!visit (mt , env ))
492
- return 0 ;
493
- }
494
- }
495
- }
496
- else if (jl_is_module (v )) {
497
- jl_module_t * child = (jl_module_t * )v ;
498
- if (child != m && child -> parent == m && child -> name == name ) {
499
- // this is the original/primary binding for the submodule
500
- if (!foreach_mtable_in_module (child , visit , env ))
474
+ jl_svec_t * table = jl_atomic_load_relaxed (& m -> bindings );
475
+ for (size_t i = 0 ; i < jl_svec_len (table ); i ++ ) {
476
+ jl_binding_t * b = (jl_binding_t * )jl_svec_ref (table , i );
477
+ if ((void * )b == jl_nothing )
478
+ break ;
479
+ jl_sym_t * name = b -> globalref -> name ;
480
+ if (jl_atomic_load_relaxed (& b -> owner ) == b && b -> constp ) {
481
+ jl_value_t * v = jl_atomic_load_relaxed (& b -> value );
482
+ if (v ) {
483
+ jl_value_t * uw = jl_unwrap_unionall (v );
484
+ if (jl_is_datatype (uw )) {
485
+ jl_typename_t * tn = ((jl_datatype_t * )uw )-> name ;
486
+ if (tn -> module == m && tn -> name == name && tn -> wrapper == v ) {
487
+ // this is the original/primary binding for the type (name/wrapper)
488
+ jl_methtable_t * mt = tn -> mt ;
489
+ if (mt != NULL && (jl_value_t * )mt != jl_nothing && mt != jl_type_type_mt && mt != jl_nonfunction_mt ) {
490
+ if (!visit (mt , env ))
501
491
return 0 ;
502
492
}
503
493
}
504
494
}
495
+ else if (jl_is_module (v )) {
496
+ jl_module_t * child = (jl_module_t * )v ;
497
+ if (child != m && child -> parent == m && child -> name == name ) {
498
+ // this is the original/primary binding for the submodule
499
+ if (!foreach_mtable_in_module (child , visit , env ))
500
+ return 0 ;
501
+ }
502
+ }
505
503
}
506
504
}
505
+ table = jl_atomic_load_relaxed (& m -> bindings );
507
506
}
508
507
return 1 ;
509
508
}
0 commit comments