From 59be6dc5ff258ca9df174cfd9a91cc4149dc8a40 Mon Sep 17 00:00:00 2001 From: Alex Crichton Date: Wed, 11 Nov 2020 11:59:40 -0600 Subject: [PATCH] Fix module initialization with externref element segments (#2392) This commit fixes an issue with reference-types-using-modules where they panicked on instantiation if any element segments had an externref null specified. --- crates/runtime/src/instance.rs | 22 +++++++++++-------- .../reference-types/externref-segment.wast | 5 +++++ 2 files changed, 18 insertions(+), 9 deletions(-) create mode 100644 tests/misc_testsuite/reference-types/externref-segment.wast diff --git a/crates/runtime/src/instance.rs b/crates/runtime/src/instance.rs index 87e7c326fe..a95a4b594b 100644 --- a/crates/runtime/src/instance.rs +++ b/crates/runtime/src/instance.rs @@ -1270,15 +1270,19 @@ fn initialize_tables(instance: &Instance) -> Result<(), InstantiationError> { } for (i, func_idx) in init.elements.iter().enumerate() { - let anyfunc = instance.get_caller_checked_anyfunc(*func_idx).map_or( - ptr::null_mut(), - |f: &VMCallerCheckedAnyfunc| { - f as *const VMCallerCheckedAnyfunc as *mut VMCallerCheckedAnyfunc - }, - ); - table - .set(u32::try_from(start + i).unwrap(), anyfunc.into()) - .unwrap(); + let item = match table.element_type() { + TableElementType::Func => instance + .get_caller_checked_anyfunc(*func_idx) + .map_or(ptr::null_mut(), |f: &VMCallerCheckedAnyfunc| { + f as *const VMCallerCheckedAnyfunc as *mut VMCallerCheckedAnyfunc + }) + .into(), + TableElementType::Val(_) => { + assert!(*func_idx == FuncIndex::reserved_value()); + TableElement::ExternRef(None) + } + }; + table.set(u32::try_from(start + i).unwrap(), item).unwrap(); } } diff --git a/tests/misc_testsuite/reference-types/externref-segment.wast b/tests/misc_testsuite/reference-types/externref-segment.wast new file mode 100644 index 0000000000..9da6ff6674 --- /dev/null +++ b/tests/misc_testsuite/reference-types/externref-segment.wast @@ -0,0 +1,5 @@ +(module + (table 2 externref) + (elem (i32.const 0) externref (ref.null extern)) + (elem (i32.const 1) externref (ref.null extern)) +)