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