Skip to content

Commit 42e4871

Browse files
Merge #806
806: Fix issue 653 (panic in MemoryDescriptor) + remove panic in UnsharedMemory r=syrusakbary a=pventuzelo #Description Based on comment from @syrusakbary [here](#654 (comment)) and previous pull request from @bjfish. * Reformat MemoryDescriptor (new structure field, function new, function memory_type) * Remove panic for MemoryDescriptor * Remove panic for UnsharedMemory # Review - [ ] Create a short description of the the change in the CHANGELOG.md file Co-authored-by: Patrick Ventuzelo <[email protected]> Co-authored-by: Patrick Ventuzelo <[email protected]>
2 parents 6792db9 + ac32184 commit 42e4871

File tree

7 files changed

+63
-61
lines changed

7 files changed

+63
-61
lines changed

lib/emscripten/src/lib.rs

+1-5
Original file line numberDiff line numberDiff line change
@@ -474,11 +474,7 @@ impl EmscriptenGlobals {
474474
let (memory_min, memory_max, shared) = get_emscripten_memory_size(&module)?;
475475

476476
// Memory initialization
477-
let memory_type = MemoryDescriptor {
478-
minimum: memory_min,
479-
maximum: memory_max,
480-
shared: shared,
481-
};
477+
let memory_type = MemoryDescriptor::new(memory_min, memory_max, shared)?;
482478
let memory = Memory::new(memory_type).unwrap();
483479

484480
let table_type = TableDescriptor {

lib/runtime-c-api/src/memory.rs

+11-6
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
//! Create, read, write, grow, destroy memory of an instance.
22
3-
use crate::{error::update_last_error, wasmer_limits_t, wasmer_result_t};
3+
use crate::{error::update_last_error, error::CApiError, wasmer_limits_t, wasmer_result_t};
44
use std::cell::Cell;
55
use wasmer_runtime::Memory;
66
use wasmer_runtime_core::{
@@ -31,12 +31,17 @@ pub unsafe extern "C" fn wasmer_memory_new(
3131
} else {
3232
None
3333
};
34-
let desc = MemoryDescriptor {
35-
minimum: Pages(limits.min),
36-
maximum: max,
37-
shared: false,
34+
let desc = MemoryDescriptor::new(Pages(limits.min), max, false);
35+
let new_desc = match desc {
36+
Ok(desc) => desc,
37+
Err(error) => {
38+
update_last_error(CApiError {
39+
msg: error.to_string(),
40+
});
41+
return wasmer_result_t::WASMER_ERROR;
42+
}
3843
};
39-
let result = Memory::new(desc);
44+
let result = Memory::new(new_desc);
4045
let new_memory = match result {
4146
Ok(memory) => memory,
4247
Err(error) => {

lib/runtime-core/src/memory/mod.rs

+15-23
Original file line numberDiff line numberDiff line change
@@ -50,16 +50,12 @@ impl Memory {
5050
/// # use wasmer_runtime_core::memory::Memory;
5151
/// # use wasmer_runtime_core::error::Result;
5252
/// # use wasmer_runtime_core::units::Pages;
53-
/// # fn create_memory() -> Result<()> {
54-
/// let descriptor = MemoryDescriptor {
55-
/// minimum: Pages(10),
56-
/// maximum: None,
57-
/// shared: false,
58-
/// };
53+
/// fn create_memory() -> Result<()> {
54+
/// let descriptor = MemoryDescriptor::new(Pages(10), None, false).unwrap();
5955
///
60-
/// let memory = Memory::new(descriptor)?;
61-
/// # Ok(())
62-
/// # }
56+
/// let memory = Memory::new(descriptor)?;
57+
/// Ok(())
58+
/// }
6359
/// ```
6460
pub fn new(desc: MemoryDescriptor) -> Result<Self, CreationError> {
6561
if let Some(max) = desc.maximum {
@@ -174,7 +170,7 @@ impl fmt::Debug for Memory {
174170
}
175171
}
176172

177-
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
173+
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq, Hash)]
178174
pub enum MemoryType {
179175
Dynamic,
180176
Static,
@@ -232,7 +228,11 @@ impl UnsharedMemory {
232228
MemoryType::Static => {
233229
UnsharedMemoryStorage::Static(StaticMemory::new(desc, &mut local)?)
234230
}
235-
MemoryType::SharedStatic => panic!("attempting to create shared unshared memory"),
231+
MemoryType::SharedStatic => {
232+
return Err(CreationError::InvalidDescriptor(
233+
"attempting to create shared unshared memory".to_string(),
234+
));
235+
}
236236
};
237237

238238
Ok(Self {
@@ -350,24 +350,16 @@ mod memory_tests {
350350

351351
#[test]
352352
fn test_initial_memory_size() {
353-
let unshared_memory = Memory::new(MemoryDescriptor {
354-
minimum: Pages(10),
355-
maximum: Some(Pages(20)),
356-
shared: false,
357-
})
358-
.unwrap();
353+
let memory_desc = MemoryDescriptor::new(Pages(10), Some(Pages(20)), false).unwrap();
354+
let unshared_memory = Memory::new(memory_desc).unwrap();
359355
assert_eq!(unshared_memory.size(), Pages(10));
360356
}
361357

362358
#[test]
363359
fn test_invalid_descriptor_returns_error() {
364-
let result = Memory::new(MemoryDescriptor {
365-
minimum: Pages(10),
366-
maximum: None,
367-
shared: true,
368-
});
360+
let memory_desc = MemoryDescriptor::new(Pages(10), None, true);
369361
assert!(
370-
result.is_err(),
362+
memory_desc.is_err(),
371363
"Max number of pages is required for shared memory"
372364
)
373365
}

lib/runtime-core/src/parse.rs

+13-10
Original file line numberDiff line numberDiff line change
@@ -136,11 +136,13 @@ pub fn read_module<
136136
.push((import_name, table_desc));
137137
}
138138
ImportSectionEntryType::Memory(memory_ty) => {
139-
let mem_desc = MemoryDescriptor {
140-
minimum: Pages(memory_ty.limits.initial),
141-
maximum: memory_ty.limits.maximum.map(|max| Pages(max)),
142-
shared: memory_ty.shared,
143-
};
139+
let mem_desc = MemoryDescriptor::new(
140+
Pages(memory_ty.limits.initial),
141+
memory_ty.limits.maximum.map(|max| Pages(max)),
142+
memory_ty.shared,
143+
)
144+
.map_err(|x| LoadError::Codegen(format!("{:?}", x)))?;
145+
144146
info.write()
145147
.unwrap()
146148
.imported_memories
@@ -172,11 +174,12 @@ pub fn read_module<
172174
info.write().unwrap().tables.push(table_desc);
173175
}
174176
ParserState::MemorySectionEntry(memory_ty) => {
175-
let mem_desc = MemoryDescriptor {
176-
minimum: Pages(memory_ty.limits.initial),
177-
maximum: memory_ty.limits.maximum.map(|max| Pages(max)),
178-
shared: memory_ty.shared,
179-
};
177+
let mem_desc = MemoryDescriptor::new(
178+
Pages(memory_ty.limits.initial),
179+
memory_ty.limits.maximum.map(|max| Pages(max)),
180+
memory_ty.shared,
181+
)
182+
.map_err(|x| LoadError::Codegen(format!("{:?}", x)))?;
180183

181184
info.write().unwrap().memories.push(mem_desc);
182185
}

lib/runtime-core/src/types.rs

+19-5
Original file line numberDiff line numberDiff line change
@@ -326,7 +326,7 @@ pub struct GlobalInit {
326326
pub init: Initializer,
327327
}
328328

329-
/// A wasm memory.
329+
/// A wasm memory descriptor.
330330
#[derive(Serialize, Deserialize, Debug, Clone, Copy, PartialEq, Eq)]
331331
pub struct MemoryDescriptor {
332332
/// The minimum number of allowed pages.
@@ -335,16 +335,30 @@ pub struct MemoryDescriptor {
335335
pub maximum: Option<Pages>,
336336
/// This memory can be shared between wasm threads.
337337
pub shared: bool,
338+
/// The type of the memory
339+
pub memory_type: MemoryType,
338340
}
339341

340342
impl MemoryDescriptor {
341-
pub fn memory_type(self) -> MemoryType {
342-
match (self.maximum.is_some(), self.shared) {
343+
pub fn new(minimum: Pages, maximum: Option<Pages>, shared: bool) -> Result<Self, String> {
344+
let memory_type = match (maximum.is_some(), shared) {
343345
(true, true) => MemoryType::SharedStatic,
344346
(true, false) => MemoryType::Static,
345347
(false, false) => MemoryType::Dynamic,
346-
(false, true) => panic!("shared memory without a max is not allowed"),
347-
}
348+
(false, true) => {
349+
return Err("Max number of pages is required for shared memory".to_string());
350+
}
351+
};
352+
Ok(MemoryDescriptor {
353+
minimum,
354+
maximum,
355+
shared,
356+
memory_type,
357+
})
358+
}
359+
360+
pub fn memory_type(&self) -> MemoryType {
361+
self.memory_type
348362
}
349363

350364
pub(crate) fn fits_in_imported(&self, imported: MemoryDescriptor) -> bool {

lib/spectests/examples/simple/main.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -42,12 +42,8 @@ fn main() -> error::Result<()> {
4242

4343
let inner_module = wasmer_runtime_core::compile_with(&wasm_binary, &get_compiler())?;
4444

45-
let memory = Memory::new(MemoryDescriptor {
46-
minimum: Pages(1),
47-
maximum: Some(Pages(1)),
48-
shared: false,
49-
})
50-
.unwrap();
45+
let memory_desc = MemoryDescriptor::new(Pages(1), Some(Pages(1)), false).unwrap();
46+
let memory = Memory::new(memory_desc).unwrap();
5147

5248
let global = Global::new(Value::I32(42));
5349

lib/spectests/tests/spectest.rs

+2-6
Original file line numberDiff line numberDiff line change
@@ -1021,12 +1021,8 @@ mod tests {
10211021
fn get_spectest_import_object(
10221022
registered_modules: &HashMap<String, Arc<Mutex<Instance>>>,
10231023
) -> ImportObject {
1024-
let memory = Memory::new(MemoryDescriptor {
1025-
minimum: Pages(1),
1026-
maximum: Some(Pages(2)),
1027-
shared: false,
1028-
})
1029-
.unwrap();
1024+
let memory_desc = MemoryDescriptor::new(Pages(1), Some(Pages(2)), false).unwrap();
1025+
let memory = Memory::new(memory_desc).unwrap();
10301026

10311027
let global_i32 = Global::new(wasmer_runtime_core::types::Value::I32(666));
10321028
let global_f32 = Global::new(wasmer_runtime_core::types::Value::F32(666.0));

0 commit comments

Comments
 (0)