Commit 7d4ece42 authored by Michael Starzinger's avatar Michael Starzinger Committed by Commit Bot

[wasm] Implement {StackEffect} for exception opcodes.

This adds missing cases for exception handling opcodes to the stack
effect helper {WasmDecoder::StackEffect}. It is a first step towards
adding exception handling support to the {WasmInterpreter}.

R=clemensh@chromium.org
BUG=v8:8091

Change-Id: Idacf440a894e5c71a180502c1d2f10fa15c8f5fa
Reviewed-on: https://chromium-review.googlesource.com/c/1425911
Commit-Queue: Michael Starzinger <mstarzinger@chromium.org>
Reviewed-by: 's avatarClemens Hammacher <clemensh@chromium.org>
Cr-Commit-Position: refs/heads/master@{#58995}
parent 71cb4777
......@@ -847,16 +847,23 @@ class WasmDecoder : public Decoder {
return true;
}
inline bool Validate(const byte* pc, ExceptionIndexImmediate<validate>& imm) {
inline bool Complete(const byte* pc, ExceptionIndexImmediate<validate>& imm) {
if (!VALIDATE(module_ != nullptr &&
imm.index < module_->exceptions.size())) {
errorf(pc + 1, "Invalid exception index: %u", imm.index);
return false;
}
imm.exception = &module_->exceptions[imm.index];
return true;
}
inline bool Validate(const byte* pc, ExceptionIndexImmediate<validate>& imm) {
if (!Complete(pc, imm)) {
errorf(pc + 1, "Invalid exception index: %u", imm.index);
return false;
}
return true;
}
inline bool Validate(const byte* pc, GlobalIndexImmediate<validate>& imm) {
if (!VALIDATE(module_ != nullptr && imm.index < module_->globals.size())) {
errorf(pc + 1, "invalid global index: %u", imm.index);
......@@ -1277,7 +1284,9 @@ class WasmDecoder : public Decoder {
case kExprBrIf:
case kExprBrTable:
case kExprIf:
case kExprRethrow:
return {1, 0};
case kExprCatch:
case kExprGetLocal:
case kExprGetGlobal:
case kExprI32Const:
......@@ -1299,11 +1308,19 @@ class WasmDecoder : public Decoder {
return {imm.sig->parameter_count() + 1,
imm.sig->return_count()};
}
case kExprThrow: {
ExceptionIndexImmediate<validate> imm(this, pc);
CHECK(Complete(pc, imm));
DCHECK_EQ(0, imm.exception->sig->return_count());
return {imm.exception->sig->parameter_count(), 0};
}
case kExprBr:
case kExprBlock:
case kExprLoop:
case kExprEnd:
case kExprElse:
case kExprTry:
case kExprBrOnExn:
case kExprNop:
case kExprReturn:
case kExprUnreachable:
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment