1
Fork 0
mirror of https://github.com/RGBCube/serenity synced 2025-05-31 03:58:12 +00:00

LibWasm: Jump to the default label in br_table with negative values

Also adds a forgotten Wasm::Printer implementation for printing table
branch arguments.
This commit is contained in:
Ali Mohammad Pur 2021-07-06 13:01:28 +04:30 committed by Ali Mohammad Pur
parent f5d4e26ff7
commit d2212a1f51
2 changed files with 11 additions and 5 deletions

View file

@ -617,10 +617,11 @@ void BytecodeInterpreter::interpret(Configuration& configuration, InstructionPoi
TRAP_IF_NOT(entry.has<Value>());
auto maybe_i = entry.get<Value>().to<i32>();
TRAP_IF_NOT(maybe_i.has_value());
TRAP_IF_NOT(maybe_i.value() >= 0);
size_t i = *maybe_i;
if (i < arguments.labels.size())
return branch_to_label(configuration, arguments.labels[i]);
if (0 <= *maybe_i) {
size_t i = *maybe_i;
if (i < arguments.labels.size())
return branch_to_label(configuration, arguments.labels[i]);
}
return branch_to_label(configuration, arguments.default_);
}
case Instructions::call.value(): {

View file

@ -435,7 +435,12 @@ void Printer::print(Wasm::Instruction const& instruction)
[&](Instruction::IndirectCallArgs const& args) { print("(indirect (type index {}) (table index {}))", args.type.value(), args.table.value()); },
[&](Instruction::MemoryArgument const& args) { print("(memory (align {}) (offset {}))", args.align, args.offset); },
[&](Instruction::StructuredInstructionArgs const& args) { print("(structured (else {}) (end {}))", args.else_ip.has_value() ? String::number(args.else_ip->value()) : "(none)", args.end_ip.value()); },
[&](Instruction::TableBranchArgs const&) { print("(table_branch ...)"); },
[&](Instruction::TableBranchArgs const& args) {
print("(table_branch");
for (auto& label : args.labels)
print(" (label {})", label.value());
print(" (label {}))", args.default_.value());
},
[&](Instruction::TableElementArgs const& args) { print("(table_element (table index {}) (element index {}))", args.table_index.value(), args.element_index.value()); },
[&](Instruction::TableTableArgs const& args) { print("(table_table (table index {}) (table index {}))", args.lhs.value(), args.rhs.value()); },
[&](ValueType const& type) { print(type); },