toit icon indicating copy to clipboard operation
toit copied to clipboard

A finally body should not be allowed to return

Open floitsch opened this issue 3 years ago • 4 comments

A finally block should not be allowed to eat exceptions. That means that it shouldn't be allowed to return, break, or continue.

floitsch avatar Jan 28 '22 11:01 floitsch

Note that we do exploit this in the kernel in https://github.com/toitware/toit

lask avatar Feb 15 '22 08:02 lask

I just did a quick survey to see how extensively this feature is used, and it is a lot less than I recall. In https://github.com/toitlang/toit we exploit this to implement catch: https://github.com/toitlang/toit/blob/d8749a7156684522d4167db74c2b6c94767d0f9f/lib/core/exceptions.toit#L131 and we use it in a couple of other places: https://github.com/toitlang/toit/blob/d8749a7156684522d4167db74c2b6c94767d0f9f/lib/expect.toit#L97 https://github.com/toitlang/toit/blob/d8749a7156684522d4167db74c2b6c94767d0f9f/lib/rpc/broker.toit#L105

In https://github.com/toitware/toit we only use it in a test: https://github.com/toitware/toit/blob/b4402bc0336f6a7e4e7c0764698b209a4e21ff9f/tools/wilson/tests/pubsub_test.toit#L65

lask avatar Feb 15 '22 08:02 lask

I can not access the linked repositories to see how the VM (and especially the kernel!) is actually implemented.

Any insights?

dumblob avatar Jun 27 '23 09:06 dumblob

@dumblob for the VM and its implementation have a look here: https://github.com/toitlang/toit

The toitware reference just links to a test that changes an exception in a finally to a return. That code is now deprecated. All the interesting code has been moved to the toitlang repository.

Here is the code:

test_pubsub_close_listen_ sub/pubsub.TemporarySubscription started/monitor.Latch closed/monitor.Latch -> int:
  received := 0
  started.set null
  try:
    sub.listen: | msg/pubsub.Message |
      received++
  finally: | is_exception exception |
    expect is_exception
    expect_equals pubsub.ERR_SUBSCRIPTION_CLOSED exception.value
    closed.set null
    return received

floitsch avatar Jun 27 '23 16:06 floitsch