mirror of
https://github.com/mii443/wasmer.git
synced 2025-12-16 17:18:57 +00:00
Update wasmparser to 0.83
This commit is contained in:
16
Cargo.lock
generated
16
Cargo.lock
generated
@@ -2787,7 +2787,7 @@ dependencies = [
|
||||
"wasmer-engine-universal",
|
||||
"wasmer-types",
|
||||
"wasmer-vm",
|
||||
"wasmparser 0.78.2",
|
||||
"wasmparser 0.83.0",
|
||||
"wat",
|
||||
"winapi",
|
||||
]
|
||||
@@ -2903,7 +2903,7 @@ dependencies = [
|
||||
"thiserror",
|
||||
"wasmer-types",
|
||||
"wasmer-vm",
|
||||
"wasmparser 0.78.2",
|
||||
"wasmparser 0.83.0",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
@@ -3268,18 +3268,18 @@ dependencies = [
|
||||
"wasmer-wast",
|
||||
]
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.78.2"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "52144d4c78e5cf8b055ceab8e5fa22814ce4315d6002ad32cfd914f37c12fd65"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.82.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "0559cc0f1779240d6f894933498877ea94f693d84f3ee39c9a9932c6c312bd70"
|
||||
|
||||
[[package]]
|
||||
name = "wasmparser"
|
||||
version = "0.83.0"
|
||||
source = "registry+https://github.com/rust-lang/crates.io-index"
|
||||
checksum = "718ed7c55c2add6548cca3ddd6383d738cd73b892df400e96b9aa876f0141d7a"
|
||||
|
||||
[[package]]
|
||||
name = "wasmprinter"
|
||||
version = "0.2.32"
|
||||
|
||||
@@ -62,7 +62,7 @@ wasm-bindgen = "0.2.74"
|
||||
js-sys = "0.3.51"
|
||||
wasmer-derive = { path = "../derive", version = "=2.2.1" }
|
||||
# - Optional dependencies for `js`.
|
||||
wasmparser = { version = "0.78", default-features = false, optional = true }
|
||||
wasmparser = { version = "0.83", default-features = false, optional = true }
|
||||
hashbrown = { version = "0.11", optional = true }
|
||||
# - Development Dependencies for `js`.
|
||||
[target.'cfg(target_arch = "wasm32")'.dev-dependencies]
|
||||
|
||||
@@ -368,28 +368,31 @@ pub fn parse_import_section<'data>(
|
||||
field_name.unwrap_or_default(),
|
||||
)?;
|
||||
}
|
||||
ImportSectionEntryType::Module(_)
|
||||
| ImportSectionEntryType::Instance(_)
|
||||
| ImportSectionEntryType::Event(_) => {
|
||||
ImportSectionEntryType::Module(_) | ImportSectionEntryType::Instance(_) => {
|
||||
unimplemented!("module linking not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType::M32 {
|
||||
limits: ref memlimits,
|
||||
ImportSectionEntryType::Tag(_) => {
|
||||
unimplemented!("exception handling not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType {
|
||||
shared,
|
||||
memory64,
|
||||
initial,
|
||||
maximum,
|
||||
}) => {
|
||||
if memory64 {
|
||||
unimplemented!("64bit memory not implemented yet");
|
||||
}
|
||||
module_info.declare_memory_import(
|
||||
MemoryType {
|
||||
minimum: Pages(memlimits.initial),
|
||||
maximum: memlimits.maximum.map(Pages),
|
||||
minimum: Pages(initial as u32),
|
||||
maximum: maximum.map(|p| Pages(p as u32)),
|
||||
shared,
|
||||
},
|
||||
module_name,
|
||||
field_name.unwrap_or_default(),
|
||||
)?;
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType::M64 { .. }) => {
|
||||
unimplemented!("64bit memory not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Global(ref ty) => {
|
||||
module_info.declare_global_import(
|
||||
GlobalType {
|
||||
@@ -404,8 +407,8 @@ pub fn parse_import_section<'data>(
|
||||
module_info.declare_table_import(
|
||||
TableType {
|
||||
ty: wptype_to_type(tab.element_type).unwrap(),
|
||||
minimum: tab.limits.initial,
|
||||
maximum: tab.limits.maximum,
|
||||
minimum: tab.initial,
|
||||
maximum: tab.maximum,
|
||||
},
|
||||
module_name,
|
||||
field_name.unwrap_or_default(),
|
||||
@@ -443,8 +446,8 @@ pub fn parse_table_section(
|
||||
let table = entry.map_err(transform_err)?;
|
||||
module_info.declare_table(TableType {
|
||||
ty: wptype_to_type(table.element_type).unwrap(),
|
||||
minimum: table.limits.initial,
|
||||
maximum: table.limits.maximum,
|
||||
minimum: table.initial,
|
||||
maximum: table.maximum,
|
||||
})?;
|
||||
}
|
||||
|
||||
@@ -459,18 +462,21 @@ pub fn parse_memory_section(
|
||||
module_info.reserve_memories(memories.get_count())?;
|
||||
|
||||
for entry in memories {
|
||||
let memory = entry.map_err(transform_err)?;
|
||||
match memory {
|
||||
WPMemoryType::M32 { limits, shared } => {
|
||||
let WPMemoryType {
|
||||
shared,
|
||||
memory64,
|
||||
initial,
|
||||
maximum,
|
||||
} = entry.map_err(transform_err)?;
|
||||
if memory64 {
|
||||
unimplemented!("64bit memory not implemented yet");
|
||||
}
|
||||
module_info.declare_memory(MemoryType {
|
||||
minimum: Pages(limits.initial),
|
||||
maximum: limits.maximum.map(Pages),
|
||||
minimum: Pages(initial as u32),
|
||||
maximum: maximum.map(|p| Pages(p as u32)),
|
||||
shared,
|
||||
})?;
|
||||
}
|
||||
WPMemoryType::M64 { .. } => unimplemented!("64bit memory not implemented yet"),
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -528,12 +534,12 @@ pub fn parse_export_section<'data>(
|
||||
ExternalKind::Global => {
|
||||
module_info.declare_global_export(GlobalIndex::new(index), field)?
|
||||
}
|
||||
ExternalKind::Type
|
||||
| ExternalKind::Module
|
||||
| ExternalKind::Instance
|
||||
| ExternalKind::Event => {
|
||||
ExternalKind::Type | ExternalKind::Module | ExternalKind::Instance => {
|
||||
unimplemented!("module linking not implemented yet")
|
||||
}
|
||||
ExternalKind::Tag => {
|
||||
unimplemented!("exception handling not implemented yet")
|
||||
}
|
||||
}
|
||||
}
|
||||
Ok(())
|
||||
@@ -569,7 +575,14 @@ pub fn parse_name_section<'data>(
|
||||
}
|
||||
}
|
||||
wasmparser::Name::Local(_) => {}
|
||||
wasmparser::Name::Unknown { .. } => {}
|
||||
wasmparser::Name::Label(_)
|
||||
| wasmparser::Name::Type(_)
|
||||
| wasmparser::Name::Table(_)
|
||||
| wasmparser::Name::Memory(_)
|
||||
| wasmparser::Name::Global(_)
|
||||
| wasmparser::Name::Element(_)
|
||||
| wasmparser::Name::Data(_)
|
||||
| wasmparser::Name::Unknown { .. } => {}
|
||||
};
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -253,7 +253,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
}
|
||||
Operator::Select => {
|
||||
// we can ignore metadata because extern ref must use TypedSelect
|
||||
let ((arg1, _), (arg2, _), (cond, _)) = state.pop3();
|
||||
let ((mut arg1, _), (mut arg2, _), (cond, _)) = state.pop3();
|
||||
if builder.func.dfg.value_type(arg1).is_vector() {
|
||||
arg1 = optionally_bitcast_vector(arg1, I8X16, builder);
|
||||
}
|
||||
if builder.func.dfg.value_type(arg2).is_vector() {
|
||||
arg2 = optionally_bitcast_vector(arg2, I8X16, builder);
|
||||
}
|
||||
state.push1(builder.ins().select(cond, arg1, arg2));
|
||||
}
|
||||
Operator::TypedSelect { ty } => {
|
||||
@@ -495,12 +501,12 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
}
|
||||
Operator::BrIf { relative_depth } => translate_br_if(*relative_depth, builder, state),
|
||||
Operator::BrTable { table } => {
|
||||
let mut depths = table.targets().collect::<Result<Vec<_>, _>>()?;
|
||||
let default = depths.pop().unwrap().0;
|
||||
let default = table.default();
|
||||
let mut min_depth = default;
|
||||
for (depth, _) in depths.iter() {
|
||||
if *depth < min_depth {
|
||||
min_depth = *depth;
|
||||
for depth in table.targets() {
|
||||
let depth = depth?;
|
||||
if depth < min_depth {
|
||||
min_depth = depth;
|
||||
}
|
||||
}
|
||||
let jump_args_count = {
|
||||
@@ -513,12 +519,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
}
|
||||
};
|
||||
let (val, _) = state.pop1();
|
||||
let mut data = JumpTableData::with_capacity(depths.len());
|
||||
let mut data = JumpTableData::with_capacity(table.len() as usize);
|
||||
if jump_args_count == 0 {
|
||||
// No jump arguments
|
||||
for (depth, _) in depths.iter() {
|
||||
for depth in table.targets() {
|
||||
let depth = depth?;
|
||||
let block = {
|
||||
let i = state.control_stack.len() - 1 - (*depth as usize);
|
||||
let i = state.control_stack.len() - 1 - (depth as usize);
|
||||
let frame = &mut state.control_stack[i];
|
||||
frame.set_branched_to_exit();
|
||||
frame.br_destination()
|
||||
@@ -539,12 +546,13 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
let return_count = jump_args_count;
|
||||
let mut dest_block_sequence = vec![];
|
||||
let mut dest_block_map = HashMap::new();
|
||||
for (depth, _) in depths.iter() {
|
||||
let branch_block = match dest_block_map.entry(*depth as usize) {
|
||||
for depth in table.targets() {
|
||||
let depth = depth?;
|
||||
let branch_block = match dest_block_map.entry(depth as usize) {
|
||||
hash_map::Entry::Occupied(entry) => *entry.get(),
|
||||
hash_map::Entry::Vacant(entry) => {
|
||||
let block = builder.create_block();
|
||||
dest_block_sequence.push((*depth as usize, block));
|
||||
dest_block_sequence.push((depth as usize, block));
|
||||
*entry.insert(block)
|
||||
}
|
||||
};
|
||||
@@ -608,7 +616,6 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
Operator::Try { .. }
|
||||
| Operator::Catch { .. }
|
||||
| Operator::Throw { .. }
|
||||
| Operator::Unwind
|
||||
| Operator::Rethrow { .. }
|
||||
| Operator::Delegate { .. }
|
||||
| Operator::CatchAll => {
|
||||
@@ -1967,7 +1974,24 @@ pub fn translate_operator<FE: FuncEnvironment + ?Sized>(
|
||||
| Operator::F64x2ConvertLowI32x4U
|
||||
| Operator::I32x4TruncSatF64x2SZero
|
||||
| Operator::I32x4TruncSatF64x2UZero
|
||||
| Operator::I8x16Popcnt => {
|
||||
| Operator::I8x16Popcnt
|
||||
| Operator::I8x16RelaxedSwizzle
|
||||
| Operator::I32x4RelaxedTruncSatF32x4S
|
||||
| Operator::I32x4RelaxedTruncSatF32x4U
|
||||
| Operator::I32x4RelaxedTruncSatF64x2SZero
|
||||
| Operator::I32x4RelaxedTruncSatF64x2UZero
|
||||
| Operator::F32x4Fma
|
||||
| Operator::F32x4Fms
|
||||
| Operator::F64x2Fma
|
||||
| Operator::F64x2Fms
|
||||
| Operator::I8x16LaneSelect
|
||||
| Operator::I16x8LaneSelect
|
||||
| Operator::I32x4LaneSelect
|
||||
| Operator::I64x2LaneSelect
|
||||
| Operator::F32x4RelaxedMin
|
||||
| Operator::F32x4RelaxedMax
|
||||
| Operator::F64x2RelaxedMin
|
||||
| Operator::F64x2RelaxedMax => {
|
||||
return Err(wasm_unsupported!("proposed simd operator {:?}", op));
|
||||
}
|
||||
Operator::ReturnCall { .. } | Operator::ReturnCallIndirect { .. } => {
|
||||
@@ -2206,7 +2230,7 @@ fn prepare_load<FE: FuncEnvironment + ?Sized>(
|
||||
let (base, offset) = get_heap_addr(
|
||||
heap,
|
||||
addr32,
|
||||
memarg.offset,
|
||||
memarg.offset as u32,
|
||||
loaded_bytes,
|
||||
environ.pointer_type(),
|
||||
builder,
|
||||
@@ -2258,7 +2282,7 @@ fn translate_store<FE: FuncEnvironment + ?Sized>(
|
||||
let (base, offset) = get_heap_addr(
|
||||
heap,
|
||||
addr32,
|
||||
memarg.offset,
|
||||
memarg.offset as u32,
|
||||
mem_op_size(opcode, val_ty),
|
||||
environ.pointer_type(),
|
||||
builder,
|
||||
@@ -2300,7 +2324,7 @@ fn fold_atomic_mem_addr(
|
||||
let linear_mem_addr = builder.ins().uextend(I64, linear_mem_addr);
|
||||
let a = builder
|
||||
.ins()
|
||||
.iadd_imm(linear_mem_addr, i64::from(memarg.offset));
|
||||
.iadd_imm(linear_mem_addr, memarg.offset as i64);
|
||||
let cflags = builder.ins().ifcmp_imm(a, 0x1_0000_0000i64);
|
||||
builder.ins().trapif(
|
||||
IntCC::UnsignedGreaterThanOrEqual,
|
||||
@@ -2338,7 +2362,7 @@ fn finalise_atomic_mem_addr<FE: FuncEnvironment + ?Sized>(
|
||||
let access_ty_bytes = access_ty.bytes();
|
||||
let final_lma = builder
|
||||
.ins()
|
||||
.iadd_imm(linear_mem_addr, i64::from(memarg.offset));
|
||||
.iadd_imm(linear_mem_addr, memarg.offset as i64);
|
||||
if access_ty_bytes != 1 {
|
||||
assert!(access_ty_bytes == 2 || access_ty_bytes == 4 || access_ty_bytes == 8);
|
||||
let final_lma_misalignment = builder
|
||||
|
||||
@@ -1592,12 +1592,9 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
|
||||
.get_insert_block()
|
||||
.ok_or_else(|| CompileError::Codegen("not currently in a block".to_string()))?;
|
||||
|
||||
let mut label_depths = table.targets().collect::<Result<Vec<_>, _>>()?;
|
||||
let default_depth = label_depths.pop().unwrap().0;
|
||||
|
||||
let index = self.state.pop1()?;
|
||||
|
||||
let default_frame = self.state.frame_at_depth(default_depth)?;
|
||||
let default_frame = self.state.frame_at_depth(table.default())?;
|
||||
|
||||
let phis = if default_frame.is_loop() {
|
||||
default_frame.loop_body_phis()
|
||||
@@ -1610,10 +1607,11 @@ impl<'ctx, 'a> LLVMFunctionCodeGenerator<'ctx, 'a> {
|
||||
phi.add_incoming(&[(value, current_block)]);
|
||||
}
|
||||
|
||||
let cases: Vec<_> = label_depths
|
||||
.iter()
|
||||
let cases: Vec<_> = table
|
||||
.targets()
|
||||
.enumerate()
|
||||
.map(|(case_index, &(depth, _))| {
|
||||
.map(|(case_index, depth)| {
|
||||
let depth = depth?;
|
||||
let frame_result: Result<&ControlFrame, CompileError> =
|
||||
self.state.frame_at_depth(depth);
|
||||
let frame = match frame_result {
|
||||
|
||||
@@ -3873,13 +3873,13 @@ impl<'a, M: Machine> FuncGen<'a, M> {
|
||||
self.machine.emit_label(after);
|
||||
}
|
||||
Operator::BrTable { ref table } => {
|
||||
let mut targets = table
|
||||
let targets = table
|
||||
.targets()
|
||||
.collect::<Result<Vec<_>, _>>()
|
||||
.map_err(|e| CodegenError {
|
||||
message: format!("BrTable read_table: {:?}", e),
|
||||
})?;
|
||||
let default_target = targets.pop().unwrap().0;
|
||||
let default_target = table.default();
|
||||
let cond = self.pop_value_released();
|
||||
let table_label = self.machine.get_label();
|
||||
let mut table: Vec<Label> = vec![];
|
||||
@@ -3893,7 +3893,7 @@ impl<'a, M: Machine> FuncGen<'a, M> {
|
||||
|
||||
self.machine.emit_jmp_to_jumptable(table_label, cond);
|
||||
|
||||
for (target, _) in targets.iter() {
|
||||
for target in targets.iter() {
|
||||
let label = self.machine.get_label();
|
||||
self.machine.emit_label(label);
|
||||
table.push(label);
|
||||
|
||||
@@ -935,7 +935,7 @@ impl MachineARM64 {
|
||||
if self.compatible_imm(memarg.offset as _, ImmType::Bits12) {
|
||||
self.assembler.emit_adds(
|
||||
Size::S32,
|
||||
Location::Imm32(memarg.offset),
|
||||
Location::Imm32(memarg.offset as u32),
|
||||
Location::GPR(tmp_addr),
|
||||
Location::GPR(tmp_addr),
|
||||
);
|
||||
|
||||
@@ -500,7 +500,7 @@ impl MachineX86_64 {
|
||||
if memarg.offset != 0 {
|
||||
self.assembler.emit_add(
|
||||
Size::S32,
|
||||
Location::Imm32(memarg.offset),
|
||||
Location::Imm32(memarg.offset as u32),
|
||||
Location::GPR(tmp_addr),
|
||||
);
|
||||
|
||||
|
||||
@@ -13,7 +13,7 @@ edition = "2018"
|
||||
[dependencies]
|
||||
wasmer-vm = { path = "../vm", version = "=2.2.1" }
|
||||
wasmer-types = { path = "../types", version = "=2.2.1", default-features = false }
|
||||
wasmparser = { version = "0.78", optional = true, default-features = false }
|
||||
wasmparser = { version = "0.83", optional = true, default-features = false }
|
||||
target-lexicon = { version = "0.12.2", default-features = false }
|
||||
enumset = "1.0"
|
||||
hashbrown = { version = "0.11", optional = true }
|
||||
|
||||
@@ -100,6 +100,11 @@ pub trait Compiler: Send + MemoryUsage {
|
||||
memory64: features.memory64,
|
||||
exceptions: features.exceptions,
|
||||
deterministic_only: false,
|
||||
extended_const: features.extended_const,
|
||||
relaxed_simd: features.relaxed_simd,
|
||||
mutable_global: true,
|
||||
saturating_float_to_int: true,
|
||||
sign_extension: true,
|
||||
};
|
||||
validator.wasm_features(wasm_features);
|
||||
validator
|
||||
|
||||
@@ -83,12 +83,15 @@ pub fn translate_module<'data>(
|
||||
|
||||
Payload::InstanceSection(_)
|
||||
| Payload::AliasSection(_)
|
||||
| Payload::EventSection(_)
|
||||
| Payload::ModuleSectionStart { .. }
|
||||
| Payload::ModuleSectionEntry { .. } => {
|
||||
unimplemented!("module linking not implemented yet")
|
||||
}
|
||||
|
||||
Payload::TagSection(_) => {
|
||||
unimplemented!("exception handling not implemented yet")
|
||||
}
|
||||
|
||||
Payload::CustomSection {
|
||||
name: "name",
|
||||
data,
|
||||
|
||||
@@ -105,28 +105,31 @@ pub fn parse_import_section<'data>(
|
||||
field_name.unwrap_or_default(),
|
||||
)?;
|
||||
}
|
||||
ImportSectionEntryType::Module(_)
|
||||
| ImportSectionEntryType::Instance(_)
|
||||
| ImportSectionEntryType::Event(_) => {
|
||||
ImportSectionEntryType::Module(_) | ImportSectionEntryType::Instance(_) => {
|
||||
unimplemented!("module linking not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType::M32 {
|
||||
limits: ref memlimits,
|
||||
ImportSectionEntryType::Tag(_) => {
|
||||
unimplemented!("exception handling not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType {
|
||||
shared,
|
||||
memory64,
|
||||
initial,
|
||||
maximum,
|
||||
}) => {
|
||||
if memory64 {
|
||||
unimplemented!("64bit memory not implemented yet");
|
||||
}
|
||||
environ.declare_memory_import(
|
||||
MemoryType {
|
||||
minimum: Pages(memlimits.initial),
|
||||
maximum: memlimits.maximum.map(Pages),
|
||||
minimum: Pages(initial as u32),
|
||||
maximum: maximum.map(|p| Pages(p as u32)),
|
||||
shared,
|
||||
},
|
||||
module_name,
|
||||
field_name.unwrap_or_default(),
|
||||
)?;
|
||||
}
|
||||
ImportSectionEntryType::Memory(WPMemoryType::M64 { .. }) => {
|
||||
unimplemented!("64bit memory not implemented yet")
|
||||
}
|
||||
ImportSectionEntryType::Global(ref ty) => {
|
||||
environ.declare_global_import(
|
||||
GlobalType {
|
||||
@@ -141,8 +144,8 @@ pub fn parse_import_section<'data>(
|
||||
environ.declare_table_import(
|
||||
TableType {
|
||||
ty: wptype_to_type(tab.element_type).unwrap(),
|
||||
minimum: tab.limits.initial,
|
||||
maximum: tab.limits.maximum,
|
||||
minimum: tab.initial,
|
||||
maximum: tab.maximum,
|
||||
},
|
||||
module_name,
|
||||
field_name.unwrap_or_default(),
|
||||
@@ -187,8 +190,8 @@ pub fn parse_table_section(
|
||||
let table = entry?;
|
||||
environ.declare_table(TableType {
|
||||
ty: wptype_to_type(table.element_type).unwrap(),
|
||||
minimum: table.limits.initial,
|
||||
maximum: table.limits.maximum,
|
||||
minimum: table.initial,
|
||||
maximum: table.maximum,
|
||||
})?;
|
||||
}
|
||||
|
||||
@@ -203,18 +206,21 @@ pub fn parse_memory_section(
|
||||
environ.reserve_memories(memories.get_count())?;
|
||||
|
||||
for entry in memories {
|
||||
let memory = entry?;
|
||||
match memory {
|
||||
WPMemoryType::M32 { limits, shared } => {
|
||||
let WPMemoryType {
|
||||
shared,
|
||||
memory64,
|
||||
initial,
|
||||
maximum,
|
||||
} = entry?;
|
||||
if memory64 {
|
||||
unimplemented!("64bit memory not implemented yet");
|
||||
}
|
||||
environ.declare_memory(MemoryType {
|
||||
minimum: Pages(limits.initial),
|
||||
maximum: limits.maximum.map(Pages),
|
||||
minimum: Pages(initial as u32),
|
||||
maximum: maximum.map(|p| Pages(p as u32)),
|
||||
shared,
|
||||
})?;
|
||||
}
|
||||
WPMemoryType::M64 { .. } => unimplemented!("64bit memory not implemented yet"),
|
||||
}
|
||||
}
|
||||
|
||||
Ok(())
|
||||
}
|
||||
@@ -294,12 +300,12 @@ pub fn parse_export_section<'data>(
|
||||
ExternalKind::Global => {
|
||||
environ.declare_global_export(GlobalIndex::new(index), field)?
|
||||
}
|
||||
ExternalKind::Type
|
||||
| ExternalKind::Module
|
||||
| ExternalKind::Instance
|
||||
| ExternalKind::Event => {
|
||||
ExternalKind::Type | ExternalKind::Module | ExternalKind::Instance => {
|
||||
unimplemented!("module linking not implemented yet")
|
||||
}
|
||||
ExternalKind::Tag => {
|
||||
unimplemented!("exception handling not implemented yet")
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -318,7 +324,16 @@ fn read_elems(items: &ElementItems) -> WasmResult<Box<[FunctionIndex]>> {
|
||||
let mut elems = Vec::with_capacity(usize::try_from(items_reader.get_count()).unwrap());
|
||||
for item in items_reader {
|
||||
let elem = match item? {
|
||||
ElementItem::Null(_ty) => FunctionIndex::reserved_value(),
|
||||
ElementItem::Expr(init) => match init.get_binary_reader().read_operator()? {
|
||||
Operator::RefNull { .. } => FunctionIndex::reserved_value(),
|
||||
Operator::RefFunc { function_index } => FunctionIndex::from_u32(function_index),
|
||||
s => {
|
||||
return Err(WasmError::Unsupported(format!(
|
||||
"unsupported init expr in element section: {:?}",
|
||||
s
|
||||
)));
|
||||
}
|
||||
},
|
||||
ElementItem::Func(index) => FunctionIndex::from_u32(index),
|
||||
};
|
||||
elems.push(elem);
|
||||
@@ -334,7 +349,12 @@ pub fn parse_element_section<'data>(
|
||||
environ.reserve_table_initializers(elements.get_count())?;
|
||||
|
||||
for (index, entry) in elements.into_iter().enumerate() {
|
||||
let Element { kind, items, ty } = entry?;
|
||||
let Element {
|
||||
kind,
|
||||
items,
|
||||
ty,
|
||||
range: _,
|
||||
} = entry?;
|
||||
if ty != wasmparser::Type::FuncRef {
|
||||
return Err(wasm_unsupported!(
|
||||
"unsupported table element type: {:?}",
|
||||
@@ -385,7 +405,11 @@ pub fn parse_data_section<'data>(
|
||||
environ.reserve_data_initializers(data.get_count())?;
|
||||
|
||||
for (index, entry) in data.into_iter().enumerate() {
|
||||
let Data { kind, data } = entry?;
|
||||
let Data {
|
||||
kind,
|
||||
data,
|
||||
range: _,
|
||||
} = entry?;
|
||||
match kind {
|
||||
DataKind::Active {
|
||||
memory_index,
|
||||
@@ -445,7 +469,14 @@ pub fn parse_name_section<'data>(
|
||||
}
|
||||
}
|
||||
wasmparser::Name::Local(_) => {}
|
||||
wasmparser::Name::Unknown { .. } => {}
|
||||
wasmparser::Name::Label(_)
|
||||
| wasmparser::Name::Type(_)
|
||||
| wasmparser::Name::Table(_)
|
||||
| wasmparser::Name::Memory(_)
|
||||
| wasmparser::Name::Global(_)
|
||||
| wasmparser::Name::Element(_)
|
||||
| wasmparser::Name::Data(_)
|
||||
| wasmparser::Name::Unknown { .. } => {}
|
||||
};
|
||||
}
|
||||
Ok(())
|
||||
|
||||
@@ -35,6 +35,10 @@ pub struct Features {
|
||||
pub memory64: bool,
|
||||
/// Wasm exceptions proposal should be enabled
|
||||
pub exceptions: bool,
|
||||
/// Relaxed SIMD proposal should be enabled
|
||||
pub relaxed_simd: bool,
|
||||
/// Extended constant expressions proposal should be enabled
|
||||
pub extended_const: bool,
|
||||
}
|
||||
|
||||
impl Features {
|
||||
@@ -55,6 +59,8 @@ impl Features {
|
||||
multi_memory: false,
|
||||
memory64: false,
|
||||
exceptions: false,
|
||||
relaxed_simd: false,
|
||||
extended_const: false,
|
||||
}
|
||||
}
|
||||
|
||||
@@ -257,6 +263,8 @@ mod test_features {
|
||||
multi_memory: false,
|
||||
memory64: false,
|
||||
exceptions: false,
|
||||
relaxed_simd: false,
|
||||
extended_const: false,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
@@ -91,6 +91,11 @@ impl Engine for DummyEngine {
|
||||
memory64: features.memory64,
|
||||
exceptions: features.exceptions,
|
||||
deterministic_only: false,
|
||||
extended_const: features.extended_const,
|
||||
relaxed_simd: features.relaxed_simd,
|
||||
mutable_global: true,
|
||||
saturating_float_to_int: true,
|
||||
sign_extension: true,
|
||||
};
|
||||
validator.wasm_features(wasm_features);
|
||||
validator
|
||||
|
||||
Reference in New Issue
Block a user