[Cuis-dev] On the changes to detect method returns in exception handlers

Juan Vuletich juan at jvuletich.org
Thu Oct 17 10:08:35 PDT 2019


Hi Phil,

On 10/17/2019 2:31 AM, Phil B wrote:
> Juan,
>
> First, thanks for looking at the OMeta part of this... I really wasn't 
> expecting it.  I was mentioning more as an FYI in case you had 
> expected the changes not to have functional/performance impact.  That 
> said, the help is greatly appreciated!

:)

>
> On Wed, Oct 16, 2019 at 7:05 PM Juan Vuletich <juan at jvuletich.org 
> <mailto:juan at jvuletich.org>> wrote:
>
>     Hi Phil,
>
>     Today I tried to understand the problems you ran into. The
>     attachments are the result of this. To try this, Start Cuis
>     without the recent changes (i.e. #3866), then load
>     OMeta2Tests.pck.st <http://OMeta2Tests.pck.st>. Now load
>     OMetaStuff*.cs.st <http://cs.st> and
>     UnsavedChangesTo-OMeta2Extensions*.cs.st <http://cs.st> attached
>     here. Your tests now pass, and performance seems as usual. I
>     suggest updating your repo with this.
>
>     My changes do two things. One is to avoid non local returns in
>     handler blocks. The other one is about a few places where you did
>     [ :exception | exception signal ] as the signal handler.
>     Exceptions can only be signaled once! I changed them to do [
>     :exception | exception pass ]. This was breaking the exception
>     system if the recent changes were loaded.
>
>
> 1) Would you be opposed to a #nonLocalReturn: method on Exception?  
> That seems to me a cleaner and clearer way of doing this.  It's also 
> more consistent with how Exception deals with the other scenarios.

I think #nonLocalReturn: would be ok. Maybe a better name could be 
#methodReturn:

> 2) Doh!  I'm not sure if I did the double-signaling or if that was 
> from the original OMeta code.  Either way, it was a dumb thing to do 
> and entirely unnecessary in this case as your changes show.  The 'only 
> signaled once!' part warrants discussion/clarification...
>
>
>     Finally, I suggest adding yet another change set to Cuis that
>     could break existing but wrong code: 3924*.cs.st <http://cs.st>
>     attached throws an error if an exception is signaled twice.
>
>
> I guess it depends on what you are saying:
>
> 1) We think signaling twice is bad form and logically inconsistent and 
> so you shouldn't do it (to me that's not an error, but is something we 
> should capture and *optionally* report to the user... I'm working on 
> another email/changeset related to this case.)
>
> 2) In Cuis, for implementation reasons, signaling twice is an error 
> and can not be done (define twice... read on...)
>
> While what you are saying re: not re-signaling logically makes sense 
> as something to avoid in general, I don't see anything in the ANSI 
> spec explicitly either allowing or forbidding it.[SPEC]  That's not a 
> big deal as sometimes implementation decisions need to be made but I 
> think we need to be very clear here on what is/isn't allowed:
>
> 1) You can't signal the exception from within its handler block (i.e. 
> you can signal the exception again and/or recycle it, but only *after* 
> the current signal has been handled)
>
> 2) You can't re-signal an Exception ever (i.e. you can recycle but not 
> re-signal... meaning we need to have a method to clear out relevant 
> state for recycling)
>
> 3) You can't re-signal or recycle an Exception ever (i.e. they are 
> single-shot instances)
>
> (However we go, it seems like comments on the class and relevant 
> methods are in order)
>
> Seriously, I didn't just make this up.... recycling is a real use 
> case.  If you read my final note on 
> https://github.com/pbella/OMeta-Cuis, the 'original' OMeta 
> implementation actually did recycle exceptions as a performance 
> enhancement.  It did this by re-signaling the existing instance since 
> there was no formal mechanism for recycling.  I removed the feature 
> due to the implementation leaking (on the OMeta side not the Exception 
> side, IIRC) and had planned to re-implement it (sans leak) at some 
> point.  So I'm wondering if that is something that is supported or not.

I'm pretty sure re-signaling an exception instance while it is being 
handled shouldn't be allowed. An exception has a (single) signalContext. 
The design can't handle more than one.

To enable re-signaling an already handled exception instance, I guess it 
could be enough to clear ivar 'signalContext' in the ifCurtailed: block 
in #evaluateHandlerBlock: . Then, 
3924-SignalExceptionsOnlyOnce-JuanVuletich-2019Oct16-18h52m-jmv.1.cs.st 
would stay.

>
> This is all near and dear to me because, as you probably noticed, 
> Exception is the spine of OMeta's control flow.  If you change/break 
> one, you probably change/break the other.

Yep. It is a good test bed.
>
>
>     Please review.
>     Thanks,
>
>     -- 
>     Juan Vuletich
>
>
> Thanks,
> Phil
>
> [SPEC] Just to clarify what I mean here.  In section 5.5.4.2 they 
> explicitly state in the Errors section where #outer cannot be sent 
> from.  If they intended #signal to not be called from somewhere in 
> particular, I would expect (ok, hope) to see that indicated somewhere 
> for #signal as well.  Of course specs aren't perfect and there are any 
> number of reasons why this might not have been stated one way or the 
> other.

I'm pretty sure it was an oversight. Doing [ :ex | ex signal ] as a 
handler block is asking for trouble. How can you know it will not try to 
handle the new signal with the same handler, entering in an endless 
recursion?

Thanks,

-- 
Juan Vuletich
www.cuis-smalltalk.org
https://github.com/Cuis-Smalltalk/Cuis-Smalltalk-Dev
https://github.com/jvuletich
https://www.linkedin.com/in/juan-vuletich-75611b3
@JuanVuletich

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.cuis.st/mailman/archives/cuis-dev/attachments/20191017/00b5f71a/attachment.htm>


More information about the Cuis-dev mailing list