diff options
Diffstat (limited to 'src/interp.cc')
-rw-r--r-- | src/interp.cc | 21 |
1 files changed, 10 insertions, 11 deletions
diff --git a/src/interp.cc b/src/interp.cc index 1125247c..bca8de7a 100644 --- a/src/interp.cc +++ b/src/interp.cc @@ -647,10 +647,10 @@ inline Opcode ReadOpcode(const uint8_t** pc) { inline void read_table_entry_at(const uint8_t* pc, IstreamOffset* out_offset, uint32_t* out_drop, - uint8_t* out_keep) { + uint32_t* out_keep) { *out_offset = ReadU32At(pc + WABT_TABLE_ENTRY_OFFSET_OFFSET); *out_drop = ReadU32At(pc + WABT_TABLE_ENTRY_DROP_OFFSET); - *out_keep = ReadU8At(pc + WABT_TABLE_ENTRY_KEEP_OFFSET); + *out_keep = ReadU32At(pc + WABT_TABLE_ENTRY_KEEP_OFFSET); } Memory* Thread::ReadMemory(const uint8_t** pc) { @@ -728,10 +728,9 @@ ValueTypeRep<T> Thread::PopRep() { return GetValue<T>(Pop()); } -void Thread::DropKeep(uint32_t drop_count, uint8_t keep_count) { - assert(keep_count <= 1); - if (keep_count == 1) { - Pick(drop_count + 1) = Top(); +void Thread::DropKeep(uint32_t drop_count, uint32_t keep_count) { + for (uint32_t i = 0; i < keep_count; ++i) { + Pick(drop_count + i + 1) = Pick(i + 1); } value_stack_top_ -= drop_count; } @@ -1474,7 +1473,7 @@ Result Thread::Run(int num_instructions) { const uint8_t* entry = istream + table_offset + key_offset; IstreamOffset new_pc; uint32_t drop_count; - uint8_t keep_count; + uint32_t keep_count; read_table_entry_at(entry, &new_pc, &drop_count, &keep_count); DropKeep(drop_count, keep_count); GOTO(new_pc); @@ -2389,7 +2388,7 @@ Result Thread::Run(int num_instructions) { case Opcode::InterpDropKeep: { uint32_t drop_count = ReadU32(&pc); - uint8_t keep_count = *pc++; + uint32_t keep_count = ReadU32(&pc); DropKeep(drop_count, keep_count); break; } @@ -3610,7 +3609,7 @@ void Thread::Trace(Stream* stream) { case Opcode::InterpDropKeep: stream->Writef("%s $%u $%u\n", opcode.GetName(), ReadU32At(pc), - *(pc + 4)); + ReadU32At(pc + 4)); break; case Opcode::V128Const: { @@ -4366,7 +4365,7 @@ void Environment::Disassemble(Stream* stream, case Opcode::InterpDropKeep: { uint32_t drop = ReadU32(&pc); - uint8_t keep = *pc++; + uint32_t keep = ReadU32(&pc); stream->Writef("%s $%u $%u\n", opcode.GetName(), drop, keep); break; } @@ -4382,7 +4381,7 @@ void Environment::Disassemble(Stream* stream, stream->Writef("%4" PRIzd "| ", pc - istream); IstreamOffset offset; uint32_t drop; - uint8_t keep; + uint32_t keep; read_table_entry_at(pc, &offset, &drop, &keep); stream->Writef(" entry %" PRIindex ": offset: %u drop: %u keep: %u\n", |