Skip to content

Commit

Permalink
Clarify delegate targetting function-level block
Browse files Browse the repository at this point in the history
This clarifies that `delegate` can target the function-level block,
which means the exception is thrown to the caller. Also added a few more
examples.

AFAIK this is consistent with the current implementations in the
toolchain, V8, and Spidermonkey.

Fixes WebAssembly#176.
  • Loading branch information
aheejin committed Jul 16, 2021
1 parent 9fda8b6 commit 232b666
Showing 1 changed file with 34 additions and 2 deletions.
36 changes: 34 additions & 2 deletions proposals/exception-handling/Exceptions.md
Original file line number Diff line number Diff line change
Expand Up @@ -288,8 +288,7 @@ end
If `call $foo` throws, searching for a catching block first finds `delegate`,
and because it delegates exception handling to catching instructions associated
with `$l1`, it will be next checked by the outer `catch` and then `catch_all`
instructions. When the specified label within a `delegate` instruction does not
correspond to a `try` instruction, it is a validation failure.
instructions.

Note that the example below is a validation failure:
```
Expand All @@ -311,6 +310,39 @@ catching instructions (`catch`/`catch_all`/`delegate`) come after the
same as if the `try` has catches but none of the catches are able to handle the
exception.

If `delegate`'s immediate argument is the depth of block-like structures
(blocks, loops, and trys) + 1, i.e., the function-level block, it is considered
to be delegating the exception to the caller of the current function. For
example:
```
try $l1
try
call $foo
delegate 1 ;; delegate to the caller
catch
...
catch_all
...
end
```
In case `foo` throws, `delegate 1` here delegates the exception handling to the
caller, i.e., the exception escapes the current function.

When the specified label within a `delegate` instruction does not correspond to
a `try` instruction or the function-level, it is a validation failure:
```
block $l0
loop $l1
try
call $foo
delegate $l0 ;; targets a 'block', validation failure
try
call $foo
delegate $l1 ;; targets a 'loop', validation failure
end
end
```

### JS API

#### Stack traces
Expand Down

0 comments on commit 232b666

Please sign in to comment.