Fix function typing regression

This commit is contained in:
Rerumu 2022-06-25 15:48:06 -04:00
parent fd1fb13f02
commit 8ec8b58a38
2 changed files with 16 additions and 12 deletions

View File

@ -9,8 +9,8 @@ use wasm_ast::{
node::{FuncData, Statement}, node::{FuncData, Statement},
}; };
use wasmparser::{ use wasmparser::{
Data, DataKind, Element, ElementItem, ElementKind, Export, FunctionBody, Import, InitExpr, Data, DataKind, Element, ElementItem, ElementKind, Export, Import, InitExpr, Operator,
Operator, OperatorsReader, OperatorsReader,
}; };
use crate::{ use crate::{
@ -202,12 +202,14 @@ fn write_data_list(list: &[Data], type_info: &TypeInfo, w: &mut dyn Write) -> Re
Ok(()) Ok(())
} }
fn build_func_list(list: &[FunctionBody], type_info: &TypeInfo) -> Vec<FuncData> { fn build_func_list(wasm: &Module, type_info: &TypeInfo) -> Vec<FuncData> {
let offset = wasm.import_count(External::Func);
let mut builder = Factory::from_type_info(type_info); let mut builder = Factory::from_type_info(type_info);
list.iter() wasm.code_section()
.iter()
.enumerate() .enumerate()
.map(|f| builder.create_indexed(f.0, f.1)) .map(|f| builder.create_indexed(f.0 + offset, f.1))
.collect() .collect()
} }
@ -310,7 +312,7 @@ pub fn from_inst_list(code: &[Operator], type_info: &TypeInfo, w: &mut dyn Write
/// # Errors /// # Errors
/// Returns `Err` if writing to `Write` failed. /// Returns `Err` if writing to `Write` failed.
pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
let func_list = build_func_list(wasm.code_section(), type_info); let func_list = build_func_list(wasm, type_info);
let mem_set = write_localize_used(&func_list, w)?; let mem_set = write_localize_used(&func_list, w)?;
write!(w, "local table_new = require(\"table.new\")")?; write!(w, "local table_new = require(\"table.new\")")?;

View File

@ -9,8 +9,8 @@ use wasm_ast::{
node::{FuncData, Statement}, node::{FuncData, Statement},
}; };
use wasmparser::{ use wasmparser::{
Data, DataKind, Element, ElementItem, ElementKind, Export, FunctionBody, Import, InitExpr, Data, DataKind, Element, ElementItem, ElementKind, Export, Import, InitExpr, Operator,
Operator, OperatorsReader, OperatorsReader,
}; };
use crate::{ use crate::{
@ -201,12 +201,14 @@ fn write_data_list(list: &[Data], type_info: &TypeInfo, w: &mut dyn Write) -> Re
Ok(()) Ok(())
} }
fn build_func_list(list: &[FunctionBody], type_info: &TypeInfo) -> Vec<FuncData> { fn build_func_list(wasm: &Module, type_info: &TypeInfo) -> Vec<FuncData> {
let offset = wasm.import_count(External::Func);
let mut builder = Factory::from_type_info(type_info); let mut builder = Factory::from_type_info(type_info);
list.iter() wasm.code_section()
.iter()
.enumerate() .enumerate()
.map(|f| builder.create_indexed(f.0, f.1)) .map(|f| builder.create_indexed(f.0 + offset, f.1))
.collect() .collect()
} }
@ -306,7 +308,7 @@ pub fn from_inst_list(code: &[Operator], type_info: &TypeInfo, w: &mut dyn Write
/// # Errors /// # Errors
/// Returns `Err` if writing to `Write` failed. /// Returns `Err` if writing to `Write` failed.
pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> { pub fn from_module_typed(wasm: &Module, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
let func_list = build_func_list(wasm.code_section(), type_info); let func_list = build_func_list(wasm, type_info);
let mem_set = write_localize_used(&func_list, w)?; let mem_set = write_localize_used(&func_list, w)?;
write_named_array("FUNC_LIST", wasm.function_space(), w)?; write_named_array("FUNC_LIST", wasm.function_space(), w)?;