mirror of
https://github.com/RGBCube/serenity
synced 2025-05-31 00:08:11 +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:
parent
f5d4e26ff7
commit
d2212a1f51
2 changed files with 11 additions and 5 deletions
|
@ -617,10 +617,11 @@ void BytecodeInterpreter::interpret(Configuration& configuration, InstructionPoi
|
||||||
TRAP_IF_NOT(entry.has<Value>());
|
TRAP_IF_NOT(entry.has<Value>());
|
||||||
auto maybe_i = entry.get<Value>().to<i32>();
|
auto maybe_i = entry.get<Value>().to<i32>();
|
||||||
TRAP_IF_NOT(maybe_i.has_value());
|
TRAP_IF_NOT(maybe_i.has_value());
|
||||||
TRAP_IF_NOT(maybe_i.value() >= 0);
|
if (0 <= *maybe_i) {
|
||||||
size_t i = *maybe_i;
|
size_t i = *maybe_i;
|
||||||
if (i < arguments.labels.size())
|
if (i < arguments.labels.size())
|
||||||
return branch_to_label(configuration, arguments.labels[i]);
|
return branch_to_label(configuration, arguments.labels[i]);
|
||||||
|
}
|
||||||
return branch_to_label(configuration, arguments.default_);
|
return branch_to_label(configuration, arguments.default_);
|
||||||
}
|
}
|
||||||
case Instructions::call.value(): {
|
case Instructions::call.value(): {
|
||||||
|
|
|
@ -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::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::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::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::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()); },
|
[&](Instruction::TableTableArgs const& args) { print("(table_table (table index {}) (table index {}))", args.lhs.value(), args.rhs.value()); },
|
||||||
[&](ValueType const& type) { print(type); },
|
[&](ValueType const& type) { print(type); },
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue