diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-06-17 16:22:36 +0100 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-06-17 16:22:36 +0100 |
commit | fe8e92e1a8bb3079a9f13e007022536836bd6b58 (patch) | |
tree | 815a009037aa6d7d9ae085450f1e928e49e46361 /src | |
parent | 6fdd9dd2137a563bc41a85cf45178cc734e499a2 (diff) | |
download | binaryen-fe8e92e1a8bb3079a9f13e007022536836bd6b58.tar.gz binaryen-fe8e92e1a8bb3079a9f13e007022536836bd6b58.tar.bz2 binaryen-fe8e92e1a8bb3079a9f13e007022536836bd6b58.zip |
fix interpreter on indirect calls, do arguments before checking and doing the call (they might flow)
Diffstat (limited to 'src')
-rw-r--r-- | src/wasm-interpreter.h | 6 |
1 files changed, 3 insertions, 3 deletions
diff --git a/src/wasm-interpreter.h b/src/wasm-interpreter.h index 9024031d2..66aa2e625 100644 --- a/src/wasm-interpreter.h +++ b/src/wasm-interpreter.h @@ -351,14 +351,14 @@ private: NOTE_ENTER("CallIndirect"); Flow target = visit(curr->target); if (target.breaking()) return target; + LiteralList arguments; + Flow flow = generateArguments(curr->operands, arguments); + if (flow.breaking()) return flow; size_t index = target.value.geti32(); if (index >= instance.wasm.table.names.size()) trap("callIndirect: overflow"); Name name = instance.wasm.table.names[index]; Function *func = instance.wasm.getFunction(name); if (func->type.is() && func->type != curr->fullType) trap("callIndirect: bad type"); - LiteralList arguments; - Flow flow = generateArguments(curr->operands, arguments); - if (flow.breaking()) return flow; if (func->params.size() != arguments.size()) trap("callIndirect: bad # of arguments"); for (size_t i = 0; i < func->getNumLocals(); i++) { if (func->params[i] != arguments[i].type) trap("callIndirect: bad argument type"); |