瀏覽代碼

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

Also adds a forgotten Wasm::Printer implementation for printing table
branch arguments.
Ali Mohammad Pur 4 年之前
父節點
當前提交
d2212a1f51

+ 5 - 4
Userland/Libraries/LibWasm/AbstractMachine/BytecodeInterpreter.cpp

@@ -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(): {

+ 6 - 1
Userland/Libraries/LibWasm/Printer/Printer.cpp

@@ -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); },