@@ -1024,7 +1024,7 @@ impl<'store> Executor<'store> {
10241024 let type_addr = self . module . resolve_type_addr ( type_index) ;
10251025 let field_count =
10261026 self . store . state . get_type ( type_addr) . as_struct ( ) . expect ( "validated struct.new type" ) . fields . len ( ) ;
1027- self . store . state . check_gc_allocation ( type_addr , field_count ) ?;
1027+ self . store . state . gc . check_allocation ( field_count , self . store . state . gc_type_has_references ( type_addr ) ) ?;
10281028 let mut values = Vec :: new ( ) ;
10291029 cold_err ! ( values. try_reserve_exact( field_count) ) . map_err ( |_| Trap :: OutOfMemory ) ?;
10301030 if default {
@@ -1082,7 +1082,7 @@ impl<'store> Executor<'store> {
10821082 let type_addr = self . module . resolve_type_addr ( type_index) ;
10831083 let storage = self . store . state . get_type ( type_addr) . as_array ( ) . expect ( "validated array.new type" ) . field . storage ;
10841084 let len = u32:: stack_pop ( & mut self . store . value_stack ) as usize ;
1085- self . store . state . check_gc_allocation ( type_addr , len ) ?;
1085+ self . store . state . gc . check_allocation ( len , self . store . state . gc_type_has_references ( type_addr ) ) ?;
10861086 let value = if default { default_value ( storage) } else { pop_value ( & mut self . store . value_stack , storage) } ;
10871087 let mut values = Vec :: new ( ) ;
10881088 cold_err ! ( values. try_reserve_exact( len) ) . map_err ( |_| Trap :: OutOfMemory ) ?;
@@ -1098,7 +1098,7 @@ impl<'store> Executor<'store> {
10981098 let storage =
10991099 self . store . state . get_type ( type_addr) . as_array ( ) . expect ( "validated array.new_fixed type" ) . field . storage ;
11001100 let len = len as usize ;
1101- self . store . state . check_gc_allocation ( type_addr , len ) ?;
1101+ self . store . state . gc . check_allocation ( len , self . store . state . gc_type_has_references ( type_addr ) ) ?;
11021102 let mut values = Vec :: new ( ) ;
11031103 cold_err ! ( values. try_reserve_exact( len) ) . map_err ( |_| Trap :: OutOfMemory ) ?;
11041104 for _ in 0 ..len {
@@ -1199,7 +1199,7 @@ impl<'store> Executor<'store> {
11991199 let data_addr = self . module . resolve_data_addr ( data_index) ;
12001200 let data = self . store . state . data [ data_addr as usize ] . data . as_deref ( ) . unwrap_or ( & [ ] ) ;
12011201 data_range ( storage, data, src, len) ?;
1202- self . store . state . check_gc_allocation ( type_addr , len ) ?;
1202+ self . store . state . gc . check_allocation ( len , self . store . state . gc_type_has_references ( type_addr ) ) ?;
12031203 let values = decode_data ( storage, data, src, len) ?;
12041204 self . push_gc_object ( type_addr, values)
12051205 }
@@ -1213,7 +1213,7 @@ impl<'store> Executor<'store> {
12131213 let type_addr = self . module . resolve_type_addr ( type_index) ;
12141214 let elem_addr = self . module . resolve_elem_addr ( elem_index) ;
12151215 let items = self . store . state . elements [ elem_addr as usize ] . items_range ( src, len) ?;
1216- self . store . state . check_gc_allocation ( type_addr , len ) ?;
1216+ self . store . state . gc . check_allocation ( len , self . store . state . gc_type_has_references ( type_addr ) ) ?;
12171217 let mut values = Vec :: new ( ) ;
12181218 cold_err ! ( values. try_reserve_exact( len) ) . map_err ( |_| Trap :: OutOfMemory ) ?;
12191219 values. extend ( items. iter ( ) . copied ( ) . map ( RuntimeValue :: ValueRef ) ) ;
0 commit comments