@@ -1660,8 +1660,8 @@ fn block(
1660
1660
}
1661
1661
1662
1662
#[ inline]
1663
- fn try_table_valid ( module : & Module , _ : & mut CodeBuilder ) -> bool {
1664
- module. config . exceptions_enabled
1663
+ fn try_table_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
1664
+ module. config . exceptions_enabled && !builder . shared
1665
1665
}
1666
1666
1667
1667
fn try_table (
@@ -1983,6 +1983,7 @@ fn call_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
1983
1983
. functions
1984
1984
. keys ( )
1985
1985
. any ( |func_ty| builder. types_on_stack ( module, & func_ty. params ) )
1986
+ && !builder. shared
1986
1987
}
1987
1988
1988
1989
fn call (
@@ -2019,6 +2020,9 @@ fn call_ref_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2019
2020
if module. config . disallow_traps && funcref. nullable {
2020
2021
return false ;
2021
2022
}
2023
+ if builder. shared {
2024
+ return false ;
2025
+ }
2022
2026
match funcref. heap_type {
2023
2027
HeapType :: Concrete ( idx) => {
2024
2028
let ty = builder. allocs . operands . pop ( ) . unwrap ( ) ;
@@ -2072,6 +2076,9 @@ fn call_indirect_valid_impl(
2072
2076
// `call_indirect` instructions if we want to avoid traps.
2073
2077
return false ;
2074
2078
}
2079
+ if builder. shared {
2080
+ return false ;
2081
+ }
2075
2082
let can_call32 = builder. type_on_stack ( module, ValType :: I32 )
2076
2083
&& builder. allocs . table32_with_funcref . len ( ) > 0 ;
2077
2084
let can_call64 = builder. type_on_stack ( module, ValType :: I64 )
@@ -2130,6 +2137,9 @@ fn return_call_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2130
2137
if !module. config . tail_call_enabled {
2131
2138
return false ;
2132
2139
}
2140
+ if builder. shared {
2141
+ return false ;
2142
+ }
2133
2143
2134
2144
builder. allocs . functions . keys ( ) . any ( |func_ty| {
2135
2145
builder. types_on_stack ( module, & func_ty. params )
@@ -2167,6 +2177,9 @@ fn return_call_ref_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2167
2177
if !module. config . gc_enabled {
2168
2178
return false ;
2169
2179
}
2180
+ if builder. shared {
2181
+ return false ;
2182
+ }
2170
2183
2171
2184
let ref_ty = match builder. concrete_funcref_on_stack ( module) {
2172
2185
None => return false ,
@@ -2255,6 +2268,7 @@ fn throw_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2255
2268
. tags
2256
2269
. keys ( )
2257
2270
. any ( |k| builder. types_on_stack ( module, k) )
2271
+ && !builder. shared
2258
2272
}
2259
2273
2260
2274
fn throw (
@@ -2282,7 +2296,9 @@ fn throw(
2282
2296
2283
2297
#[ inline]
2284
2298
fn throw_ref_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
2285
- module. config . exceptions_enabled && builder. types_on_stack ( module, & [ ValType :: EXNREF ] )
2299
+ module. config . exceptions_enabled
2300
+ && builder. types_on_stack ( module, & [ ValType :: EXNREF ] )
2301
+ && !builder. shared
2286
2302
}
2287
2303
2288
2304
fn throw_ref (
@@ -2765,8 +2781,8 @@ fn local_tee(
2765
2781
}
2766
2782
2767
2783
#[ inline]
2768
- fn global_get_valid ( module : & Module , _ : & mut CodeBuilder ) -> bool {
2769
- module. globals . len ( ) > 0
2784
+ fn global_get_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
2785
+ module. globals . len ( ) > 0 && !builder . shared
2770
2786
}
2771
2787
2772
2788
fn global_get (
@@ -2792,6 +2808,7 @@ fn global_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
2792
2808
. mutable_globals
2793
2809
. iter ( )
2794
2810
. any ( |( ty, _) | builder. type_on_stack ( module, * ty) )
2811
+ && !builder. shared
2795
2812
}
2796
2813
2797
2814
fn global_set (
@@ -5589,7 +5606,7 @@ fn table_fill_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5589
5606
module. config . reference_types_enabled
5590
5607
&& module. config . bulk_memory_enabled
5591
5608
&& !module. config . disallow_traps // Non-trapping table fill generation not yet implemented
5592
- && table_fill_candidates ( module, builder) . next ( ) . is_some ( )
5609
+ && table_fill_candidates ( module, builder) . next ( ) . is_some ( ) && !builder . shared
5593
5610
}
5594
5611
5595
5612
fn table_fill_candidates < ' a > (
@@ -5629,7 +5646,7 @@ fn table_fill(
5629
5646
fn table_set_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
5630
5647
module. config . reference_types_enabled
5631
5648
&& !module. config . disallow_traps // Non-trapping table.set generation not yet implemented
5632
- && table_set_candidates ( module, builder) . next ( ) . is_some ( )
5649
+ && table_set_candidates ( module, builder) . next ( ) . is_some ( ) && !builder . shared
5633
5650
}
5634
5651
5635
5652
fn table_set_candidates < ' a > (
@@ -5668,6 +5685,9 @@ fn table_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5668
5685
if module. config . disallow_traps {
5669
5686
return false ;
5670
5687
}
5688
+ if builder. shared {
5689
+ return false ;
5690
+ }
5671
5691
if builder. type_on_stack ( module, ValType :: I32 ) && builder. allocs . table32 . len ( ) > 0 {
5672
5692
return true ;
5673
5693
}
@@ -5698,8 +5718,8 @@ fn table_get(
5698
5718
}
5699
5719
5700
5720
#[ inline]
5701
- fn table_size_valid ( module : & Module , _ : & mut CodeBuilder ) -> bool {
5702
- module. config . reference_types_enabled && module. tables . len ( ) > 0
5721
+ fn table_size_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
5722
+ module. config . reference_types_enabled && module. tables . len ( ) > 0 && !builder . shared
5703
5723
}
5704
5724
5705
5725
fn table_size (
@@ -5717,7 +5737,9 @@ fn table_size(
5717
5737
5718
5738
#[ inline]
5719
5739
fn table_grow_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
5720
- module. config . reference_types_enabled && table_grow_candidates ( module, builder) . next ( ) . is_some ( )
5740
+ module. config . reference_types_enabled
5741
+ && table_grow_candidates ( module, builder) . next ( ) . is_some ( )
5742
+ && !builder. shared
5721
5743
}
5722
5744
5723
5745
fn table_grow_candidates < ' a > (
@@ -5757,6 +5779,9 @@ fn table_copy_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5757
5779
if module. config . disallow_traps {
5758
5780
return false ;
5759
5781
}
5782
+ if builder. shared {
5783
+ return false ;
5784
+ }
5760
5785
if builder. types_on_stack ( module, & [ ValType :: I64 , ValType :: I64 , ValType :: I64 ] ) {
5761
5786
return builder. allocs . table_copy_64_to_64 . len ( ) > 0 ;
5762
5787
}
@@ -5802,6 +5827,9 @@ fn table_init_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5802
5827
if module. config . disallow_traps {
5803
5828
return false ;
5804
5829
}
5830
+ if builder. shared {
5831
+ return false ;
5832
+ }
5805
5833
if builder. allocs . table32_init . len ( ) > 0
5806
5834
&& builder. types_on_stack ( module, & [ ValType :: I32 , ValType :: I32 , ValType :: I32 ] )
5807
5835
{
@@ -5858,6 +5886,7 @@ fn struct_new_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5858
5886
. iter ( )
5859
5887
. copied ( )
5860
5888
. any ( |i| builder. field_types_on_stack ( module, & module. ty ( i) . unwrap_struct ( ) . fields ) )
5889
+ && !builder. shared
5861
5890
}
5862
5891
5863
5892
fn struct_new (
@@ -5894,7 +5923,7 @@ fn struct_new(
5894
5923
}
5895
5924
5896
5925
#[ inline]
5897
- fn struct_new_default_valid ( module : & Module , _builder : & mut CodeBuilder ) -> bool {
5926
+ fn struct_new_default_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
5898
5927
module. config . gc_enabled
5899
5928
&& module. struct_types . iter ( ) . copied ( ) . any ( |i| {
5900
5929
module
@@ -5904,6 +5933,7 @@ fn struct_new_default_valid(module: &Module, _builder: &mut CodeBuilder) -> bool
5904
5933
. iter ( )
5905
5934
. all ( |f| f. element_type . is_defaultable ( ) )
5906
5935
} )
5936
+ && !builder. shared
5907
5937
}
5908
5938
5909
5939
fn struct_new_default (
@@ -5955,6 +5985,7 @@ fn struct_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5955
5985
module. config . gc_enabled
5956
5986
&& !module. config . disallow_traps
5957
5987
&& builder. non_empty_struct_ref_on_stack ( module, !module. config . disallow_traps )
5988
+ && !builder. shared
5958
5989
}
5959
5990
5960
5991
fn struct_get (
@@ -5995,6 +6026,9 @@ fn struct_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
5995
6026
if !module. config . gc_enabled {
5996
6027
return false ;
5997
6028
}
6029
+ if builder. shared {
6030
+ return false ;
6031
+ }
5998
6032
match builder. concrete_struct_ref_type_on_stack_at ( module, 1 ) {
5999
6033
None => return false ,
6000
6034
Some ( ( true , _, _) ) if module. config . disallow_traps => return false ,
@@ -6051,6 +6085,7 @@ fn array_new_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6051
6085
. array_types
6052
6086
. iter ( )
6053
6087
. any ( |i| builder. field_type_on_stack_at ( module, 1 , module. ty ( * i) . unwrap_array ( ) . 0 ) )
6088
+ && !builder. shared
6054
6089
}
6055
6090
6056
6091
fn array_new (
@@ -6092,6 +6127,7 @@ fn array_new_fixed_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6092
6127
. array_types
6093
6128
. iter ( )
6094
6129
. any ( |i| builder. field_type_on_stack ( module, module. ty ( * i) . unwrap_array ( ) . 0 ) )
6130
+ && !builder. shared
6095
6131
}
6096
6132
6097
6133
fn array_new_fixed (
@@ -6151,6 +6187,7 @@ fn array_new_default_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6151
6187
. array_types
6152
6188
. iter ( )
6153
6189
. any ( |i| module. ty ( * i) . unwrap_array ( ) . 0 . element_type . is_defaultable ( ) )
6190
+ && !builder. shared
6154
6191
}
6155
6192
6156
6193
fn array_new_default (
@@ -6200,7 +6237,7 @@ fn array_new_data_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6200
6237
&& module. array_types . iter ( ) . any ( |i| {
6201
6238
let ty = module. ty ( * i) . unwrap_array ( ) . 0 . element_type . unpack ( ) ;
6202
6239
ty. is_numeric ( ) | ty. is_vector ( )
6203
- } )
6240
+ } ) && !builder . shared
6204
6241
}
6205
6242
6206
6243
fn array_new_data (
@@ -6264,6 +6301,7 @@ fn array_new_elem_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6264
6301
. array_types
6265
6302
. iter ( )
6266
6303
. any ( |i| module_has_elem_segment_of_array_type ( module, module. ty ( * i) . unwrap_array ( ) ) )
6304
+ && !builder. shared
6267
6305
}
6268
6306
6269
6307
fn array_new_elem (
@@ -6329,6 +6367,7 @@ fn array_get_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6329
6367
&& !module. config . disallow_traps // TODO: add support for disallowing traps
6330
6368
&& builder. type_on_stack ( module, ValType :: I32 )
6331
6369
&& builder. concrete_array_ref_type_on_stack_at ( module, 1 ) . is_some ( )
6370
+ && !builder. shared
6332
6371
}
6333
6372
6334
6373
fn array_get (
@@ -6363,6 +6402,9 @@ fn array_set_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6363
6402
{
6364
6403
return false ;
6365
6404
}
6405
+ if builder. shared {
6406
+ return false ;
6407
+ }
6366
6408
match builder. concrete_array_ref_type_on_stack_at ( module, 2 ) {
6367
6409
None => false ,
6368
6410
Some ( ( _nullable, _idx, array_ty) ) => {
@@ -6386,7 +6428,9 @@ fn array_set(
6386
6428
6387
6429
#[ inline]
6388
6430
fn array_len_valid ( module : & Module , builder : & mut CodeBuilder ) -> bool {
6389
- module. config . gc_enabled && builder. type_on_stack ( module, ValType :: Ref ( RefType :: ARRAYREF ) )
6431
+ module. config . gc_enabled
6432
+ && builder. type_on_stack ( module, ValType :: Ref ( RefType :: ARRAYREF ) )
6433
+ && !builder. shared
6390
6434
}
6391
6435
6392
6436
fn array_len (
@@ -6411,6 +6455,9 @@ fn array_fill_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6411
6455
{
6412
6456
return false ;
6413
6457
}
6458
+ if builder. shared {
6459
+ return false ;
6460
+ }
6414
6461
match builder. concrete_array_ref_type_on_stack_at ( module, 3 ) {
6415
6462
None => return false ,
6416
6463
Some ( ( _, _, array_ty) ) => {
@@ -6444,6 +6491,9 @@ fn array_copy_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6444
6491
{
6445
6492
return false ;
6446
6493
}
6494
+ if builder. shared {
6495
+ return false ;
6496
+ }
6447
6497
let x = match builder. concrete_array_ref_type_on_stack_at ( module, 4 ) {
6448
6498
None => return false ,
6449
6499
Some ( ( _, _, x) ) => x,
@@ -6493,6 +6543,9 @@ fn array_init_data_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6493
6543
{
6494
6544
return false ;
6495
6545
}
6546
+ if builder. shared {
6547
+ return false ;
6548
+ }
6496
6549
match builder. concrete_array_ref_type_on_stack_at ( module, 3 ) {
6497
6550
None => return false ,
6498
6551
Some ( ( _, _, ty) ) => {
@@ -6533,6 +6586,9 @@ fn array_init_elem_valid(module: &Module, builder: &mut CodeBuilder) -> bool {
6533
6586
{
6534
6587
return false ;
6535
6588
}
6589
+ if builder. shared {
6590
+ return false ;
6591
+ }
6536
6592
match builder. concrete_array_ref_type_on_stack_at ( module, 3 ) {
6537
6593
None => return false ,
6538
6594
Some ( ( _, _, array_ty) ) => {
0 commit comments