Skip to content

Commit 60cbc3d

Browse files
committed
add a test for pagemap_scan with memory.grow
1 parent 63123e2 commit 60cbc3d

File tree

1 file changed

+67
-0
lines changed

1 file changed

+67
-0
lines changed

crates/wasmtime/src/runtime/memory.rs

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)