summaryrefslogtreecommitdiff
path: root/src/interp.cc
diff options
context:
space:
mode:
Diffstat (limited to 'src/interp.cc')
-rw-r--r--src/interp.cc21
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",