Skip to content

Commit 38fd88e

Browse files
Fix br_if validation of dead code (bytecodealliance#80)
* Fix br_if validation of dead code * Update crates/wasmparser/src/operators_validator.rs Co-authored-by: Nick Fitzgerald <fitzgen@gmail.com> * remove i32 even for polystack Co-authored-by: Nick Fitzgerald <fitzgen@gmail.com>
1 parent 60fafc3 commit 38fd88e

1 file changed

Lines changed: 9 additions & 3 deletions

File tree

crates/wasmparser/src/operators_validator.rs

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -229,9 +229,16 @@ impl FuncState {
229229
let types = self.block_at(depth).return_types.clone();
230230
let last_block = self.blocks.last_mut().unwrap();
231231
let keep = last_block.stack_starts_at;
232+
if keep + types.len() <= self.stack_types.len() {
233+
// Have enough operands on stack, validation is done at `check_jump_from_block`.
234+
return Ok(());
235+
}
236+
let polymorphic_values_used = keep + types.len() - self.stack_types.len();
232237
self.stack_types.truncate(keep);
233238
self.stack_types.extend_from_slice(&types);
234-
last_block.polymorphic_values = None;
239+
// Keep polymorphic stack.
240+
let polymorphic_values = last_block.polymorphic_values.as_mut().unwrap();
241+
*polymorphic_values = polymorphic_values.saturating_sub(polymorphic_values_used);
235242
Ok(())
236243
}
237244
fn change_frame_after_select(&mut self, ty: Option<Type>) -> OperatorValidatorResult<()> {
@@ -839,11 +846,10 @@ impl OperatorValidator {
839846
Operator::BrIf { relative_depth } => {
840847
self.check_operands_1(Type::I32)?;
841848
self.check_jump_from_block(relative_depth, 1)?;
849+
self.func_state.change_frame(1)?;
842850
if self.func_state.last_block().is_stack_polymorphic() {
843851
self.func_state
844852
.change_frame_to_exact_types_from(relative_depth as usize)?;
845-
} else {
846-
self.func_state.change_frame(1)?;
847853
}
848854
}
849855
Operator::BrTable { ref table } => {

0 commit comments

Comments
 (0)