(config: &mut Config)
| 453 | |
| 454 | #[wasmtime_test] |
| 455 | fn dynamic_extra_growth_unchanged_pointer(config: &mut Config) -> Result<()> { |
| 456 | const EXTRA_PAGES: u64 = 5; |
| 457 | config.memory_reservation(0); |
| 458 | // 5 wasm pages extra |
| 459 | config.memory_reservation_for_growth(EXTRA_PAGES * (1 << 16)); |
| 460 | let engine = Engine::new(&config)?; |
| 461 | let mut store = Store::new(&engine, ()); |
| 462 | |
| 463 | fn assert_behaves_well(store: &mut Store<()>, mem: &Memory) -> Result<()> { |
| 464 | let ptr = mem.data_ptr(&store); |
| 465 | |
| 466 | // Each growth here should retain the same linear pointer in memory and the |
| 467 | // memory shouldn't get moved. |
| 468 | for _ in 0..EXTRA_PAGES { |
| 469 | mem.grow(&mut *store, 1)?; |
| 470 | assert_eq!(ptr, mem.data_ptr(&store)); |
| 471 | } |
| 472 | |
| 473 | // Growth afterwards though will be forced to move the pointer |
| 474 | mem.grow(&mut *store, 1)?; |
| 475 | let new_ptr = mem.data_ptr(&store); |
| 476 | assert_ne!(ptr, new_ptr); |
| 477 | |
| 478 | for _ in 0..EXTRA_PAGES - 1 { |
| 479 | mem.grow(&mut *store, 1)?; |
| 480 | assert_eq!(new_ptr, mem.data_ptr(&store)); |
| 481 | } |
| 482 | Ok(()) |
| 483 | } |
| 484 | |
| 485 | let mem = Memory::new(&mut store, MemoryType::new(10, None))?; |
| 486 | assert_behaves_well(&mut store, &mem)?; |
| 487 | |
| 488 | let module = Module::new(&engine, r#"(module (memory (export "mem") 10))"#)?; |
| 489 | let instance = Instance::new(&mut store, &module, &[])?; |
| 490 | let mem = instance.get_memory(&mut store, "mem").unwrap(); |
| 491 | assert_behaves_well(&mut store, &mem)?; |
| 492 | |
| 493 | let module = Module::new( |
| 494 | &engine, |
| 495 | r#" |
| 496 | (module |
| 497 | (memory (export "mem") 10) |
| 498 | (data (i32.const 0) "")) |
| 499 | "#, |
| 500 | )?; |
| 501 | let instance = Instance::new(&mut store, &module, &[])?; |
| 502 | let mem = instance.get_memory(&mut store, "mem").unwrap(); |
| 503 | assert_behaves_well(&mut store, &mem)?; |
| 504 | |
| 505 | Ok(()) |
| 506 | } |
| 507 | |
| 508 | // This test exercises trying to create memories of the maximum 64-bit memory |
| 509 | // size of `1 << 48` pages. This should always fail but in the process of |
nothing calls this directly
no test coverage detected