@@ -3,7 +3,6 @@ use crate::module::{
33 FuncRefIndex , Initializer , MemoryInitialization , MemoryInitializer , Module , TableSegment ,
44 TableSegmentElements ,
55} ;
6- use crate :: prelude:: * ;
76use crate :: {
87 ConstExpr , ConstOp , DataIndex , DefinedFuncIndex , ElemIndex , EngineOrModuleTypeIndex ,
98 EntityIndex , EntityType , FuncIndex , FuncKey , GlobalIndex , IndexType , InitMemory , MemoryIndex ,
@@ -12,6 +11,7 @@ use crate::{
1211 Tunables , TypeConvert , TypeIndex , WasmError , WasmHeapTopType , WasmHeapType , WasmResult ,
1312 WasmValType , WasmparserTypeConverter ,
1413} ;
14+ use crate :: { NeedsGcRooting , prelude:: * } ;
1515use cranelift_entity:: SecondaryMap ;
1616use cranelift_entity:: packed_option:: ReservedValue ;
1717use std:: borrow:: Cow ;
@@ -531,7 +531,8 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
531531 }
532532 TableSegmentElements :: Functions ( elems. into ( ) )
533533 }
534- ElementItems :: Expressions ( _ty, items) => {
534+ ElementItems :: Expressions ( ty, items) => {
535+ let ty = self . convert_ref_type ( ty) ?;
535536 let mut exprs =
536537 Vec :: with_capacity ( usize:: try_from ( items. count ( ) ) . unwrap ( ) ) ;
537538 for expr in items {
@@ -541,7 +542,14 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
541542 self . flag_func_escaped ( func) ;
542543 }
543544 }
544- TableSegmentElements :: Expressions ( exprs. into ( ) )
545+ TableSegmentElements :: Expressions {
546+ needs_gc_rooting : if ty. is_vmgcref_type_and_not_i31 ( ) {
547+ NeedsGcRooting :: Yes
548+ } else {
549+ NeedsGcRooting :: No
550+ } ,
551+ exprs : exprs. into ( ) ,
552+ }
545553 }
546554 } ;
547555
@@ -565,12 +573,12 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
565573
566574 ElementKind :: Passive => {
567575 let elem_index = ElemIndex :: from_u32 ( index as u32 ) ;
568- let index = self . result . module . passive_elements . len ( ) ;
569- self . result . module . passive_elements . push ( elements) ?;
576+ let passive_index =
577+ self . result . module . passive_elements . push ( elements) ?;
570578 self . result
571579 . module
572580 . passive_elements_map
573- . insert ( elem_index, index ) ;
581+ . insert ( elem_index, passive_index ) ;
574582 }
575583
576584 ElementKind :: Declared => { }
@@ -1309,7 +1317,7 @@ impl ModuleTranslation<'_> {
13091317 // expressions are deferred to get evaluated at runtime.
13101318 let function_elements = match & segment. elements {
13111319 TableSegmentElements :: Functions ( indices) => indices,
1312- TableSegmentElements :: Expressions ( _ ) => break ,
1320+ TableSegmentElements :: Expressions { .. } => break ,
13131321 } ;
13141322
13151323 let precomputed =
0 commit comments