SignalSet.st
author Stefan Vogel <sv@exept.de>
Tue, 28 Apr 2020 11:49:45 +0200
changeset 25367 e117c14e2800
parent 25355 abe090376550
permissions -rw-r--r--
#BUGFIX by stefan class: FileStream changed: #copy:into:bufferSize: #position #position: Linux: sendfile() fix.
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
     1
"{ Encoding: utf8 }"
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
     2
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     3
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
     4
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
     5
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     6
a27a279701f8 Initial revision
claus
parents:
diff changeset
     7
 This software is furnished under a license and may be used
a27a279701f8 Initial revision
claus
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
a27a279701f8 Initial revision
claus
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
a27a279701f8 Initial revision
claus
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
a27a279701f8 Initial revision
claus
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
 hereby transferred.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
"
5836
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
    14
"{ Package: 'stx:libbasic' }"
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
    15
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
    16
"{ NameSpace: Smalltalk }"
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
    17
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
IdentitySet subclass:#SignalSet
1275
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    19
	instanceVariableNames:''
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    20
	classVariableNames:''
1275
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    21
	poolDictionaries:''
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    22
	category:'Kernel-Exceptions'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    23
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    24
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    25
SignalSet subclass:#SetOfAnySignal
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    26
	instanceVariableNames:''
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    27
	classVariableNames:''
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    28
	poolDictionaries:''
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    29
	privateIn:SignalSet
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    30
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    31
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    32
SignalSet::SetOfAnySignal class instanceVariableNames:'theOneAndOnlyInstance'
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    33
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    34
"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    35
 No other class instance variables are inherited by this class.
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    36
"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    37
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    38
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    39
!SignalSet class methodsFor:'documentation'!
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    40
88
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    41
copyright
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    42
"
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    43
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    44
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    45
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    46
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    47
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    48
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    49
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    50
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    51
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    52
"
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    53
!
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    54
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    55
documentation
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    56
"
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    57
    SignalSet allows catching of multiple signals. A SignalSet consists of
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    58
    a number of signals and also implements the #handle:do: and #catch: methods
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    59
    just as signals do.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    60
    However, any signal from the SignalSet will, if signalled, lead into the handler.
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    61
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    62
    There is also a special signalSet, which can be used to catch any
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    63
    signal in the system - but this should no longer be used, since catching
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    64
    Object>>errorSignal has now the same effect.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    65
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    66
    For more detail, see comment in Signal and examples in doc/coding.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    67
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    68
    Notice: SignalSets are not needed when a group of children of a common signal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    69
    (such as arithmeticSignal) is to be handled; the parent signal of those will
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    70
    also handle all children.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    71
    Use signalSets if totally unrelated signals should be handled by one common
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    72
    handler.
1275
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    73
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    74
1292
89497fff7f87 documentation
Claus Gittinger <cg@exept.de>
parents: 1275
diff changeset
    75
    [author:]
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    76
	Claus Gittinger
1292
89497fff7f87 documentation
Claus Gittinger <cg@exept.de>
parents: 1275
diff changeset
    77
1275
2079f4776628 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 697
diff changeset
    78
    [see also:]
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    79
	Exception
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    80
	Signal QuerySignal
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    81
	Object
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    82
"
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    83
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
!SignalSet class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
anySignal
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    88
    "return a special signalSet for catching any signal.
2283
a1b388277558 commentary
Claus Gittinger <cg@exept.de>
parents: 1292
diff changeset
    89
     Questionable:
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    90
	you should use 'Object>>errorSignal' for that purpose;
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    91
	however, the anySignal-set also catches nonChilds of the ErrorSignal
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
    92
	(i.e. highly private, strange signals)."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
    94
    ^ SetOfAnySignal new
2283
a1b388277558 commentary
Claus Gittinger <cg@exept.de>
parents: 1292
diff changeset
    95
a1b388277558 commentary
Claus Gittinger <cg@exept.de>
parents: 1292
diff changeset
    96
    "Modified: 27.1.1997 / 20:31:08 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    97
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    98
23885
00e1469e8704 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23301
diff changeset
    99
5836
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
   100
