Bump dependencies
wasm-smith: 0.11.0 -> 0.12.0 wasmparser: 0.86.0 -> 0.99.0 wast: 42.0.0 -> 52.0.2
This commit is contained in:
parent
2f8eadad6c
commit
7066e2ebd8
@ -4,7 +4,7 @@ version = "0.12.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmparser = "0.86.0"
|
wasmparser = "0.99.0"
|
||||||
|
|
||||||
[dependencies.wasm-ast]
|
[dependencies.wasm-ast]
|
||||||
path = "../../wasm-ast"
|
path = "../../wasm-ast"
|
||||||
|
@ -9,7 +9,7 @@ use wasm_ast::{
|
|||||||
node::{FuncData, Statement},
|
node::{FuncData, Statement},
|
||||||
};
|
};
|
||||||
use wasmparser::{
|
use wasmparser::{
|
||||||
Data, DataKind, Element, ElementItem, ElementKind, Export, Import, InitExpr, Operator,
|
ConstExpr, Data, DataKind, Element, ElementItems, ElementKind, Export, Import, Operator,
|
||||||
OperatorsReader,
|
OperatorsReader,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ fn write_named_array(name: &str, len: usize, w: &mut dyn Write) -> Result<()> {
|
|||||||
writeln!(w, "local {name} = table_new({len}, 1)")
|
writeln!(w, "local {name} = table_new({len}, 1)")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_constant(init: &InitExpr, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
|
fn write_constant(init: &ConstExpr, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
|
||||||
let code = reader_to_code(init.get_operators_reader());
|
let code = reader_to_code(init.get_operators_reader());
|
||||||
let func = Factory::from_type_info(type_info).create_anonymous(&code);
|
let func = Factory::from_type_info(type_info).create_anonymous(&code);
|
||||||
|
|
||||||
@ -157,8 +157,8 @@ fn write_element_list(list: &[Element], type_info: &TypeInfo, w: &mut dyn Write)
|
|||||||
let (index, init) = match element.kind {
|
let (index, init) = match element.kind {
|
||||||
ElementKind::Active {
|
ElementKind::Active {
|
||||||
table_index,
|
table_index,
|
||||||
init_expr,
|
offset_expr,
|
||||||
} => (table_index, init_expr),
|
} => (table_index, offset_expr),
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -171,13 +171,20 @@ fn write_element_list(list: &[Element], type_info: &TypeInfo, w: &mut dyn Write)
|
|||||||
writeln!(w)?;
|
writeln!(w)?;
|
||||||
write!(w, "\t\tlocal data = {{ ")?;
|
write!(w, "\t\tlocal data = {{ ")?;
|
||||||
|
|
||||||
for item in element.items.get_items_reader().unwrap() {
|
match element.items.clone() {
|
||||||
match item.unwrap() {
|
ElementItems::Functions(functions) => {
|
||||||
ElementItem::Func(index) => write!(w, "FUNC_LIST[{index}],"),
|
for index in functions {
|
||||||
ElementItem::Expr(init) => write_constant(&init, type_info, w),
|
let index = index.unwrap();
|
||||||
}?;
|
write!(w, "FUNC_LIST[{index}],")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ElementItems::Expressions(expressions) => {
|
||||||
|
for init in expressions {
|
||||||
|
let init = init.unwrap();
|
||||||
|
write_constant(&init, type_info, w)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln!(w, " }}")?;
|
writeln!(w, " }}")?;
|
||||||
writeln!(w, "\t\ttable.move(data, 1, #data, offset, target)")?;
|
writeln!(w, "\t\ttable.move(data, 1, #data, offset, target)")?;
|
||||||
writeln!(w, "\tend")?;
|
writeln!(w, "\tend")?;
|
||||||
@ -192,8 +199,8 @@ fn write_data_list(list: &[Data], type_info: &TypeInfo, w: &mut dyn Write) -> Re
|
|||||||
DataKind::Passive => unimplemented!(),
|
DataKind::Passive => unimplemented!(),
|
||||||
DataKind::Active {
|
DataKind::Active {
|
||||||
memory_index,
|
memory_index,
|
||||||
init_expr,
|
offset_expr,
|
||||||
} => (memory_index, init_expr),
|
} => (memory_index, offset_expr),
|
||||||
};
|
};
|
||||||
|
|
||||||
write!(w, "\trt.store.string(MEMORY_LIST[{index}], ")?;
|
write!(w, "\trt.store.string(MEMORY_LIST[{index}], ")?;
|
||||||
|
@ -4,7 +4,7 @@ version = "0.12.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmparser = "0.86.0"
|
wasmparser = "0.99.0"
|
||||||
|
|
||||||
[dependencies.wasm-ast]
|
[dependencies.wasm-ast]
|
||||||
path = "../../wasm-ast"
|
path = "../../wasm-ast"
|
||||||
|
@ -9,7 +9,7 @@ use wasm_ast::{
|
|||||||
node::{FuncData, Statement},
|
node::{FuncData, Statement},
|
||||||
};
|
};
|
||||||
use wasmparser::{
|
use wasmparser::{
|
||||||
Data, DataKind, Element, ElementItem, ElementKind, Export, Import, InitExpr, Operator,
|
ConstExpr, Data, DataKind, Element, ElementItems, ElementKind, Export, Import, Operator,
|
||||||
OperatorsReader, ValType,
|
OperatorsReader, ValType,
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ fn write_named_array(name: &str, len: usize, w: &mut dyn Write) -> Result<()> {
|
|||||||
writeln!(w, "local {name} = table.create({len})")
|
writeln!(w, "local {name} = table.create({len})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_constant(init: &InitExpr, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
|
fn write_constant(init: &ConstExpr, type_info: &TypeInfo, w: &mut dyn Write) -> Result<()> {
|
||||||
let code = reader_to_code(init.get_operators_reader());
|
let code = reader_to_code(init.get_operators_reader());
|
||||||
let func = Factory::from_type_info(type_info).create_anonymous(&code);
|
let func = Factory::from_type_info(type_info).create_anonymous(&code);
|
||||||
|
|
||||||
@ -157,8 +157,8 @@ fn write_element_list(list: &[Element], type_info: &TypeInfo, w: &mut dyn Write)
|
|||||||
let (index, init) = match element.kind {
|
let (index, init) = match element.kind {
|
||||||
ElementKind::Active {
|
ElementKind::Active {
|
||||||
table_index,
|
table_index,
|
||||||
init_expr,
|
offset_expr,
|
||||||
} => (table_index, init_expr),
|
} => (table_index, offset_expr),
|
||||||
_ => unimplemented!(),
|
_ => unimplemented!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
@ -171,11 +171,19 @@ fn write_element_list(list: &[Element], type_info: &TypeInfo, w: &mut dyn Write)
|
|||||||
writeln!(w)?;
|
writeln!(w)?;
|
||||||
write!(w, "\t\tlocal data = {{ ")?;
|
write!(w, "\t\tlocal data = {{ ")?;
|
||||||
|
|
||||||
for item in element.items.get_items_reader().unwrap() {
|
match element.items.clone() {
|
||||||
match item.unwrap() {
|
ElementItems::Functions(functions) => {
|
||||||
ElementItem::Func(index) => write!(w, "FUNC_LIST[{index}],"),
|
for index in functions {
|
||||||
ElementItem::Expr(init) => write_constant(&init, type_info, w),
|
let index = index.unwrap();
|
||||||
}?;
|
write!(w, "FUNC_LIST[{index}],")?;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ElementItems::Expressions(expressions) => {
|
||||||
|
for init in expressions {
|
||||||
|
let init = init.unwrap();
|
||||||
|
write_constant(&init, type_info, w)?;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
writeln!(w, " }}")?;
|
writeln!(w, " }}")?;
|
||||||
@ -192,8 +200,8 @@ fn write_data_list(list: &[Data], type_info: &TypeInfo, w: &mut dyn Write) -> Re
|
|||||||
DataKind::Passive => unimplemented!(),
|
DataKind::Passive => unimplemented!(),
|
||||||
DataKind::Active {
|
DataKind::Active {
|
||||||
memory_index,
|
memory_index,
|
||||||
init_expr,
|
offset_expr,
|
||||||
} => (memory_index, init_expr),
|
} => (memory_index, offset_expr),
|
||||||
};
|
};
|
||||||
|
|
||||||
write!(w, "\trt.store.string(MEMORY_LIST[{index}], ")?;
|
write!(w, "\trt.store.string(MEMORY_LIST[{index}], ")?;
|
||||||
|
@ -9,14 +9,14 @@ cargo-fuzz = true
|
|||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
libfuzzer-sys = "0.4.0"
|
libfuzzer-sys = "0.4.0"
|
||||||
wasm-smith = "0.11.0"
|
wasm-smith = "0.12.0"
|
||||||
wasm-ast = { path = "../wasm-ast" }
|
wasm-ast = { path = "../wasm-ast" }
|
||||||
codegen-luajit = { path = "../codegen/luajit" }
|
codegen-luajit = { path = "../codegen/luajit" }
|
||||||
codegen-luau = { path = "../codegen/luau" }
|
codegen-luau = { path = "../codegen/luau" }
|
||||||
|
|
||||||
[dev-dependencies]
|
[dev-dependencies]
|
||||||
test-generator = "0.3.0"
|
test-generator = "0.3.0"
|
||||||
wast = "42.0.0"
|
wast = "52.0.2"
|
||||||
|
|
||||||
[[bin]]
|
[[bin]]
|
||||||
name = "luajit_translate"
|
name = "luajit_translate"
|
||||||
|
@ -5,8 +5,8 @@ use std::{
|
|||||||
|
|
||||||
use wasm_ast::module::{Module, TypeInfo};
|
use wasm_ast::module::{Module, TypeInfo};
|
||||||
use wast::{
|
use wast::{
|
||||||
core::{Expression, Instruction},
|
core::{WastArgCore, WastRetCore},
|
||||||
AssertExpression, WastExecute, WastInvoke, Wat,
|
WastArg, WastExecute, WastInvoke, WastRet, Wat,
|
||||||
};
|
};
|
||||||
|
|
||||||
use target::{get_name_from_id, Target};
|
use target::{get_name_from_id, Target};
|
||||||
@ -18,26 +18,22 @@ static ASSERTION: &str = include_str!("luajit_assert.lua");
|
|||||||
struct LuaJIT;
|
struct LuaJIT;
|
||||||
|
|
||||||
impl LuaJIT {
|
impl LuaJIT {
|
||||||
fn write_expression(data: &Expression, w: &mut dyn Write) -> Result<()> {
|
fn write_arg(data: &WastArg, w: &mut dyn Write) -> Result<()> {
|
||||||
let data = &data.instrs;
|
match data {
|
||||||
|
WastArg::Core(WastArgCore::I32(v)) => write!(w, "{v}"),
|
||||||
assert_eq!(data.len(), 1, "Only one instruction supported");
|
WastArg::Core(WastArgCore::I64(v)) => write!(w, "{v}LL"),
|
||||||
|
WastArg::Core(WastArgCore::F32(v)) => target::write_f32(f32::from_bits(v.bits), w),
|
||||||
match &data[0] {
|
WastArg::Core(WastArgCore::F64(v)) => target::write_f64(f64::from_bits(v.bits), w),
|
||||||
Instruction::I32Const(v) => write!(w, "{v}"),
|
_ => panic!("Unsupported expression"),
|
||||||
Instruction::I64Const(v) => write!(w, "{v}LL"),
|
|
||||||
Instruction::F32Const(v) => target::write_f32(f32::from_bits(v.bits), w),
|
|
||||||
Instruction::F64Const(v) => target::write_f64(f64::from_bits(v.bits), w),
|
|
||||||
_ => panic!("Unsupported instruction"),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_simple_expression(data: &AssertExpression, w: &mut dyn Write) -> Result<()> {
|
fn write_ret(data: &WastRet, w: &mut dyn Write) -> Result<()> {
|
||||||
match data {
|
match data {
|
||||||
AssertExpression::I32(v) => write!(w, "{v}"),
|
WastRet::Core(WastRetCore::I32(v)) => write!(w, "{v}"),
|
||||||
AssertExpression::I64(v) => write!(w, "{v}LL"),
|
WastRet::Core(WastRetCore::I64(v)) => write!(w, "{v}LL"),
|
||||||
AssertExpression::F32(v) => target::write_f32_nan(v, w),
|
WastRet::Core(WastRetCore::F32(v)) => target::write_f32_nan(v, w),
|
||||||
AssertExpression::F64(v) => target::write_f64_nan(v, w),
|
WastRet::Core(WastRetCore::F64(v)) => target::write_f64_nan(v, w),
|
||||||
_ => panic!("Unsupported expression"),
|
_ => panic!("Unsupported expression"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -51,7 +47,7 @@ impl LuaJIT {
|
|||||||
|
|
||||||
data.args.iter().try_for_each(|v| {
|
data.args.iter().try_for_each(|v| {
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
Self::write_expression(v, w)
|
Self::write_arg(v, w)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
@ -101,7 +97,7 @@ impl Target for LuaJIT {
|
|||||||
|
|
||||||
fn write_assert_return(
|
fn write_assert_return(
|
||||||
data: &mut WastExecute,
|
data: &mut WastExecute,
|
||||||
result: &[AssertExpression],
|
result: &[WastRet],
|
||||||
w: &mut dyn Write,
|
w: &mut dyn Write,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
match data {
|
match data {
|
||||||
@ -112,7 +108,7 @@ impl Target for LuaJIT {
|
|||||||
write!(w, "}}, {{")?;
|
write!(w, "}}, {{")?;
|
||||||
|
|
||||||
for v in result {
|
for v in result {
|
||||||
Self::write_simple_expression(v, w)?;
|
Self::write_ret(v, w)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -124,7 +120,7 @@ impl Target for LuaJIT {
|
|||||||
write!(w, "assert_eq(")?;
|
write!(w, "assert_eq(")?;
|
||||||
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
|
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
Self::write_simple_expression(&result[0], w)?;
|
Self::write_ret(&result[0], w)?;
|
||||||
writeln!(w, ")")
|
writeln!(w, ")")
|
||||||
}
|
}
|
||||||
WastExecute::Wat(_) => panic!("Wat not supported"),
|
WastExecute::Wat(_) => panic!("Wat not supported"),
|
||||||
|
@ -5,8 +5,8 @@ use std::{
|
|||||||
|
|
||||||
use wasm_ast::module::{Module, TypeInfo};
|
use wasm_ast::module::{Module, TypeInfo};
|
||||||
use wast::{
|
use wast::{
|
||||||
core::{Expression, Instruction},
|
core::{WastArgCore, WastRetCore},
|
||||||
AssertExpression, WastExecute, WastInvoke, Wat,
|
WastArg, WastExecute, WastInvoke, WastRet, Wat,
|
||||||
};
|
};
|
||||||
|
|
||||||
use target::{get_name_from_id, Target};
|
use target::{get_name_from_id, Target};
|
||||||
@ -31,26 +31,22 @@ impl Luau {
|
|||||||
write!(w, "rt.i64.from_u32({data_1}, {data_2})")
|
write!(w, "rt.i64.from_u32({data_1}, {data_2})")
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_expression(data: &Expression, w: &mut dyn Write) -> Result<()> {
|
fn write_arg(data: &WastArg, w: &mut dyn Write) -> Result<()> {
|
||||||
let data = &data.instrs;
|
match data {
|
||||||
|
WastArg::Core(WastArgCore::I32(v)) => Self::write_i32(*v, w),
|
||||||
assert_eq!(data.len(), 1, "Only one instruction supported");
|
WastArg::Core(WastArgCore::I64(v)) => Self::write_i64(*v, w),
|
||||||
|
WastArg::Core(WastArgCore::F32(v)) => target::write_f32(f32::from_bits(v.bits), w),
|
||||||
match &data[0] {
|
WastArg::Core(WastArgCore::F64(v)) => target::write_f64(f64::from_bits(v.bits), w),
|
||||||
Instruction::I32Const(v) => Self::write_i32(*v, w),
|
_ => panic!("Unsupported expression"),
|
||||||
Instruction::I64Const(v) => Self::write_i64(*v, w),
|
|
||||||
Instruction::F32Const(v) => target::write_f32(f32::from_bits(v.bits), w),
|
|
||||||
Instruction::F64Const(v) => target::write_f64(f64::from_bits(v.bits), w),
|
|
||||||
_ => panic!("Unsupported instruction"),
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fn write_simple_expression(data: &AssertExpression, w: &mut dyn Write) -> Result<()> {
|
fn write_ret(data: &WastRet, w: &mut dyn Write) -> Result<()> {
|
||||||
match data {
|
match data {
|
||||||
AssertExpression::I32(v) => Self::write_i32(*v, w),
|
WastRet::Core(WastRetCore::I32(v)) => Self::write_i32(*v, w),
|
||||||
AssertExpression::I64(v) => Self::write_i64(*v, w),
|
WastRet::Core(WastRetCore::I64(v)) => Self::write_i64(*v, w),
|
||||||
AssertExpression::F32(v) => target::write_f32_nan(v, w),
|
WastRet::Core(WastRetCore::F32(v)) => target::write_f32_nan(v, w),
|
||||||
AssertExpression::F64(v) => target::write_f64_nan(v, w),
|
WastRet::Core(WastRetCore::F64(v)) => target::write_f64_nan(v, w),
|
||||||
_ => panic!("Unsupported expression"),
|
_ => panic!("Unsupported expression"),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -64,7 +60,7 @@ impl Luau {
|
|||||||
|
|
||||||
data.args.iter().try_for_each(|v| {
|
data.args.iter().try_for_each(|v| {
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
Self::write_expression(v, w)
|
Self::write_arg(v, w)
|
||||||
})?;
|
})?;
|
||||||
|
|
||||||
write!(w, ")")
|
write!(w, ")")
|
||||||
@ -114,7 +110,7 @@ impl Target for Luau {
|
|||||||
|
|
||||||
fn write_assert_return(
|
fn write_assert_return(
|
||||||
data: &mut WastExecute,
|
data: &mut WastExecute,
|
||||||
result: &[AssertExpression],
|
result: &[WastRet],
|
||||||
w: &mut dyn Write,
|
w: &mut dyn Write,
|
||||||
) -> Result<()> {
|
) -> Result<()> {
|
||||||
match data {
|
match data {
|
||||||
@ -125,7 +121,7 @@ impl Target for Luau {
|
|||||||
write!(w, "}}, {{")?;
|
write!(w, "}}, {{")?;
|
||||||
|
|
||||||
for v in result {
|
for v in result {
|
||||||
Self::write_simple_expression(v, w)?;
|
Self::write_ret(v, w)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +133,7 @@ impl Target for Luau {
|
|||||||
write!(w, "assert_eq(")?;
|
write!(w, "assert_eq(")?;
|
||||||
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
|
write!(w, r#"loaded["{name}"].global_list["{global}"].value"#)?;
|
||||||
write!(w, ", ")?;
|
write!(w, ", ")?;
|
||||||
Self::write_simple_expression(&result[0], w)?;
|
Self::write_ret(&result[0], w)?;
|
||||||
writeln!(w, ")")
|
writeln!(w, ")")
|
||||||
}
|
}
|
||||||
WastExecute::Wat(_) => panic!("Wat not supported"),
|
WastExecute::Wat(_) => panic!("Wat not supported"),
|
||||||
|
@ -7,8 +7,8 @@ use std::{
|
|||||||
|
|
||||||
use wasm_ast::module::Module as AstModule;
|
use wasm_ast::module::Module as AstModule;
|
||||||
use wast::{
|
use wast::{
|
||||||
core::Module as WaModule, parser::ParseBuffer, token::Id, AssertExpression, QuoteWat, Wast,
|
core::Module as WaModule, parser::ParseBuffer, token::Id, QuoteWat, Wast, WastDirective,
|
||||||
WastDirective, WastExecute, WastInvoke, Wat,
|
WastExecute, WastInvoke, WastRet, Wat,
|
||||||
};
|
};
|
||||||
|
|
||||||
macro_rules! impl_write_number_nan {
|
macro_rules! impl_write_number_nan {
|
||||||
@ -23,8 +23,8 @@ macro_rules! impl_write_number_nan {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn $name_nan(data: &wast::NanPattern<$pattern>, w: &mut dyn Write) -> Result<()> {
|
pub fn $name_nan(data: &wast::core::NanPattern<$pattern>, w: &mut dyn Write) -> Result<()> {
|
||||||
use wast::NanPattern;
|
use wast::core::NanPattern;
|
||||||
|
|
||||||
match data {
|
match data {
|
||||||
NanPattern::CanonicalNan => write!(w, "LUA_NAN_CANONICAL"),
|
NanPattern::CanonicalNan => write!(w, "LUA_NAN_CANONICAL"),
|
||||||
@ -65,7 +65,7 @@ pub trait Target: Sized {
|
|||||||
|
|
||||||
fn write_assert_return(
|
fn write_assert_return(
|
||||||
data: &mut WastExecute,
|
data: &mut WastExecute,
|
||||||
result: &[AssertExpression],
|
result: &[WastRet],
|
||||||
w: &mut dyn Write,
|
w: &mut dyn Write,
|
||||||
) -> Result<()>;
|
) -> Result<()>;
|
||||||
|
|
||||||
|
@ -4,4 +4,4 @@ version = "0.12.0"
|
|||||||
edition = "2021"
|
edition = "2021"
|
||||||
|
|
||||||
[dependencies]
|
[dependencies]
|
||||||
wasmparser = "0.86.0"
|
wasmparser = "0.99.0"
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
use wasmparser::{BlockType, FunctionBody, MemoryImmediate, Operator, Result};
|
use wasmparser::{BlockType, FunctionBody, MemArg, Operator, Result};
|
||||||
|
|
||||||
use crate::{
|
use crate::{
|
||||||
module::{read_checked, TypeInfo},
|
module::{read_checked, TypeInfo},
|
||||||
@ -82,7 +82,7 @@ impl StatList {
|
|||||||
leak_on!(leak_global_write, Global);
|
leak_on!(leak_global_write, Global);
|
||||||
leak_on!(leak_memory_write, Memory);
|
leak_on!(leak_memory_write, Memory);
|
||||||
|
|
||||||
fn push_load(&mut self, load_type: LoadType, memarg: MemoryImmediate) {
|
fn push_load(&mut self, load_type: LoadType, memarg: MemArg) {
|
||||||
let memory = memarg.memory.try_into().unwrap();
|
let memory = memarg.memory.try_into().unwrap();
|
||||||
let offset = memarg.offset.try_into().unwrap();
|
let offset = memarg.offset.try_into().unwrap();
|
||||||
|
|
||||||
@ -96,7 +96,7 @@ impl StatList {
|
|||||||
self.stack.push_with_single(data);
|
self.stack.push_with_single(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
fn add_store(&mut self, store_type: StoreType, memarg: MemoryImmediate) {
|
fn add_store(&mut self, store_type: StoreType, memarg: MemArg) {
|
||||||
let memory = memarg.memory.try_into().unwrap();
|
let memory = memarg.memory.try_into().unwrap();
|
||||||
let offset = memarg.offset.try_into().unwrap();
|
let offset = memarg.offset.try_into().unwrap();
|
||||||
|
|
||||||
@ -429,16 +429,16 @@ impl<'a> Factory<'a> {
|
|||||||
self.target.set_terminator(Terminator::Unreachable);
|
self.target.set_terminator(Terminator::Unreachable);
|
||||||
}
|
}
|
||||||
Operator::Nop => {}
|
Operator::Nop => {}
|
||||||
Operator::Block { ty } => {
|
Operator::Block { blockty } => {
|
||||||
self.start_block(ty, BlockVariant::Forward);
|
self.start_block(blockty, BlockVariant::Forward);
|
||||||
}
|
}
|
||||||
Operator::Loop { ty } => {
|
Operator::Loop { blockty } => {
|
||||||
self.start_block(ty, BlockVariant::Backward);
|
self.start_block(blockty, BlockVariant::Backward);
|
||||||
}
|
}
|
||||||
Operator::If { ty } => {
|
Operator::If { blockty } => {
|
||||||
let cond = self.target.stack.pop();
|
let cond = self.target.stack.pop();
|
||||||
|
|
||||||
self.start_block(ty, BlockVariant::If);
|
self.start_block(blockty, BlockVariant::If);
|
||||||
self.pending.last_mut().unwrap().stack.push(cond);
|
self.pending.last_mut().unwrap().stack.push(cond);
|
||||||
}
|
}
|
||||||
Operator::Else => {
|
Operator::Else => {
|
||||||
@ -465,15 +465,15 @@ impl<'a> Factory<'a> {
|
|||||||
self.target.leak_all();
|
self.target.leak_all();
|
||||||
self.target.code.push(data);
|
self.target.code.push(data);
|
||||||
}
|
}
|
||||||
Operator::BrTable { ref table } => {
|
Operator::BrTable { ref targets } => {
|
||||||
let condition = self.target.stack.pop().into();
|
let condition = self.target.stack.pop().into();
|
||||||
let data = table
|
let data = targets
|
||||||
.targets()
|
.targets()
|
||||||
.map(Result::unwrap)
|
.map(Result::unwrap)
|
||||||
.map(|v| self.get_br_terminator(v.try_into().unwrap()))
|
.map(|v| self.get_br_terminator(v.try_into().unwrap()))
|
||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let default = self.get_br_terminator(table.default().try_into().unwrap());
|
let default = self.get_br_terminator(targets.default().try_into().unwrap());
|
||||||
|
|
||||||
let term = Terminator::BrTable(BrTable {
|
let term = Terminator::BrTable(BrTable {
|
||||||
condition,
|
condition,
|
||||||
@ -497,9 +497,11 @@ impl<'a> Factory<'a> {
|
|||||||
self.add_call(index);
|
self.add_call(index);
|
||||||
}
|
}
|
||||||
Operator::CallIndirect {
|
Operator::CallIndirect {
|
||||||
index, table_byte, ..
|
type_index,
|
||||||
|
table_byte,
|
||||||
|
..
|
||||||
} => {
|
} => {
|
||||||
let index = index.try_into().unwrap();
|
let index = type_index.try_into().unwrap();
|
||||||
|
|
||||||
self.add_call_indirect(index, table_byte.into());
|
self.add_call_indirect(index, table_byte.into());
|
||||||
}
|
}
|
||||||
|
@ -105,11 +105,10 @@ impl<'a> Module<'a> {
|
|||||||
self.start_section = Some(func);
|
self.start_section = Some(func);
|
||||||
}
|
}
|
||||||
Payload::CustomSection(v) if v.name() == "name" => {
|
Payload::CustomSection(v) if v.name() == "name" => {
|
||||||
for name in NameSectionReader::new(v.data(), v.data_offset())? {
|
for name in NameSectionReader::new(v.data(), v.data_offset()) {
|
||||||
if let Name::Function(map) = name? {
|
if let Name::Function(map) = name? {
|
||||||
let mut iter = map.get_map()?;
|
let mut iter = map.into_iter();
|
||||||
|
while let Some(Ok(elem)) = iter.next() {
|
||||||
while let Ok(elem) = iter.read() {
|
|
||||||
self.name_section.insert(elem.index, elem.name);
|
self.name_section.insert(elem.index, elem.name);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -250,7 +249,7 @@ impl<'a> TypeInfo<'a> {
|
|||||||
pub(crate) fn by_type_index(&self, index: usize) -> (usize, usize) {
|
pub(crate) fn by_type_index(&self, index: usize) -> (usize, usize) {
|
||||||
let Type::Func(ty) = &self.type_list[index];
|
let Type::Func(ty) = &self.type_list[index];
|
||||||
|
|
||||||
(ty.params.len(), ty.returns.len())
|
(ty.params().len(), ty.results().len())
|
||||||
}
|
}
|
||||||
|
|
||||||
pub(crate) fn by_func_index(&self, index: usize) -> (usize, usize) {
|
pub(crate) fn by_func_index(&self, index: usize) -> (usize, usize) {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user