SignalSet.st
author claus
Tue, 16 May 1995 19:09:45 +0200
changeset 345 cf2301210c47
parent 259 a5c9efa2ac05
child 362 4131e87e79ec
permissions -rw-r--r--
.
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
"
a27a279701f8 Initial revision
claus
parents:
diff changeset
    12
a27a279701f8 Initial revision
claus
parents:
diff changeset
    13
IdentitySet subclass:#SignalSet
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    14
	 instanceVariableNames:''
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    15
	 classVariableNames:'SetOfAnySignal'
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    16
	 poolDictionaries:''
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    17
	 category:'Kernel-Exceptions'
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
SignalSet comment:'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    21
COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    22
	      All Rights Reserved
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    23
259
    24
$Header: /cvs/stx/stx/libbasic/SignalSet.st,v 1.10 1995-02-16 16:24:49 claus Exp $
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    25
'!
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    26
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    27
!SignalSet class methodsFor:'documentation'!
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    28
88
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    31
 COPYRIGHT (c) 1993 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    32
	      All Rights Reserved
88
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    33
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    41
!
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    42
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    44
"
259
    45
$Header: /cvs/stx/stx/libbasic/SignalSet.st,v 1.10 1995-02-16 16:24:49 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    47
!
81dacba7a63a *** empty log message ***
claus
parents: 71
diff changeset
    48
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    49
documentation
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    50
"
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    51
    SignalSet allows catching of multiple signals. A SignalSet consists of
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    52
    a number of signals and also implements the #handle:do: and #catch: methods
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    53
    just as signals do. 
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    54
    However, any signal from the SignalSet will, if signalled, lead into the handler.
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    55
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    56
    There is also a special signalSet, which can be used to catch any
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    57
    signal in the system - but this should no longer be used, since catching
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    58
    Object>>errorSignal has now the same effect.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
    60
    For more detail, see comment in Signal and examples in doc/coding.
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    61
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    62
    Notice: SignalSets are not needed when a group of children of a common signal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    63
    (such as arithmeticSignal) is to be handled; the parent signal of those will
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    64
    also handle all children.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    65
    Use signalSets if totally unrelated signals should be handled by one common
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    66
    handler.
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    67
"
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    68
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    69
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
!SignalSet class methodsFor:'instance creation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    71
a27a279701f8 Initial revision
claus
parents:
diff changeset
    72
anySignal
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    73
    "return a special signalSet for catching any signal.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    74
     Obsolete; use Object>>errorSignal for that purpose."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    75
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    76
    SetOfAnySignal isNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    77
	SetOfAnySignal := self basicNew
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    78
    ].
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
    79
    ^ SetOfAnySignal
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
    81
a27a279701f8 Initial revision
claus
parents:
diff changeset
    82
!SignalSet methodsFor:'save evaluation'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    83
a27a279701f8 Initial revision
claus
parents:
diff changeset
    84
handle:handleBlock do:aBlock
a27a279701f8 Initial revision
claus
parents:
diff changeset
    85
    "evaluate the argument, aBlock.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    86
     If any of the signals in the receiver is raised during evaluation,
a27a279701f8 Initial revision
claus
parents:
diff changeset
    87
     evaluate the handleBlock passing it an Exception argument.
a27a279701f8 Initial revision
claus
parents:
diff changeset
    88
     The handler may decide how to react to the signal by sending
a27a279701f8 Initial revision
claus
parents:
diff changeset
    89
     a corresponding message to the exception (see there).
a27a279701f8 Initial revision
claus
parents:
diff changeset
    90
     If the signal is not raised, return the value of evaluating
a27a279701f8 Initial revision
claus
parents:
diff changeset
    91
     aBlock."
a27a279701f8 Initial revision
claus
parents:
diff changeset
    92
a27a279701f8 Initial revision
claus
parents:
diff changeset
    93
     ^ aBlock value  "the real logic is in raise/Exception"
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    94
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    95
      "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    96
       SignalSet anySignal handle:[:ex |
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    97
	  ex errorString print. ' occured in: ' print. ex suspendedContext printNL.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
    98
	  ex return
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
    99
       ] do:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   100
	  (#(1 2 3 4) at:5) / 0.0
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   101
       ]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   102
      "
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   103
!
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   104
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   105
catch:aBlock
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   106
     "evaluate the argument, aBlock.
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   107
      If any of the signals in the receiver is raised during evaluation, 
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   108
      abort the evaluation and return true; otherwise return false. 
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   109
      With the special anySignal, evaluation can be performed totally save 
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   110
      from signals 
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   111
      - but who (beside radical c++ fans) would do that ?"
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   112
71
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   113
      |raiseOccurred|
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   114
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   115
      raiseOccurred := false.
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   116
      self handle:[:ex | raiseOccurred := true. ex return] do:aBlock.
a42874820e27 *** empty log message ***
claus
parents: 44
diff changeset
   117
      ^ raiseOccurred
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   118
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   119
      "
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   120
       SignalSet anySignal catch:[
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   121
	  (#(1 2 3 4) at:5) / 0.0
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   122
       ]
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   123
      "
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   124
!
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   125
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   126
ignore:aBlock
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   127
     "evaluate the argument, aBlock.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   128
      Ignore the receiver-signal during evaluation - i.e. simply
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   129
      continue. This makes only sense for some signals, such as UserInterrupt
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   130
      or AbortSignals, because continuing after an exception without any cleanup
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   131
      will often lead to followup-errors."
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   132
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   133
      ^ self handle:[:ex | ex proceed] do:aBlock.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   134
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   135
      "
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   136
       SignalSet anySignal ignore:[
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   137
	  123 size open   
95
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   138
       ]
d22739a0c6e9 *** empty log message ***
claus
parents: 88
diff changeset
   139
      "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   140
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   141
a27a279701f8 Initial revision
claus
parents:
diff changeset
   142
!SignalSet methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   143
159
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   144
accepts:aSignal
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   145
    "return true, if the receiver accepts the argument, aSignal.
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   146
     (i.e. if any of the receivers elements is aSignal or a parent of it).
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   147
     False otherwise. he special anySet accepts any signal."
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   148
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   149
    (self == SetOfAnySignal) ifTrue:[^ true].
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   150
    self do:[:sig | (sig accepts:aSignal) ifTrue:[^ true]].
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   151
    ^ false
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   152
!
514c749165c3 *** empty log message ***
claus
parents: 95
diff changeset
   153
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   154
includes:aSignal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   155
    "return true, if the receiver contains the argument, aSignal.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
     The special any-Set includes every signal."
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
44
b262907c93ea *** empty log message ***
claus
parents: 41
diff changeset
   158
    (self == SetOfAnySignal) ifTrue:[
259
   159
	^ aSignal isSignal
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   160
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   161
    ^ super includes:aSignal
a27a279701f8 Initial revision
claus
parents:
diff changeset
   162
! !