!SignalSet methodsFor:'adding'!
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
   101
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   102
, anExceptionHandler
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   103
    "add anExceptionHandler to the set"
5836
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
   104
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   105
    self add:anExceptionHandler.
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   106
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   107
    "Modified: / 09-12-2019 / 11:09:05 / Stefan Vogel"
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   108
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   109
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   110
add:anExceptionHandler
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   111
    "Check, that only exceptionHandlers are added.
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   112
     Very bad (recursive) things may happen if e.g. #accepts: is called
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   113
     and raises a MessageNotUnderstood error."
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   114
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   115
    anExceptionHandler isNil ifTrue:[
25355
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   116
        "Ignore nil exceptionHandler - it may be due to a missing (not loaded) exception class"    
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   117
        ^ nil.
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   118
    ].
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   119
    anExceptionHandler isExceptionHandler ifFalse:[
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   120
        SignalError raiseWith:anExceptionHandler errorString:' - trying to add a non-exceptionHandler to a SignalSet'.
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   121
    ].
25355
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   122
"/ Debug code for Developers - should go into Lint:    
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   123
"/    (self accepts:anExceptionHandler) ifTrue:[
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   124
"/        "if already accepting, no need to add..." 
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   125
"/        self breakPoint:#SignalSet info:'Already accepted'.
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   126
"/        ^ anExceptionHandler.
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   127
"/    ].    
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   128
    ^ super add:anExceptionHandler.
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   129
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   130
   "
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   131
        SignalSet with:nil with:TimeoutError
25355
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   132
        SignalSet with:Error with:OsError
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   133
        Error, OsError
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   134
        SignalSet with:OsError with:Error
25089
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   135
   "
97cb83e058e2 #BUGFIX by stefan
Stefan Vogel <sv@exept.de>
parents: 23885
diff changeset
   136
25355
abe090376550 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 25089
diff changeset
   137
    "Modified (comment): / 05-04-2020 / 00:21:23 / Stefan Vogel"
5836
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
   138
! !
e8265b824b8f Add signals to SignalSets with #,
Stefan Vogel <sv@exept.de>
parents: 4547
diff changeset
   139
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   140
!SignalSet methodsFor:'queries'!
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   141
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   142
accepts:aSignalOrExceptionClass
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   143
    "return true, if the receiver accepts the argument, aSignal.
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   144
     (i.e. if any of the receiver's elements is aSignal or a parent of it).
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   145
     False otherwise."
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   146
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   147
    self do:[:eachExceptionHandler |
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   148
        (eachExceptionHandler==aSignalOrExceptionClass
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   149
         or:[eachExceptionHandler accepts:aSignalOrExceptionClass]) ifTrue:[^ true].
8681
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   150
    ].
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   151
    ^ false
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   152
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   153
    "Modified (format): / 28-08-2018 / 11:16:49 / Claus Gittinger"
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   154
!
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   155
8681
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   156
exceptionHandlerFor:anException in:aContext
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   157
    "answer the exceptionHandler for anException from aContext."
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   158
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   159
    ^ self
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   160
!
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   161
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   162
handlerForSignal:signal context:theContext originator:originator
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   163
    "answer the handler block for the signal from originator.
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   164
     The block is retrieved from aContext.
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   165
     Answer nil if the signal is not handled"
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   166
8699
ed6792665e78 Care for #answer:do: handlers. Must proceed.
Stefan Vogel <sv@exept.de>
parents: 8696
diff changeset
   167
    |selector arg|
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   168
8699
ed6792665e78 Care for #answer:do: handlers. Must proceed.
Stefan Vogel <sv@exept.de>
parents: 8696
diff changeset
   169
    selector := theContext selector.
ed6792665e78 Care for #answer:do: handlers. Must proceed.
Stefan Vogel <sv@exept.de>
parents: 8696
diff changeset
   170
    (selector ~~ #'handle:from:do:'
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   171
     or:[(theContext argAt:2) == originator]) ifTrue:[
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   172
	(self == signal or:[self accepts:signal]) ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   173
	    arg := theContext argAt:1.
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   174
	    selector == #answer:do: ifTrue:[
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   175
		^ [:ex| ex proceedWith:arg].
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   176
	    ] ifFalse:[
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   177
		^ arg ? [nil].
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   178
	    ].
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   179
	]
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   180
    ].
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   181
    ^ nil
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   182
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   183
    "Created: / 25.7.1999 / 23:46:48 / stefan"
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   184
!
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   185
4545
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   186
handlerProtectedBlock:doBlock inContext:context
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   187
    "set the handlerProtectedBlock in context"
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   188
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   189
    context selector == #handle:do: ifTrue:[
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   190
	context argAt:2 put:doBlock.
