From 2020e89db76efb7d2f0b9ac310eed9098155e620 Mon Sep 17 00:00:00 2001 From: Brian Carroll Date: Thu, 28 Oct 2021 22:43:39 +0100 Subject: [PATCH] Create reserve_padded_u32, nice for readability --- compiler/gen_wasm/src/backend.rs | 9 +++------ compiler/gen_wasm/src/serialize.rs | 11 +++++++++++ 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/compiler/gen_wasm/src/backend.rs b/compiler/gen_wasm/src/backend.rs index 1fe38811d7..ab185e7059 100644 --- a/compiler/gen_wasm/src/backend.rs +++ b/compiler/gen_wasm/src/backend.rs @@ -43,14 +43,11 @@ pub struct WasmBackend<'a> { impl<'a> WasmBackend<'a> { pub fn new(env: &'a Env<'a>, proc_symbols: Vec<'a, Symbol>) -> Self { - // Code section is prefixed with the number of Wasm functions - // For now, this is the same as the number of IR procedures (until we start inlining!) let mut code_section_bytes = std::vec::Vec::with_capacity(4096); - // Reserve space for code section header: inner byte length and number of functions - // Padded to the maximum 5 bytes each, so we can update later without moving everything - code_section_bytes.resize(10, 0); - code_section_bytes.overwrite_padded_u32(5, proc_symbols.len() as u32); // gets modified in unit tests + // Code section header + code_section_bytes.reserve_padded_u32(); // byte length, to be written at the end + code_section_bytes.encode_padded_u32(proc_symbols.len() as u32); // modified later in unit tests WasmBackend { env, diff --git a/compiler/gen_wasm/src/serialize.rs b/compiler/gen_wasm/src/serialize.rs index 075b72ff99..dc25e67177 100644 --- a/compiler/gen_wasm/src/serialize.rs +++ b/compiler/gen_wasm/src/serialize.rs @@ -79,6 +79,7 @@ pub trait SerialBuffer { encode_sleb128!(encode_i32, i32); encode_sleb128!(encode_i64, i64); + fn reserve_padded_u32(&mut self) -> usize; fn encode_padded_u32(&mut self, value: u32) -> usize; fn overwrite_padded_u32(&mut self, index: usize, value: u32); @@ -120,6 +121,11 @@ impl SerialBuffer for std::vec::Vec { fn size(&self) -> usize { self.len() } + fn reserve_padded_u32(&mut self) -> usize { + let index = self.len(); + self.resize(index + 5, 0xff); + index + } fn encode_padded_u32(&mut self, value: u32) -> usize { let index = self.len(); let new_len = index + 5; @@ -142,6 +148,11 @@ impl<'a> SerialBuffer for Vec<'a, u8> { fn size(&self) -> usize { self.len() } + fn reserve_padded_u32(&mut self) -> usize { + let index = self.len(); + self.resize(index + 5, 0xff); + index + } fn encode_padded_u32(&mut self, value: u32) -> usize { let index = self.len(); let new_len = index + 5;