use crate::info::ModuleContext;
use wasm_encoder::SectionId;
use wasm_encoder::reencode::{Reencode, RoundtripReencoder};
pub(crate) fn instrument(module: &mut ModuleContext<'_>) -> Vec<u8> {
log::debug!("Instrumenting the input Wasm");
let mut encoder = wasm_encoder::Module::new();
let mut defined_global_exports = Vec::new();
let mut defined_memory_exports = Vec::new();
for section in module.raw_sections() {
match section.id {
id if id == u8::from(SectionId::Export) => {
let mut exports = wasm_encoder::ExportSection::new();
for export in module.exports() {
RoundtripReencoder
.parse_export(&mut exports, *export)
.unwrap();
}
for (i, ty, _) in module.defined_globals() {
if !ty.mutable {
continue;
}
let name = format!("__wizer_global_{i}");
exports.export(&name, wasm_encoder::ExportKind::Global, i);
defined_global_exports.push((i, name));
}
for (i, (j, _)) in module.defined_memories().enumerate() {
let name = format!("__wizer_memory_{i}");
exports.export(&name, wasm_encoder::ExportKind::Memory, j);
defined_memory_exports.push(name);
}
encoder.section(&exports);
}
_other => {
encoder.section(section);
}
}
}
module.defined_global_exports = Some(defined_global_exports);
module.defined_memory_exports = Some(defined_memory_exports);
encoder.finish()
}