diff options
author | Soni L. <EnderMoneyMod@gmail.com> | 2024-10-08 16:01:10 -0300 |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-10-08 12:01:10 -0700 |
commit | 7fdccf7147e7c33e5a13a9c099bdafbc4d3d62e2 (patch) | |
tree | 66aeb37ded53618970af1152b55377722edf57ab | |
parent | b15a13ef84b5a12aadeb1200521a89a2c95dce19 (diff) | |
download | wabt-7fdccf7147e7c33e5a13a9c099bdafbc4d3d62e2.tar.gz wabt-7fdccf7147e7c33e5a13a9c099bdafbc4d3d62e2.tar.bz2 wabt-7fdccf7147e7c33e5a13a9c099bdafbc4d3d62e2.zip |
wasm-interp: Fix off-by-one in DoThrow (#2486)
-rw-r--r-- | src/interp/interp.cc | 3 | ||||
-rw-r--r-- | test/regress/interp-throw-before-try.txt | 19 |
2 files changed, 21 insertions, 1 deletions
diff --git a/src/interp/interp.cc b/src/interp/interp.cc index cb5623d8..fe333b42 100644 --- a/src/interp/interp.cc +++ b/src/interp/interp.cc @@ -2615,7 +2615,8 @@ RunResult Thread::DoThrow(Exception::Ptr exn) { auto iter = handlers.rbegin(); while (iter != handlers.rend()) { const HandlerDesc& handler = *iter; - if (pc >= handler.try_start_offset && pc < handler.try_end_offset) { + // pc points to the *next* instruction by the time we're in DoThrow. + if (pc > handler.try_start_offset && pc <= handler.try_end_offset) { // For a try-delegate, skip part of the traversal by directly going // up to an outer handler specified by the delegate depth. if (handler.kind == HandlerKind::Delegate) { diff --git a/test/regress/interp-throw-before-try.txt b/test/regress/interp-throw-before-try.txt new file mode 100644 index 00000000..69ea3001 --- /dev/null +++ b/test/regress/interp-throw-before-try.txt @@ -0,0 +1,19 @@ +;;; TOOL: run-interp-spec +;;; ARGS*: --enable-exceptions +(module + (tag $e0) + (func (export "throws") + (throw $e0) + (try $try + (do + ) + (catch $e0) + ) + ) +) + +(assert_exception (invoke "throws")) +(;; STDOUT ;;; +out/test/regress/interp-throw-before-try.txt:15: assert_exception passed +2/2 tests passed. +;;; STDOUT ;;) |