@@ -1110,4 +1110,71 @@ mod tests {
11101110
11111111 Ok ( ( ) )
11121112 }
1113+
1114+ #[ test]
1115+ fn memory_grow ( ) -> Result < ( ) > {
1116+ const PAGE_SIZE : usize = wasmtime_environ:: Memory :: DEFAULT_PAGE_SIZE as usize ;
1117+
1118+ let mut store = Store :: < ( ) > :: default ( ) ;
1119+ let module = Module :: new (
1120+ store. engine ( ) ,
1121+ r#"
1122+ (module
1123+ (memory (export "m") 1 2)
1124+ )
1125+ "# ,
1126+ ) ?;
1127+ let instance = Instance :: new ( & mut store, & module, & [ ] ) ?;
1128+ let m = instance. get_memory ( & mut store, "m" ) . unwrap ( ) ;
1129+
1130+ assert_eq ! ( m. data( & store) [ 0 ] , 0 ) ;
1131+ m. data_mut ( & mut store) [ 0 ] = 42 ;
1132+ assert_eq ! ( m. data( & mut store) [ 0 ] , 42 ) ;
1133+
1134+ assert_eq ! ( m. grow( & mut store, 1 ) ?, 1 , "memory grows from 1 page to 2" ) ;
1135+ assert_eq ! ( m. size( & mut store) , 2 , "memory now 2 pages" ) ;
1136+ m. data_mut ( & mut store) [ PAGE_SIZE ] = 24 ;
1137+ assert_eq ! ( m. data( & mut store) [ PAGE_SIZE ] , 24 ) ;
1138+
1139+ Ok ( ( ) )
1140+ }
1141+
1142+ // Same test as memory_grow, except with pool settings that will activate
1143+ // the pagemap_scan instance reuse on Linux.
1144+ #[ test]
1145+ fn memory_grow_pagemap ( ) -> Result < ( ) > {
1146+ const PAGE_SIZE : usize = wasmtime_environ:: Memory :: DEFAULT_PAGE_SIZE as usize ;
1147+
1148+ let mut config = Config :: new ( ) ;
1149+ let mut pool = PoolingAllocationConfig :: new ( ) ;
1150+ pool. max_memory_size ( PAGE_SIZE * 2 ) ;
1151+ pool. linear_memory_keep_resident ( PAGE_SIZE * 2 ) ;
1152+ config. allocation_strategy ( pool) ;
1153+ config. memory_reservation ( ( PAGE_SIZE * 3 ) as u64 ) ;
1154+
1155+ let engine = Engine :: new ( & config) ?;
1156+ let mut store = Store :: < ( ) > :: new ( & engine, ( ) ) ;
1157+ let module = Module :: new (
1158+ & engine,
1159+ r#"
1160+ (module
1161+ (memory (export "m") 1 2)
1162+ )
1163+ "# ,
1164+ ) ?;
1165+ let instance = Instance :: new ( & mut store, & module, & [ ] ) ?;
1166+ let m = instance. get_memory ( & mut store, "m" ) . unwrap ( ) ;
1167+
1168+ assert_eq ! ( m. data( & store) [ 0 ] , 0 ) ;
1169+ m. data_mut ( & mut store) [ 0 ] = 42 ;
1170+ assert_eq ! ( m. data( & mut store) [ 0 ] , 42 ) ;
1171+
1172+ assert_eq ! ( m. grow( & mut store, 1 ) ?, 1 , "memory grows from 1 page to 2" ) ;
1173+ assert_eq ! ( m. size( & mut store) , 2 , "memory now 2 pages" ) ;
1174+ assert_eq ! ( m. data( & mut store) [ PAGE_SIZE ] , 0 , "grown memory is zeroed" ) ;
1175+ m. data_mut ( & mut store) [ PAGE_SIZE ] = 24 ;
1176+ assert_eq ! ( m. data( & mut store) [ PAGE_SIZE ] , 24 , "grown memory is mutated" ) ;
1177+
1178+ Ok ( ( ) )
1179+ }
11131180}
0 commit comments