diff --git a/crates/runtime/src/table.rs b/crates/runtime/src/table.rs index 63b4e440d7c..65ad0b1ace9 100644 --- a/crates/runtime/src/table.rs +++ b/crates/runtime/src/table.rs @@ -280,7 +280,9 @@ impl Table { }; for (item, slot) in items.zip(elements) { - *slot = item as usize; + unsafe { + *slot = TableElement::FuncRef(item).into_table_value(); + } } Ok(()) } diff --git a/tests/all/table.rs b/tests/all/table.rs index 2dc29516838..8bc62f4f1a1 100644 --- a/tests/all/table.rs +++ b/tests/all/table.rs @@ -1,3 +1,4 @@ +use anyhow::Result; use wasmtime::*; #[test] @@ -50,3 +51,27 @@ fn copy_wrong() { "tables do not have the same element type" ); } + +#[test] +fn null_elem_segment_works_with_imported_table() -> Result<()> { + let mut store = Store::<()>::default(); + let ty = TableType::new(ValType::FuncRef, 1, None); + let table = Table::new(&mut store, ty, Val::FuncRef(None))?; + let module = Module::new( + store.engine(), + r#" +(module + (import "" "" (table (;0;) 1 funcref)) + (func + i32.const 0 + table.get 0 + drop + ) + (start 0) + (elem (;0;) (i32.const 0) funcref (ref.null func)) +) +"#, + )?; + Instance::new(&mut store, &module, &[table.into()])?; + Ok(()) +}