Update wasm-tools crates (#5945)
This notably updates `wasmparser` for updates to the relaxed-simd proposal and an implementation of the function-references proposal. Additionally there are some minor bug fixes being picked up for WIT and the component model.
This commit is contained in:
57
Cargo.lock
generated
57
Cargo.lock
generated
@@ -3285,7 +3285,7 @@ checksum = "158180f35c9ba89a3e7763f20be93e77d5e41535c18e22c85d6dd5b5bce18108"
|
|||||||
dependencies = [
|
dependencies = [
|
||||||
"wasm-coredump-encoder",
|
"wasm-coredump-encoder",
|
||||||
"wasm-coredump-types",
|
"wasm-coredump-types",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.23.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3314,30 +3314,39 @@ dependencies = [
|
|||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-mutate"
|
name = "wasm-encoder"
|
||||||
version = "0.2.18"
|
version = "0.25.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "87a229d5b8e4b2b78985dc905f0a033ba8a0bc948321622d41912238c6e0eab1"
|
checksum = "4eff853c4f09eec94d76af527eddad4e9de13b11d6286a1ef7134bc30135a2b7"
|
||||||
|
dependencies = [
|
||||||
|
"leb128",
|
||||||
|
]
|
||||||
|
|
||||||
|
[[package]]
|
||||||
|
name = "wasm-mutate"
|
||||||
|
version = "0.2.21"
|
||||||
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
|
checksum = "92ada47eda4f13d5dd83b77af7751dd44f1ab8120c01f2fca5b78b49080cf82c"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"egg",
|
"egg",
|
||||||
"log",
|
"log",
|
||||||
"rand 0.8.5",
|
"rand 0.8.5",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.25.0",
|
||||||
"wasmparser",
|
"wasmparser",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasm-smith"
|
name = "wasm-smith"
|
||||||
version = "0.12.2"
|
version = "0.12.5"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "411278ee8e89067a252a3a6d6d578038251f9c0a1d4c088adf4162ad13e97b04"
|
checksum = "549cb78be46f43ad6746402871336cb6a989127fb847e93eb6ba0817647485a6"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"arbitrary",
|
"arbitrary",
|
||||||
"flagset",
|
"flagset",
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"leb128",
|
"leb128",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.25.0",
|
||||||
"wasmparser",
|
"wasmparser",
|
||||||
]
|
]
|
||||||
|
|
||||||
@@ -3381,9 +3390,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmparser"
|
name = "wasmparser"
|
||||||
version = "0.100.0"
|
version = "0.102.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "64b20236ab624147dfbb62cf12a19aaf66af0e41b8398838b66e997d07d269d4"
|
checksum = "48134de3d7598219ab9eaf6b91b15d8e50d31da76b8519fe4ecfcec2cf35104b"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"indexmap",
|
"indexmap",
|
||||||
"url",
|
"url",
|
||||||
@@ -3400,9 +3409,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wasmprinter"
|
name = "wasmprinter"
|
||||||
version = "0.2.50"
|
version = "0.2.53"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "b2d3f7d7cb1e00ae9f91bb21f2856cdc68a913afb3b6b33fca5a83dba8c8c4eb"
|
checksum = "5aa44d546e4e4479f2e91035fa497c0a05cffbf22413ad05bf0b06a789b9118f"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"wasmparser",
|
"wasmparser",
|
||||||
@@ -3556,7 +3565,7 @@ dependencies = [
|
|||||||
"wasmtime-wasi-nn",
|
"wasmtime-wasi-nn",
|
||||||
"wasmtime-wasi-threads",
|
"wasmtime-wasi-threads",
|
||||||
"wasmtime-wast",
|
"wasmtime-wast",
|
||||||
"wast 53.0.0",
|
"wast 55.0.0",
|
||||||
"wat",
|
"wat",
|
||||||
"windows-sys",
|
"windows-sys",
|
||||||
]
|
]
|
||||||
@@ -3628,7 +3637,7 @@ dependencies = [
|
|||||||
"serde",
|
"serde",
|
||||||
"target-lexicon",
|
"target-lexicon",
|
||||||
"thiserror",
|
"thiserror",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.25.0",
|
||||||
"wasmparser",
|
"wasmparser",
|
||||||
"wasmprinter",
|
"wasmprinter",
|
||||||
"wasmtime-component-util",
|
"wasmtime-component-util",
|
||||||
@@ -3703,7 +3712,7 @@ dependencies = [
|
|||||||
"target-lexicon",
|
"target-lexicon",
|
||||||
"tempfile",
|
"tempfile",
|
||||||
"v8",
|
"v8",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.25.0",
|
||||||
"wasm-mutate",
|
"wasm-mutate",
|
||||||
"wasm-smith",
|
"wasm-smith",
|
||||||
"wasm-spec-interpreter",
|
"wasm-spec-interpreter",
|
||||||
@@ -3844,7 +3853,7 @@ dependencies = [
|
|||||||
"anyhow",
|
"anyhow",
|
||||||
"log",
|
"log",
|
||||||
"wasmtime",
|
"wasmtime",
|
||||||
"wast 53.0.0",
|
"wast 55.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -3879,23 +3888,23 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wast"
|
name = "wast"
|
||||||
version = "53.0.0"
|
version = "55.0.0"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "8244fa24196b1d8fd3ca4a96a3a164c40f846498c5deab6caf414c67340ca4af"
|
checksum = "4984d3e1406571f4930ba5cf79bd70f75f41d0e87e17506e0bd19b0e5d085f05"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"leb128",
|
"leb128",
|
||||||
"memchr",
|
"memchr",
|
||||||
"unicode-width",
|
"unicode-width",
|
||||||
"wasm-encoder",
|
"wasm-encoder 0.25.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wat"
|
name = "wat"
|
||||||
version = "1.0.58"
|
version = "1.0.61"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "4620f1059add6dad511decb9d5d88b4a0a0d3e2e315ed34f79b0dc0dce18aa4b"
|
checksum = "af2b53f4da14db05d32e70e9c617abdf6620c575bd5dd972b7400037b4df2091"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"wast 53.0.0",
|
"wast 55.0.0",
|
||||||
]
|
]
|
||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
@@ -4143,9 +4152,9 @@ dependencies = [
|
|||||||
|
|
||||||
[[package]]
|
[[package]]
|
||||||
name = "wit-parser"
|
name = "wit-parser"
|
||||||
version = "0.6.1"
|
version = "0.6.4"
|
||||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||||
checksum = "a84965789410bf21087f5a352703142f77b9b4d1478764c3f33a1ea8c7101f40"
|
checksum = "f887c3da527a51b321076ebe6a7513026a4757b6d4d144259946552d6fc728b3"
|
||||||
dependencies = [
|
dependencies = [
|
||||||
"anyhow",
|
"anyhow",
|
||||||
"id-arena",
|
"id-arena",
|
||||||
|
|||||||
16
Cargo.toml
16
Cargo.toml
@@ -165,14 +165,14 @@ winch-test-macros = { path = "winch/test-macros" }
|
|||||||
|
|
||||||
target-lexicon = { version = "0.12.3", default-features = false, features = ["std"] }
|
target-lexicon = { version = "0.12.3", default-features = false, features = ["std"] }
|
||||||
anyhow = "1.0.22"
|
anyhow = "1.0.22"
|
||||||
wasmparser = "0.100.0"
|
wasmparser = "0.102.0"
|
||||||
wat = "1.0.57"
|
wat = "1.0.61"
|
||||||
wast = "53.0.0"
|
wast = "55.0.0"
|
||||||
wasmprinter = "0.2.50"
|
wasmprinter = "0.2.53"
|
||||||
wasm-encoder = "0.23.0"
|
wasm-encoder = "0.25.0"
|
||||||
wasm-smith = "0.12.1"
|
wasm-smith = "0.12.5"
|
||||||
wasm-mutate = "0.2.17"
|
wasm-mutate = "0.2.21"
|
||||||
wit-parser = "0.6.1"
|
wit-parser = "0.6.4"
|
||||||
windows-sys = "0.45.0"
|
windows-sys = "0.45.0"
|
||||||
env_logger = "0.9"
|
env_logger = "0.9"
|
||||||
rustix = "0.36.7"
|
rustix = "0.36.7"
|
||||||
|
|||||||
@@ -1151,8 +1151,8 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
Operator::F32Le | Operator::F64Le => {
|
Operator::F32Le | Operator::F64Le => {
|
||||||
translate_fcmp(FloatCC::LessThanOrEqual, builder, state)
|
translate_fcmp(FloatCC::LessThanOrEqual, builder, state)
|
||||||
}
|
}
|
||||||
Operator::RefNull { ty } => {
|
Operator::RefNull { hty } => {
|
||||||
state.push1(environ.translate_ref_null(builder.cursor(), (*ty).try_into()?)?)
|
state.push1(environ.translate_ref_null(builder.cursor(), (*hty).try_into()?)?)
|
||||||
}
|
}
|
||||||
Operator::RefIsNull => {
|
Operator::RefIsNull => {
|
||||||
let value = state.pop1();
|
let value = state.pop1();
|
||||||
@@ -2157,14 +2157,14 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
));
|
));
|
||||||
}
|
}
|
||||||
Operator::I8x16RelaxedSwizzle
|
Operator::I8x16RelaxedSwizzle
|
||||||
| Operator::I32x4RelaxedTruncSatF32x4S
|
| Operator::I32x4RelaxedTruncF32x4S
|
||||||
| Operator::I32x4RelaxedTruncSatF32x4U
|
| Operator::I32x4RelaxedTruncF32x4U
|
||||||
| Operator::I32x4RelaxedTruncSatF64x2SZero
|
| Operator::I32x4RelaxedTruncF64x2SZero
|
||||||
| Operator::I32x4RelaxedTruncSatF64x2UZero
|
| Operator::I32x4RelaxedTruncF64x2UZero
|
||||||
| Operator::F32x4RelaxedFma
|
| Operator::F32x4RelaxedMadd
|
||||||
| Operator::F32x4RelaxedFnma
|
| Operator::F32x4RelaxedNmadd
|
||||||
| Operator::F64x2RelaxedFma
|
| Operator::F64x2RelaxedMadd
|
||||||
| Operator::F64x2RelaxedFnma
|
| Operator::F64x2RelaxedNmadd
|
||||||
| Operator::I8x16RelaxedLaneselect
|
| Operator::I8x16RelaxedLaneselect
|
||||||
| Operator::I16x8RelaxedLaneselect
|
| Operator::I16x8RelaxedLaneselect
|
||||||
| Operator::I32x4RelaxedLaneselect
|
| Operator::I32x4RelaxedLaneselect
|
||||||
@@ -2174,11 +2174,21 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
|||||||
| Operator::F64x2RelaxedMin
|
| Operator::F64x2RelaxedMin
|
||||||
| Operator::F64x2RelaxedMax
|
| Operator::F64x2RelaxedMax
|
||||||
| Operator::I16x8RelaxedQ15mulrS
|
| Operator::I16x8RelaxedQ15mulrS
|
||||||
| Operator::I16x8DotI8x16I7x16S
|
| Operator::I16x8RelaxedDotI8x16I7x16S
|
||||||
| Operator::I32x4DotI8x16I7x16AddS
|
| Operator::I32x4RelaxedDotI8x16I7x16AddS => {
|
||||||
| Operator::F32x4RelaxedDotBf16x8AddF32x4 => {
|
|
||||||
return Err(wasm_unsupported!("proposed relaxed-simd operator {:?}", op));
|
return Err(wasm_unsupported!("proposed relaxed-simd operator {:?}", op));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Operator::CallRef { .. }
|
||||||
|
| Operator::ReturnCallRef { .. }
|
||||||
|
| Operator::BrOnNull { .. }
|
||||||
|
| Operator::BrOnNonNull { .. }
|
||||||
|
| Operator::RefAsNonNull => {
|
||||||
|
return Err(wasm_unsupported!(
|
||||||
|
"proposed function-references operator {:?}",
|
||||||
|
op
|
||||||
|
));
|
||||||
|
}
|
||||||
};
|
};
|
||||||
Ok(())
|
Ok(())
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -202,9 +202,13 @@ fn declare_locals<FE: FuncEnvironment + ?Sized>(
|
|||||||
let constant_handle = builder.func.dfg.constants.insert([0; 16].to_vec().into());
|
let constant_handle = builder.func.dfg.constants.insert([0; 16].to_vec().into());
|
||||||
builder.ins().vconst(ir::types::I8X16, constant_handle)
|
builder.ins().vconst(ir::types::I8X16, constant_handle)
|
||||||
}
|
}
|
||||||
ExternRef | FuncRef => {
|
Ref(wasmparser::RefType {
|
||||||
environ.translate_ref_null(builder.cursor(), wasm_type.try_into()?)?
|
nullable: true,
|
||||||
}
|
heap_type,
|
||||||
|
}) => environ.translate_ref_null(builder.cursor(), heap_type.try_into()?)?,
|
||||||
|
Ref(wasmparser::RefType {
|
||||||
|
nullable: false, ..
|
||||||
|
}) => unreachable!(),
|
||||||
};
|
};
|
||||||
|
|
||||||
let ty = builder.func.dfg.value_type(zeroval);
|
let ty = builder.func.dfg.value_type(zeroval);
|
||||||
|
|||||||
@@ -143,7 +143,7 @@ pub fn parse_table_section(
|
|||||||
environ.reserve_tables(tables.count())?;
|
environ.reserve_tables(tables.count())?;
|
||||||
|
|
||||||
for entry in tables {
|
for entry in tables {
|
||||||
let ty = table(entry?)?;
|
let ty = table(entry?.ty)?;
|
||||||
environ.declare_table(ty)?;
|
environ.declare_table(ty)?;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -198,7 +198,7 @@ pub fn parse_global_section(
|
|||||||
Operator::V128Const { value } => {
|
Operator::V128Const { value } => {
|
||||||
GlobalInit::V128Const(u128::from_le_bytes(*value.bytes()))
|
GlobalInit::V128Const(u128::from_le_bytes(*value.bytes()))
|
||||||
}
|
}
|
||||||
Operator::RefNull { ty: _ } => GlobalInit::RefNullConst,
|
Operator::RefNull { hty: _ } => GlobalInit::RefNullConst,
|
||||||
Operator::RefFunc { function_index } => {
|
Operator::RefFunc { function_index } => {
|
||||||
GlobalInit::RefFunc(FuncIndex::from_u32(function_index))
|
GlobalInit::RefFunc(FuncIndex::from_u32(function_index))
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -37,8 +37,9 @@ where
|
|||||||
wasmparser::ValType::F32 => &[wasmparser::ValType::F32],
|
wasmparser::ValType::F32 => &[wasmparser::ValType::F32],
|
||||||
wasmparser::ValType::F64 => &[wasmparser::ValType::F64],
|
wasmparser::ValType::F64 => &[wasmparser::ValType::F64],
|
||||||
wasmparser::ValType::V128 => &[wasmparser::ValType::V128],
|
wasmparser::ValType::V128 => &[wasmparser::ValType::V128],
|
||||||
wasmparser::ValType::ExternRef => &[wasmparser::ValType::ExternRef],
|
wasmparser::ValType::EXTERNREF => &[wasmparser::ValType::EXTERNREF],
|
||||||
wasmparser::ValType::FuncRef => &[wasmparser::ValType::FuncRef],
|
wasmparser::ValType::FUNCREF => &[wasmparser::ValType::FUNCREF],
|
||||||
|
wasmparser::ValType::Ref(_) => unimplemented!("function references proposal"),
|
||||||
};
|
};
|
||||||
(
|
(
|
||||||
itertools::Either::Left(params.iter().copied()),
|
itertools::Either::Left(params.iter().copied()),
|
||||||
@@ -79,7 +80,7 @@ pub fn block_with_params<PE: TargetEnvironment + ?Sized>(
|
|||||||
wasmparser::ValType::F64 => {
|
wasmparser::ValType::F64 => {
|
||||||
builder.append_block_param(block, ir::types::F64);
|
builder.append_block_param(block, ir::types::F64);
|
||||||
}
|
}
|
||||||
wasmparser::ValType::ExternRef | wasmparser::ValType::FuncRef => {
|
wasmparser::ValType::Ref(ty) => {
|
||||||
builder.append_block_param(block, environ.reference_type(ty.try_into()?));
|
builder.append_block_param(block, environ.reference_type(ty.try_into()?));
|
||||||
}
|
}
|
||||||
wasmparser::ValType::V128 => {
|
wasmparser::ValType::V128 => {
|
||||||
|
|||||||
@@ -2648,10 +2648,8 @@ impl Compiler<'_, '_> {
|
|||||||
| (ValType::F64, ValType::F32)
|
| (ValType::F64, ValType::F32)
|
||||||
|
|
||||||
// not used in the component model
|
// not used in the component model
|
||||||
| (ValType::ExternRef, _)
|
| (ValType::Ref(_), _)
|
||||||
| (_, ValType::ExternRef)
|
| (_, ValType::Ref(_))
|
||||||
| (ValType::FuncRef, _)
|
|
||||||
| (_, ValType::FuncRef)
|
|
||||||
| (ValType::V128, _)
|
| (ValType::V128, _)
|
||||||
| (_, ValType::V128) => {
|
| (_, ValType::V128) => {
|
||||||
panic!("cannot get {dst_ty:?} from {src_ty:?} local");
|
panic!("cannot get {dst_ty:?} from {src_ty:?} local");
|
||||||
@@ -2705,10 +2703,8 @@ impl Compiler<'_, '_> {
|
|||||||
| (ValType::F32, ValType::F64)
|
| (ValType::F32, ValType::F64)
|
||||||
|
|
||||||
// not used in the component model
|
// not used in the component model
|
||||||
| (ValType::ExternRef, _)
|
| (ValType::Ref(_), _)
|
||||||
| (_, ValType::ExternRef)
|
| (_, ValType::Ref(_))
|
||||||
| (ValType::FuncRef, _)
|
|
||||||
| (_, ValType::FuncRef)
|
|
||||||
| (ValType::V128, _)
|
| (ValType::V128, _)
|
||||||
| (_, ValType::V128) => {
|
| (_, ValType::V128) => {
|
||||||
panic!("cannot get {dst_ty:?} from {src_ty:?} local");
|
panic!("cannot get {dst_ty:?} from {src_ty:?} local");
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
|
|||||||
self.result.module.table_plans.reserve_exact(cnt);
|
self.result.module.table_plans.reserve_exact(cnt);
|
||||||
|
|
||||||
for entry in tables {
|
for entry in tables {
|
||||||
let table = entry?.try_into()?;
|
let table = entry?.ty.try_into()?;
|
||||||
let plan = TablePlan::for_table(table, &self.tunables);
|
let plan = TablePlan::for_table(table, &self.tunables);
|
||||||
self.result.module.table_plans.push(plan);
|
self.result.module.table_plans.push(plan);
|
||||||
}
|
}
|
||||||
@@ -345,7 +345,7 @@ impl<'a, 'data> ModuleEnvironment<'a, 'data> {
|
|||||||
Operator::V128Const { value } => {
|
Operator::V128Const { value } => {
|
||||||
GlobalInit::V128Const(u128::from_le_bytes(*value.bytes()))
|
GlobalInit::V128Const(u128::from_le_bytes(*value.bytes()))
|
||||||
}
|
}
|
||||||
Operator::RefNull { ty: _ } => GlobalInit::RefNullConst,
|
Operator::RefNull { hty: _ } => GlobalInit::RefNullConst,
|
||||||
Operator::RefFunc { function_index } => {
|
Operator::RefFunc { function_index } => {
|
||||||
let index = FuncIndex::from_u32(function_index);
|
let index = FuncIndex::from_u32(function_index);
|
||||||
self.flag_func_escaped(index);
|
self.flag_func_escaped(index);
|
||||||
|
|||||||
@@ -122,7 +122,7 @@ impl Stacks {
|
|||||||
types.function(vec![], vec![]);
|
types.function(vec![], vec![]);
|
||||||
|
|
||||||
let call_func_type = types.len();
|
let call_func_type = types.len();
|
||||||
types.function(vec![wasm_encoder::ValType::FuncRef], vec![]);
|
types.function(vec![wasm_encoder::ValType::FUNCREF], vec![]);
|
||||||
|
|
||||||
section(&mut module, types);
|
section(&mut module, types);
|
||||||
|
|
||||||
@@ -190,7 +190,7 @@ impl Stacks {
|
|||||||
|
|
||||||
let mut elems = wasm_encoder::ElementSection::new();
|
let mut elems = wasm_encoder::ElementSection::new();
|
||||||
elems.declared(
|
elems.declared(
|
||||||
wasm_encoder::ValType::FuncRef,
|
wasm_encoder::RefType::FUNCREF,
|
||||||
wasm_encoder::Elements::Functions(
|
wasm_encoder::Elements::Functions(
|
||||||
&(0..num_imported_funcs + u32::try_from(self.funcs.len()).unwrap())
|
&(0..num_imported_funcs + u32::try_from(self.funcs.len()).unwrap())
|
||||||
.collect::<Vec<_>>(),
|
.collect::<Vec<_>>(),
|
||||||
|
|||||||
@@ -4,8 +4,8 @@ use arbitrary::{Arbitrary, Result, Unstructured};
|
|||||||
use std::ops::RangeInclusive;
|
use std::ops::RangeInclusive;
|
||||||
use wasm_encoder::{
|
use wasm_encoder::{
|
||||||
CodeSection, ConstExpr, EntityType, ExportKind, ExportSection, Function, FunctionSection,
|
CodeSection, ConstExpr, EntityType, ExportKind, ExportSection, Function, FunctionSection,
|
||||||
GlobalSection, ImportSection, Instruction, Module, TableSection, TableType, TypeSection,
|
GlobalSection, ImportSection, Instruction, Module, RefType, TableSection, TableType,
|
||||||
ValType,
|
TypeSection, ValType,
|
||||||
};
|
};
|
||||||
|
|
||||||
/// A description of a Wasm module that makes a series of `externref` table
|
/// A description of a Wasm module that makes a series of `externref` table
|
||||||
@@ -50,27 +50,27 @@ impl TableOps {
|
|||||||
// dynamically adjusts the stack pointer for each call that uses
|
// dynamically adjusts the stack pointer for each call that uses
|
||||||
// return pointers rather than statically allocating space in the
|
// return pointers rather than statically allocating space in the
|
||||||
// stack frame.
|
// stack frame.
|
||||||
vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef],
|
vec![ValType::EXTERNREF, ValType::EXTERNREF, ValType::EXTERNREF],
|
||||||
);
|
);
|
||||||
|
|
||||||
// 1: "run"
|
// 1: "run"
|
||||||
let mut params: Vec<ValType> = Vec::with_capacity(self.num_params as usize);
|
let mut params: Vec<ValType> = Vec::with_capacity(self.num_params as usize);
|
||||||
for _i in 0..self.num_params {
|
for _i in 0..self.num_params {
|
||||||
params.push(ValType::ExternRef);
|
params.push(ValType::EXTERNREF);
|
||||||
}
|
}
|
||||||
let results = vec![];
|
let results = vec![];
|
||||||
types.function(params, results);
|
types.function(params, results);
|
||||||
|
|
||||||
// 2: `take_refs`
|
// 2: `take_refs`
|
||||||
types.function(
|
types.function(
|
||||||
vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef],
|
vec![ValType::EXTERNREF, ValType::EXTERNREF, ValType::EXTERNREF],
|
||||||
vec![],
|
vec![],
|
||||||
);
|
);
|
||||||
|
|
||||||
// 3: `make_refs`
|
// 3: `make_refs`
|
||||||
types.function(
|
types.function(
|
||||||
vec![],
|
vec![],
|
||||||
vec![ValType::ExternRef, ValType::ExternRef, ValType::ExternRef],
|
vec![ValType::EXTERNREF, ValType::EXTERNREF, ValType::EXTERNREF],
|
||||||
);
|
);
|
||||||
|
|
||||||
// Import the GC function.
|
// Import the GC function.
|
||||||
@@ -82,7 +82,7 @@ impl TableOps {
|
|||||||
// Define our table.
|
// Define our table.
|
||||||
let mut tables = TableSection::new();
|
let mut tables = TableSection::new();
|
||||||
tables.table(TableType {
|
tables.table(TableType {
|
||||||
element_type: ValType::ExternRef,
|
element_type: RefType::EXTERNREF,
|
||||||
minimum: self.table_size as u32,
|
minimum: self.table_size as u32,
|
||||||
maximum: None,
|
maximum: None,
|
||||||
});
|
});
|
||||||
@@ -92,10 +92,10 @@ impl TableOps {
|
|||||||
for _ in 0..self.num_globals {
|
for _ in 0..self.num_globals {
|
||||||
globals.global(
|
globals.global(
|
||||||
wasm_encoder::GlobalType {
|
wasm_encoder::GlobalType {
|
||||||
val_type: wasm_encoder::ValType::ExternRef,
|
val_type: wasm_encoder::ValType::EXTERNREF,
|
||||||
mutable: true,
|
mutable: true,
|
||||||
},
|
},
|
||||||
&ConstExpr::ref_null(wasm_encoder::ValType::ExternRef),
|
&ConstExpr::ref_null(wasm_encoder::HeapType::Extern),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -108,7 +108,7 @@ impl TableOps {
|
|||||||
|
|
||||||
// Give ourselves one scratch local that we can use in various `TableOp`
|
// Give ourselves one scratch local that we can use in various `TableOp`
|
||||||
// implementations.
|
// implementations.
|
||||||
let mut func = Function::new(vec![(1, ValType::ExternRef)]);
|
let mut func = Function::new(vec![(1, ValType::EXTERNREF)]);
|
||||||
|
|
||||||
func.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
|
func.instruction(&Instruction::Loop(wasm_encoder::BlockType::Empty));
|
||||||
for op in &self.ops {
|
for op in &self.ops {
|
||||||
@@ -261,7 +261,7 @@ impl TableOp {
|
|||||||
func.instruction(&Instruction::Drop);
|
func.instruction(&Instruction::Drop);
|
||||||
}
|
}
|
||||||
Self::Null => {
|
Self::Null => {
|
||||||
func.instruction(&Instruction::RefNull(wasm_encoder::ValType::ExternRef));
|
func.instruction(&Instruction::RefNull(wasm_encoder::HeapType::Extern));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -41,8 +41,36 @@ impl TryFrom<wasmparser::ValType> for WasmType {
|
|||||||
F32 => Ok(WasmType::F32),
|
F32 => Ok(WasmType::F32),
|
||||||
F64 => Ok(WasmType::F64),
|
F64 => Ok(WasmType::F64),
|
||||||
V128 => Ok(WasmType::V128),
|
V128 => Ok(WasmType::V128),
|
||||||
FuncRef => Ok(WasmType::FuncRef),
|
Ref(r) => r.try_into(),
|
||||||
ExternRef => Ok(WasmType::ExternRef),
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<wasmparser::RefType> for WasmType {
|
||||||
|
type Error = WasmError;
|
||||||
|
fn try_from(ty: wasmparser::RefType) -> Result<Self, Self::Error> {
|
||||||
|
match ty {
|
||||||
|
wasmparser::RefType::FUNCREF => Ok(WasmType::FuncRef),
|
||||||
|
wasmparser::RefType::EXTERNREF => Ok(WasmType::ExternRef),
|
||||||
|
_ => Err(WasmError::Unsupported(
|
||||||
|
"function references proposal".to_string(),
|
||||||
|
)),
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
impl TryFrom<wasmparser::HeapType> for WasmType {
|
||||||
|
type Error = WasmError;
|
||||||
|
fn try_from(ty: wasmparser::HeapType) -> Result<Self, Self::Error> {
|
||||||
|
match ty {
|
||||||
|
wasmparser::HeapType::Func => Ok(WasmType::FuncRef),
|
||||||
|
wasmparser::HeapType::Extern => Ok(WasmType::ExternRef),
|
||||||
|
// NB: when the function-references proposal is implemented this
|
||||||
|
// entire `impl` should probably go away to remove the need for not
|
||||||
|
// only this `unsupported` but everything.
|
||||||
|
_ => Err(WasmError::Unsupported(
|
||||||
|
"function references proposal".to_string(),
|
||||||
|
)),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -55,8 +83,8 @@ impl From<WasmType> for wasmparser::ValType {
|
|||||||
WasmType::F32 => wasmparser::ValType::F32,
|
WasmType::F32 => wasmparser::ValType::F32,
|
||||||
WasmType::F64 => wasmparser::ValType::F64,
|
WasmType::F64 => wasmparser::ValType::F64,
|
||||||
WasmType::V128 => wasmparser::ValType::V128,
|
WasmType::V128 => wasmparser::ValType::V128,
|
||||||
WasmType::FuncRef => wasmparser::ValType::FuncRef,
|
WasmType::FuncRef => wasmparser::ValType::FUNCREF,
|
||||||
WasmType::ExternRef => wasmparser::ValType::ExternRef,
|
WasmType::ExternRef => wasmparser::ValType::EXTERNREF,
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -187,6 +187,7 @@ impl Metadata {
|
|||||||
relaxed_simd,
|
relaxed_simd,
|
||||||
extended_const,
|
extended_const,
|
||||||
memory_control,
|
memory_control,
|
||||||
|
function_references,
|
||||||
|
|
||||||
// Always on; we don't currently have knobs for these.
|
// Always on; we don't currently have knobs for these.
|
||||||
mutable_global: _,
|
mutable_global: _,
|
||||||
@@ -197,6 +198,7 @@ impl Metadata {
|
|||||||
|
|
||||||
assert!(!memory_control);
|
assert!(!memory_control);
|
||||||
assert!(!tail_call);
|
assert!(!tail_call);
|
||||||
|
assert!(!function_references);
|
||||||
|
|
||||||
Metadata {
|
Metadata {
|
||||||
target: engine.compiler().triple().to_string(),
|
target: engine.compiler().triple().to_string(),
|
||||||
|
|||||||
@@ -43,4 +43,8 @@ skip-tree = [
|
|||||||
# They want to publish version 2.0 to upgrade `hashbrown` so in the meantime
|
# They want to publish version 2.0 to upgrade `hashbrown` so in the meantime
|
||||||
# it is duplicated for us.
|
# it is duplicated for us.
|
||||||
{ name = "indexmap", depth = 2 },
|
{ name = "indexmap", depth = 2 },
|
||||||
|
|
||||||
|
# This is on and older version of `wasm-encoder` and is one we can't
|
||||||
|
# necessarily easily update, so let `wasm-encoder` get duplicated for now.
|
||||||
|
{ name = "wasm-coredump-builder", depth = 2 },
|
||||||
]
|
]
|
||||||
|
|||||||
@@ -870,6 +870,12 @@ criteria = "safe-to-deploy"
|
|||||||
version = "0.23.0"
|
version = "0.23.0"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wasm-encoder]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "0.25.0"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wasm-encoder]]
|
[[audits.wasm-encoder]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-deploy"
|
criteria = "safe-to-deploy"
|
||||||
@@ -948,6 +954,12 @@ criteria = "safe-to-run"
|
|||||||
version = "0.2.18"
|
version = "0.2.18"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wasm-mutate]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-run"
|
||||||
|
version = "0.2.21"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wasm-smith]]
|
[[audits.wasm-smith]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-deploy"
|
criteria = "safe-to-deploy"
|
||||||
@@ -1020,6 +1032,12 @@ criteria = "safe-to-run"
|
|||||||
version = "0.12.2"
|
version = "0.12.2"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wasm-smith]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-run"
|
||||||
|
version = "0.12.5"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wasmi]]
|
[[audits.wasmi]]
|
||||||
who = "Robin Freyler <robin.freyler@gmail.com>"
|
who = "Robin Freyler <robin.freyler@gmail.com>"
|
||||||
criteria = "safe-to-run"
|
criteria = "safe-to-run"
|
||||||
@@ -1140,6 +1158,12 @@ criteria = "safe-to-deploy"
|
|||||||
version = "0.100.0"
|
version = "0.100.0"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wasmparser]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "0.102.0"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wasmparser-nostd]]
|
[[audits.wasmparser-nostd]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-run"
|
criteria = "safe-to-run"
|
||||||
@@ -1223,6 +1247,12 @@ criteria = "safe-to-deploy"
|
|||||||
version = "0.2.50"
|
version = "0.2.50"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wasmprinter]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "0.2.53"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wast]]
|
[[audits.wast]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-deploy"
|
criteria = "safe-to-deploy"
|
||||||
@@ -1295,6 +1325,12 @@ criteria = "safe-to-deploy"
|
|||||||
version = "53.0.0"
|
version = "53.0.0"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wast]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "55.0.0"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wat]]
|
[[audits.wat]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-deploy"
|
criteria = "safe-to-deploy"
|
||||||
@@ -1349,6 +1385,12 @@ criteria = "safe-to-deploy"
|
|||||||
version = "1.0.58"
|
version = "1.0.58"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wat]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "1.0.61"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
[[audits.wat]]
|
[[audits.wat]]
|
||||||
who = "Alex Crichton <alex@alexcrichton.com>"
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
criteria = "safe-to-deploy"
|
criteria = "safe-to-deploy"
|
||||||
@@ -1511,3 +1553,9 @@ criteria = "safe-to-deploy"
|
|||||||
version = "0.6.1"
|
version = "0.6.1"
|
||||||
notes = "The Bytecode Alliance is the author of this crate."
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
[[audits.wit-parser]]
|
||||||
|
who = "Alex Crichton <alex@alexcrichton.com>"
|
||||||
|
criteria = "safe-to-deploy"
|
||||||
|
version = "0.6.4"
|
||||||
|
notes = "The Bytecode Alliance is the author of this crate."
|
||||||
|
|
||||||
|
|||||||
@@ -1984,7 +1984,7 @@ fn drop_component_still_works() -> Result<()> {
|
|||||||
(export "" (func $f_lower))
|
(export "" (func $f_lower))
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
(func (export "f")
|
(func (export "g")
|
||||||
(canon lift
|
(canon lift
|
||||||
(core func $i "f")
|
(core func $i "f")
|
||||||
)
|
)
|
||||||
@@ -2008,7 +2008,7 @@ fn drop_component_still_works() -> Result<()> {
|
|||||||
(store, instance)
|
(store, instance)
|
||||||
};
|
};
|
||||||
|
|
||||||
let f = instance.get_typed_func::<(), ()>(&mut store, "f")?;
|
let f = instance.get_typed_func::<(), ()>(&mut store, "g")?;
|
||||||
assert_eq!(*store.data(), 0);
|
assert_eq!(*store.data(), 0);
|
||||||
f.call(&mut store, ())?;
|
f.call(&mut store, ())?;
|
||||||
assert_eq!(*store.data(), 2);
|
assert_eq!(*store.data(), 2);
|
||||||
@@ -2202,7 +2202,7 @@ fn lower_then_lift() -> Result<()> {
|
|||||||
(func $f2 (result s32)
|
(func $f2 (result s32)
|
||||||
(canon lift (core func $f_lower))
|
(canon lift (core func $f_lower))
|
||||||
)
|
)
|
||||||
(export "f" (func $f2))
|
(export "f2" (func $f2))
|
||||||
)
|
)
|
||||||
"#;
|
"#;
|
||||||
|
|
||||||
@@ -2213,7 +2213,7 @@ fn lower_then_lift() -> Result<()> {
|
|||||||
linker.root().func_wrap("f", |_, _: ()| Ok((2u32,)))?;
|
linker.root().func_wrap("f", |_, _: ()| Ok((2u32,)))?;
|
||||||
let instance = linker.instantiate(&mut store, &component)?;
|
let instance = linker.instantiate(&mut store, &component)?;
|
||||||
|
|
||||||
let f = instance.get_typed_func::<(), (i32,)>(&mut store, "f")?;
|
let f = instance.get_typed_func::<(), (i32,)>(&mut store, "f2")?;
|
||||||
assert_eq!(f.call(&mut store, ())?, (2,));
|
assert_eq!(f.call(&mut store, ())?, (2,));
|
||||||
|
|
||||||
// First test strings when the import/export ABI happen to line up
|
// First test strings when the import/export ABI happen to line up
|
||||||
|
|||||||
@@ -685,10 +685,10 @@ fn bad_import_alignment() -> Result<()> {
|
|||||||
))
|
))
|
||||||
))
|
))
|
||||||
|
|
||||||
(func (export "unaligned-retptr")
|
(func (export "unaligned-retptr2")
|
||||||
(canon lift (core func $m "unaligned-retptr"))
|
(canon lift (core func $m "unaligned-retptr"))
|
||||||
)
|
)
|
||||||
(func (export "unaligned-argptr")
|
(func (export "unaligned-argptr2")
|
||||||
(canon lift (core func $m "unaligned-argptr"))
|
(canon lift (core func $m "unaligned-argptr"))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -723,7 +723,7 @@ fn bad_import_alignment() -> Result<()> {
|
|||||||
|
|
||||||
let trap = linker
|
let trap = linker
|
||||||
.instantiate(&mut store, &component)?
|
.instantiate(&mut store, &component)?
|
||||||
.get_typed_func::<(), ()>(&mut store, "unaligned-retptr")?
|
.get_typed_func::<(), ()>(&mut store, "unaligned-retptr2")?
|
||||||
.call(&mut store, ())
|
.call(&mut store, ())
|
||||||
.unwrap_err();
|
.unwrap_err();
|
||||||
assert!(
|
assert!(
|
||||||
@@ -733,7 +733,7 @@ fn bad_import_alignment() -> Result<()> {
|
|||||||
);
|
);
|
||||||
let trap = linker
|
let trap = linker
|
||||||
.instantiate(&mut store, &component)?
|
.instantiate(&mut store, &component)?
|
||||||
.get_typed_func::<(), ()>(&mut store, "unaligned-argptr")?
|
.get_typed_func::<(), ()>(&mut store, "unaligned-argptr2")?
|
||||||
.call(&mut store, ())
|
.call(&mut store, ())
|
||||||
.unwrap_err();
|
.unwrap_err();
|
||||||
assert!(
|
assert!(
|
||||||
|
|||||||
@@ -114,7 +114,7 @@ fn test_roundtrip(engine: &Engine, src: &str, dst: &str) -> Result<()> {
|
|||||||
(with "libc" (instance $libc))
|
(with "libc" (instance $libc))
|
||||||
(with "" (instance (export "echo" (func $echo))))
|
(with "" (instance (export "echo" (func $echo))))
|
||||||
))
|
))
|
||||||
(func (export "echo") (param "a" string) (result string)
|
(func (export "echo2") (param "a" string) (result string)
|
||||||
(canon lift
|
(canon lift
|
||||||
(core func $echo "echo")
|
(core func $echo "echo")
|
||||||
(memory $libc "memory")
|
(memory $libc "memory")
|
||||||
@@ -163,8 +163,8 @@ fn test_roundtrip(engine: &Engine, src: &str, dst: &str) -> Result<()> {
|
|||||||
{dst}
|
{dst}
|
||||||
|
|
||||||
(instance $dst (instantiate $dst (with "echo" (func $host))))
|
(instance $dst (instantiate $dst (with "echo" (func $host))))
|
||||||
(instance $src (instantiate $src (with "echo" (func $dst "echo"))))
|
(instance $src (instantiate $src (with "echo" (func $dst "echo2"))))
|
||||||
(export "echo" (func $src "echo"))
|
(export "echo" (func $src "echo2"))
|
||||||
)
|
)
|
||||||
"#
|
"#
|
||||||
);
|
);
|
||||||
|
|||||||
@@ -244,17 +244,17 @@
|
|||||||
(export "" (func $import))
|
(export "" (func $import))
|
||||||
))
|
))
|
||||||
))
|
))
|
||||||
(func $export (export "thunk") (result u32)
|
(func $export (export "thunk2") (result u32)
|
||||||
(canon lift (core func $reexport "thunk"))
|
(canon lift (core func $reexport "thunk"))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
(instance $c1 (instantiate $c (with "thunk" (func $root))))
|
(instance $c1 (instantiate $c (with "thunk" (func $root))))
|
||||||
(instance $c2 (instantiate $c (with "thunk" (func $c1 "thunk"))))
|
(instance $c2 (instantiate $c (with "thunk" (func $c1 "thunk2"))))
|
||||||
(instance $c3 (instantiate $c (with "thunk" (func $c2 "thunk"))))
|
(instance $c3 (instantiate $c (with "thunk" (func $c2 "thunk2"))))
|
||||||
(instance $c4 (instantiate $c (with "thunk" (func $c3 "thunk"))))
|
(instance $c4 (instantiate $c (with "thunk" (func $c3 "thunk2"))))
|
||||||
(instance $c5 (instantiate $c (with "thunk" (func $c4 "thunk"))))
|
(instance $c5 (instantiate $c (with "thunk" (func $c4 "thunk2"))))
|
||||||
(instance $c6 (instantiate $c (with "thunk" (func $c5 "thunk"))))
|
(instance $c6 (instantiate $c (with "thunk" (func $c5 "thunk2"))))
|
||||||
|
|
||||||
(component $verify
|
(component $verify
|
||||||
(import "thunk" (func $thunk (result u32)))
|
(import "thunk" (func $thunk (result u32)))
|
||||||
@@ -276,7 +276,7 @@
|
|||||||
))
|
))
|
||||||
))
|
))
|
||||||
)
|
)
|
||||||
(instance (instantiate $verify (with "thunk" (func $c6 "thunk"))))
|
(instance (instantiate $verify (with "thunk" (func $c6 "thunk2"))))
|
||||||
)
|
)
|
||||||
|
|
||||||
;; Fancy case of an adapter using an adapter. Note that this is silly and
|
;; Fancy case of an adapter using an adapter. Note that this is silly and
|
||||||
|
|||||||
@@ -267,7 +267,7 @@
|
|||||||
(export "a" (global i32))
|
(export "a" (global i32))
|
||||||
))
|
))
|
||||||
|
|
||||||
(component (export "c")
|
(component (export "c2")
|
||||||
(export "m" (core module $c))
|
(export "m" (core module $c))
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
@@ -278,8 +278,8 @@
|
|||||||
(instance $c1 (instantiate $c (with "c" (core module $m1))))
|
(instance $c1 (instantiate $c (with "c" (core module $m1))))
|
||||||
(instance $c2 (instantiate $c (with "c" (core module $m2))))
|
(instance $c2 (instantiate $c (with "c" (core module $m2))))
|
||||||
|
|
||||||
(instance $m1_container (instantiate (component $c1 "c")))
|
(instance $m1_container (instantiate (component $c1 "c2")))
|
||||||
(instance $m2_container (instantiate (component $c2 "c")))
|
(instance $m2_container (instantiate (component $c2 "c2")))
|
||||||
|
|
||||||
(core instance $core1 (instantiate (module $m1_container "m")))
|
(core instance $core1 (instantiate (module $m1_container "m")))
|
||||||
(core instance $core2 (instantiate (module $m2_container "m")))
|
(core instance $core2 (instantiate (module $m2_container "m")))
|
||||||
|
|||||||
Reference in New Issue
Block a user