4545
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   191
    ] ifFalse:[context selector == #handle:from:do: ifTrue:[
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   192
	context argAt:3 put:doBlock.
4545
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   193
    ]].
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   194
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   195
    "
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   196
      SignalSet anySignal
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   197
	  handle:[:ex| ex restartDo:[55]] do:[1 // 0]
4545
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   198
    "
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   199
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   200
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   201
    "Created: / 25.7.1999 / 23:46:48 / stefan"
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   202
!
9671c4448040 Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4512
diff changeset
   203
8681
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   204
handles:anException
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   205
    "return true, if the receiver handles the argument, anException.
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   206
     (i.e. if any of the receiver's elements handles anException)."
4473
793078981f01 added #handlingSignalInContext:
Claus Gittinger <cg@exept.de>
parents: 4465
diff changeset
   207
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   208
    self do:[:eachExceptionHandler|
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   209
        (eachExceptionHandler handles:anException) ifTrue:[^ true]
8681
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   210
    ].
38aa963476a5 Support for Block>>#on:do:on:do:
Stefan Vogel <sv@exept.de>
parents: 6631
diff changeset
   211
    ^ false
4473
793078981f01 added #handlingSignalInContext:
Claus Gittinger <cg@exept.de>
parents: 4465
diff changeset
   212
!
793078981f01 added #handlingSignalInContext:
Claus Gittinger <cg@exept.de>
parents: 4465
diff changeset
   213
6631
5ffa1ce7b2cc #isExceptionCreator instead of #isSignal
Stefan Vogel <sv@exept.de>
parents: 6518
diff changeset
   214
isExceptionHandler
5ffa1ce7b2cc #isExceptionCreator instead of #isSignal
Stefan Vogel <sv@exept.de>
parents: 6518
diff changeset
   215
    "return true, if the receiver responds to the exception handler protocol,
5ffa1ce7b2cc #isExceptionCreator instead of #isSignal
Stefan Vogel <sv@exept.de>
parents: 6518
diff changeset
   216
     especially to the #accepts: and #handles: messages"
6518
3f00b9908c8f +isSignalOrSignalSet
Claus Gittinger <cg@exept.de>
parents: 6428
diff changeset
   217
3f00b9908c8f +isSignalOrSignalSet
Claus Gittinger <cg@exept.de>
parents: 6428
diff changeset
   218
    ^ true
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   219
! !
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   220
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   221
!SignalSet methodsFor:'save evaluation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
8689
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   223
answer:someAnswer do:aBlock
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   224
    "evaluate the argument, aBlock.
12063
06d27daa7280 changed: #answer:do:
Claus Gittinger <cg@exept.de>
parents: 11639
diff changeset
   225
     If the receiver is queried during evaluation, answer and proceed with someAnswer.
8689
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   226
     This is a wrapper for #handle:do: for lazy typists; no new functionality."
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   227
8696
fd361ae49596 #answer:do: must be returnable (see last change)
Stefan Vogel <sv@exept.de>
parents: 8689
diff changeset
   228
    <context: #return>
8689
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   229
    <exception: #handle>
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   230
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   231
    "/ thisContext markForHandle. -- same as above pragma
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   232
    ^ aBlock value.  "the real logic is in Exception>>doRaise"
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   233
!
1fe8db422f77 SignalSet implements #answer:do:
Stefan Vogel <sv@exept.de>
parents: 8681
diff changeset
   234
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   235
catch:aBlock
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   236
    "evaluate the argument, aBlock.
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   237
     If any of the signals in the receiver is raised during evaluation,
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   238
     abort the evaluation and return true; otherwise return false.
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   239
     With the special anySignal, evaluation can be performed totally save
9079
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   240
     from signals - but who (beside radical c++ fans) would do that ?"
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   241
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   242
    |raiseOccurred|
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   243
9079
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   244
    raiseOccurred := false.
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   245
    self handle:[:ex | raiseOccurred := true. ex return] do:aBlock.
1d9020d87c86 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 8699
diff changeset
   246
    ^ raiseOccurred
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   247
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   248
     "
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   249
      SignalSet anySignal catch:[
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   250
	 (#(1 2 3 4) at:5) / 0.0
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   251
      ]
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   252
     "
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   253
!
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   254
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   255
deferAfter:aBlock
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   256
    "evaluate the argument, aBlock.
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   257
     Ignore the receiver-signal during evaluation - i.e. simply continue,
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   258
     but remember if the signal was raised.
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   259
     After the block evaluation, finally raise the signal - if it was raised in the block.
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   260
     If the signal is raised multiple times, only the first raises parameter is remembered,
23885
00e1469e8704 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23301
diff changeset
   261
     and only a single raise is performed after the block's evaluation.
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   262
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   263
     Deferring makes sense for some signals, such as UserInterrupt or AbortSignal,
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   264
     which must occasionally be delayed temprarily until a save place is reached
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   265
     (especially when packages are sent across a communication channel, and you don't want
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   266
      partial packages to be generated by user interruptions)."
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   267
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   268
    |caughtException result|
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   269
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   270
    self handle:[:ex |
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   271
        caughtException isNil ifTrue:[
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   272
            caughtException := ex.
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   273
        ].
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   274
        ex proceedWith:nil
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   275
    ] do:[
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   276
        result := aBlock value.
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   277
    ].
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   278
    caughtException notNil ifTrue:[
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   279
        caughtException suspendedContext:thisContext.
6428
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   280
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   281
        "/ a signal was raised during the execution of aBlock above.
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   282
        "/ Raise it now (delayed).
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   283
        caughtException raiseSignal
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   284
    ].
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   285
    ^ result
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   286
6428
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   287
    "
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   288
     (UserInterrupt , AbortOperationRequest) deferAfter:[
20821
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   289
         Transcript showCR:'1 - now raising, but will be deferred.'.
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   290
         UserInterrupt raiseRequestWith:'hello'.
68508cd3a14a #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 20250
diff changeset
   291
         Transcript showCR:'2 - after the raise, deferred exception will be handled soon.'.
6428
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   292
     ].
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   293
     Transcript showCR:'3 - here after the protected block.'.
8c32b1beb8b4 better impl. of #deferAfter:
Claus Gittinger <cg@exept.de>
parents: 6396
diff changeset
   294
    "
23885
00e1469e8704 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23301
diff changeset
   295
00e1469e8704 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 23301
diff changeset
   296
    "Modified (comment): / 13-03-2019 / 10:28:12 / Claus Gittinger"
622
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   297
!
a17084b7ac06 checkin from browser
Claus Gittinger <cg@exept.de>
parents: 530
diff changeset
   298
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   299
handle:handleBlock do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
   300
    "evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   301
     If any of the signals in the receiver is raised during evaluation,
a27a279701f8 Initial revision
claus
parents:
diff changeset
   302
     evaluate the handleBlock passing it an Exception argument.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   303
     The handler may decide how to react to the signal by sending
a27a279701f8 Initial revision
claus
parents:
diff changeset
   304
     a corresponding message to the exception (see there).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   305
     If the signal is not raised, return the value of evaluating
a27a279701f8 Initial revision
claus
parents:
diff changeset
   306
     aBlock."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   307
4547
082a2f7d9d8e Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4545
diff changeset
   308
    <context: #return>
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   309
    <exception: #handle>
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   310
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   311
    "/ thisContext markForHandle. -- same as above pragma
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   312
    ^ aBlock value  "the real logic is in Exception>>doRaise"
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   313
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   314
    "
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   315
     SignalSet anySignal handle:[:ex |
20250
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   316
        ex errorString print. ' occurred in: ' print. ex suspendedContext printNL.
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   317
        ex return
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   318
     ] do:[
20250
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   319
        (#(1 2 3 4) at:5) / 0.0
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   320
     ]
4465
8dfbc6d6ccf3 Add example.
Stefan Vogel <sv@exept.de>
parents: 4464
diff changeset
   321
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   322
     SignalSet anySignal handle:[:ex |
20250
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   323
        ex errorString print. ' occurred in: ' print. ex suspendedContext printNL.
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   324
        self bar.
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   325
        ex return
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   326
     ] do:[
20250
514a91a6742f #OTHER by mawalch
mawalch
parents: 19445
diff changeset
   327
        (#(1 2 3 4) at:5) / 0.0
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   328
     ]
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   329
    "
3308
a6848d4b875d Comments
Stefan Vogel <sv@exept.de>
parents: 2284
diff changeset
   330
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   331
    "Modified: / 26.7.1999 / 00:03:13 / stefan"
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   332
!
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   333
362
claus
parents: 259
diff changeset
   334
handle:handleBlock from:anObject do:aBlock
claus
parents: 259
diff changeset
   335
    "evaluate the argument, aBlock.
claus
parents: 259
diff changeset
   336
     If any of the signals in the receiver is raised during evaluation,
claus
parents: 259
diff changeset
   337
     and the exception originated from anObject,
claus
parents: 259
diff changeset
   338
     evaluate the handleBlock passing it an Exception argument.
claus
parents: 259
diff changeset
   339
     The handler may decide how to react to the signal by sending
claus
parents: 259
diff changeset
   340
     a corresponding message to the exception (see there).
claus
parents: 259
diff changeset
   341
     If the signal is not raised, return the value of evaluating
claus
parents: 259
diff changeset
   342
     aBlock."
claus
parents: 259
diff changeset
   343
4547
082a2f7d9d8e Add #handlerProtectedBlock:inContext
Stefan Vogel <sv@exept.de>
parents: 4545
diff changeset
   344
    <context: #return>
4491
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   345
    <exception: #handle>
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   346
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   347
    "/ thisContext markForHandle. -- same as above pragma
5041cae5651c use new pragma to flag exception frames.
Claus Gittinger <cg@exept.de>
parents: 4486
diff changeset
   348
    ^ aBlock value  "the real logic is in Exception>>doRaise"
3308
a6848d4b875d Comments
Stefan Vogel <sv@exept.de>
parents: 2284
diff changeset
   349
4464
cec93c942c14 Use context flag for exception handling instead of searching for
Stefan Vogel <sv@exept.de>
parents: 3311
diff changeset
   350
    "Modified: / 26.7.1999 / 00:03:06 / stefan"
362
claus
parents: 259
diff changeset
   351
!
claus
parents: 259
diff changeset
   352
2284
8b29d42bb03d oops - renamed #ignore: to #ignoreIn:
Claus Gittinger <cg@exept.de>
parents: 2283
diff changeset
   353
ignoreIn:aBlock
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   354
    "evaluate the argument, aBlock.
21854
499d79927278 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21566
diff changeset
   355
     Ignore any signal from the receiver during evaluation - i.e. simply continue with the default resume value. 
499d79927278 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21566
diff changeset
   356
     This makes only sense for some signals, such as UserInterrupt
21566
6155a813c686 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 20821
diff changeset
   357
     or AbortOperationRequest, because continuing after an exception without any cleanup
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   358
     will often lead to followup-errors."
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   359
21854
499d79927278 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21566
diff changeset
   360
     ^ self handle:[:ex | ex proceed] do:aBlock.
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   361
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   362
     "
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   363
      SignalSet anySignal ignoreIn:[
21566
6155a813c686 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 20821
diff changeset
   364
         123 size open
6396
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   365
      ]
74d5b0b588a6 added deferAfter: - defer exceptions until some later time
Claus Gittinger <cg@exept.de>
parents: 5836
diff changeset
   366
     "
2284
8b29d42bb03d oops - renamed #ignore: to #ignoreIn:
Claus Gittinger <cg@exept.de>
parents: 2283
diff changeset
   367
21566
6155a813c686 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 20821
diff changeset
   368
    "Created: / 27-01-1997 / 20:32:50 / cg"
6155a813c686 #DOCUMENTATION by stefan
Stefan Vogel <sv@exept.de>
parents: 20821
diff changeset
   369
    "Modified (comment): / 24-02-2017 / 11:15:59 / stefan"
21854
499d79927278 #OTHER by cg
Claus Gittinger <cg@exept.de>
parents: 21566
diff changeset
   370
    "Modified (comment): / 20-06-2017 / 13:35:43 / cg"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   371
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   372
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   373
!SignalSet::SetOfAnySignal class methodsFor:'instance creation'!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   374
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   375
flushSingleton
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   376
    "flushes the cached singleton"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   377
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   378
    theOneAndOnlyInstance := nil
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   379
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   380
    "
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   381
     self flushSingleton
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   382
    "
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   383
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   384
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   385
new
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   386
    "returns a singleton"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   387
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   388
    ^ self theOneAndOnlyInstance.
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   389
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   390
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   391
theOneAndOnlyInstance
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   392
    "returns a singleton"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   393
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   394
    theOneAndOnlyInstance isNil ifTrue:[
16562
Claus Gittinger <cg@exept.de>
parents: 15064
diff changeset
   395
	theOneAndOnlyInstance := self basicNew initialize.
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   396
    ].
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   397
    ^ theOneAndOnlyInstance.
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   398
! !
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   399
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   400
!SignalSet::SetOfAnySignal methodsFor:'blocked methods'!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   401
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   402
add:anElement
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   403
    "do not allow to add anything"
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   404
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   405
    ^ self shouldNotImplement
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   406
! !
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   407
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   408
!SignalSet::SetOfAnySignal methodsFor:'queries'!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   409
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   410
accepts:aSignalOrExceptionClass
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   411
    "return true, if the receiver accepts the argument, aSignal.
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   412
     (i.e. if any of the receiver's elements is aSignal or a parent of it).
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   413
     False otherwise. I, the special SetOfAnySignal accepts any (non-query) signal."
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   414
23301
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   415
    ^ aSignalOrExceptionClass isExceptionHandler and:[aSignalOrExceptionClass isQuerySignal not]
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   416
8398e16b2f7e #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 21854
diff changeset
   417
    "Modified (format): / 28-08-2018 / 11:16:55 / Claus Gittinger"
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   418
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   419
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   420
handles:anException
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   421
    "return true, if the receiver handles the argument, anException.
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   422
     (i.e. if any of the receiver's elements handles anException).
15064
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   423
     I, the special SetOfAnySignal handle any (non-query) signal."
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   424
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   425
    ^ anException isNotification not
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   426
!
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   427
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   428
includes:anExceptionHandler
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   429
    "return true, if the receiver contains the argument, anExceptionHandler.
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   430
     I, the special SetOfAnySignal include any (non-query) ExceptionHandler."
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   431
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   432
    ^ anExceptionHandler isExceptionHandler and:[anExceptionHandler isQuerySignal not]
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   433
! !
f721092a3c66 class: SignalSet
Stefan Vogel <sv@exept.de>
parents: 12063
diff changeset
   434
696
d11342e8b7ad checkin from browser
Claus Gittinger <cg@exept.de>
parents: 622
diff changeset
   435
!SignalSet class methodsFor:'documentation'!
d11342e8b7ad checkin from browser
Claus Gittinger <cg@exept.de>
parents: 622
diff changeset
   436
d11342e8b7ad checkin from browser
Claus Gittinger <cg@exept.de>
parents: 622
diff changeset
   437
version
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   438
    ^ '$Header$'
12063
06d27daa7280 changed: #answer:do:
Claus Gittinger <cg@exept.de>
parents: 11639
diff changeset
   439
!
06d27daa7280 changed: #answer:do:
Claus Gittinger <cg@exept.de>
parents: 11639
diff changeset
   440
06d27daa7280 changed: #answer:do:
Claus Gittinger <cg@exept.de>
parents: 11639
diff changeset
   441
version_CVS
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   442
    ^ '$Header$'
696
d11342e8b7ad checkin from browser
Claus Gittinger <cg@exept.de>
parents: 622
diff changeset
   443
! !
19445
d103fd253688 #DOCUMENTATION
Claus Gittinger <cg@exept.de>
parents: 16562
diff changeset
   444