From 6f00d9563f43e898e7adf20d076fefac26ef010c Mon Sep 17 00:00:00 2001 From: Nick Fitzgerald Date: Tue, 12 Feb 2019 12:56:40 -0800 Subject: [PATCH] interpreter: handle closure descriptors with less than two parameters This might happen because of LTO. Fixes #1244 --- crates/wasm-interpreter/src/lib.rs | 15 +++++++++++++-- 1 file changed, 13 insertions(+), 2 deletions(-) diff --git a/crates/wasm-interpreter/src/lib.rs b/crates/wasm-interpreter/src/lib.rs index b96151a0..55a2165c 100644 --- a/crates/wasm-interpreter/src/lib.rs +++ b/crates/wasm-interpreter/src/lib.rs @@ -180,8 +180,19 @@ impl Interpreter { assert!(self.descriptor_table_idx.is_none()); let func = module.funcs.get(id); - assert_eq!(module.types.get(func.ty()).params().len(), 2); - self.call(id, module, &[0, 0]); + let params = module.types.get(func.ty()).params(); + assert!( + params.iter().all(|p| *p == walrus::ValType::I32), + "closure descriptors should only have i32 params" + ); + let num_params = params.len(); + assert!( + num_params <= 2, + "closure descriptors have 2 parameters, but might lose some parameters due to LTO" + ); + + let args = vec![0; num_params]; + self.call(id, module, &args); let descriptor_table_idx = self.descriptor_table_idx .take()