diff --git a/crates/it-lilo/src/lowerer/error.rs b/crates/it-lilo/src/lowerer/error.rs index 6d1d501..f57437c 100644 --- a/crates/it-lilo/src/lowerer/error.rs +++ b/crates/it-lilo/src/lowerer/error.rs @@ -20,6 +20,9 @@ use thiserror::Error as ThisError; #[derive(Debug, ThisError)] pub enum LoError { + #[error("Allocator of Wasm module returns 0 which means that it's out of memory")] + AllocateWasInvalid, + #[error("{0}")] AllocatableError(#[from] AllocatableError), diff --git a/crates/it-lilo/src/lowerer/memory_writer.rs b/crates/it-lilo/src/lowerer/memory_writer.rs index cfad04e..c5c2e7d 100644 --- a/crates/it-lilo/src/lowerer/memory_writer.rs +++ b/crates/it-lilo/src/lowerer/memory_writer.rs @@ -21,6 +21,7 @@ use crate::traits::DEFAULT_MEMORY_INDEX; use crate::utils::type_tag_form_itype; use std::cell::Cell; +use crate::lowerer::LoError; pub struct MemoryWriter<'i, R: Allocatable> { heap_manager: &'i R, @@ -54,6 +55,10 @@ impl<'i, A: Allocatable> MemoryWriter<'i, A> { pub fn sequential_writer(&self, size: u32, type_tag: u32) -> LoResult { let offset = self.heap_manager.allocate(size, type_tag)?; + if offset == 0 { + return Err(LoError::AllocateWasInvalid); + } + let new_mem_slice = self.heap_manager.memory_slice(DEFAULT_MEMORY_INDEX)?; self.memory.set(new_mem_slice);