The Trunk: Exceptions-mtf.28.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Trunk: Exceptions-mtf.28.mcz

commits-2
Matthew Fulmer uploaded a new version of Exceptions to project The Trunk:
http://source.squeak.org/trunk/Exceptions-mtf.28.mcz

==================== Summary ====================

Name: Exceptions-mtf.28
Author: mtf
Time: 3 June 2010, 9:46:39.119 am
UUID: e317b25a-109f-492d-95e1-90d163e9d7bf
Ancestors: Exceptions-nice.27

Added the option to make error handlers be re-entrant, and made a test case for it. Depends on Kernel-mtf.455. The default behavior is completely unchanged.

This is needed for preserving Tweak island semantics in the presence of syncSends and error resignalling.

=============== Diff against Exceptions-nice.27 ===============

Item was added:
+ TestCase subclass: #ExceptionsTest
+ instanceVariableNames: ''
+ classVariableNames: ''
+ poolDictionaries: ''
+ category: 'Exceptions-Extensions'!

Item was added:
+ ----- Method: ExceptionsTest>>testHandlerReentrancy (in category 'as yet unclassified') -----
+ testHandlerReentrancy
+
+ | callingOrder |
+ "Handlers are not re-entrant by default, so inner is not activated twice"
+ callingOrder := String streamContents: [:stream |
+ [[stream nextPut: $s. Notification signal]
+
+ "Inner handler"
+ on: Notification do: [:ex |
+ stream nextPut: $i.
+ ex pass]]
+
+ "outer handler"
+ on: Notification do: [:ex |
+ stream nextPut: $o.
+ Notification signal]].
+
+ self assert: callingOrder = 'sio'.
+
+ "Now make inner re-entrant"
+ callingOrder := String streamContents: [:stream |
+ [[stream nextPut: $s. Notification signal]
+
+ "Inner handler"
+ on: Notification do: [:ex |
+ stream nextPut: $i.
+ ex rearmHandlerDuring: [ex pass]]]
+
+ "outer handler"
+ on: Notification do: [:ex |
+ stream nextPut: $o.
+ Notification signal]].
+
+ self assert: callingOrder = 'sioi'.!

Item was added:
+ ----- Method: Exception>>rearmHandlerDuring: (in category 'handling') -----
+ rearmHandlerDuring: aBlock
+ "Make the current error handler re-entrant while it is running aBlock. Only works in a closure-enabled image"
+
+ ^ handlerContext rearmHandlerDuring: aBlock!