ProtoObject.st
author Claus Gittinger <cg@exept.de>
Fri, 29 Aug 2003 21:16:52 +0200
changeset 7587 89864caa2665
parent 6912 d2e78827a065
child 7659 4def16a2e6e1
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
6844
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     1
"{ Package: 'stx:libbasic' }"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     2
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
nil subclass:#ProtoObject
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
	instanceVariableNames:''
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
	classVariableNames:''
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
	poolDictionaries:''
6912
d2e78827a065 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 6911
diff changeset
     7
	category:'Kernel-Objects'
6844
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
!ProtoObject class methodsFor:'documentation'!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
documentation
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
    a minimum object without much protocol;
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
    provides the minimum required to prevent inspectors from
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
    crashing.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
    Named after a similar class found in Dolphin-Smalltalk.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
    [author:]
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
        Claus Gittinger (not much authoring, though)
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
! !
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
!ProtoObject methodsFor:'error handling'!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
doesNotUnderstand:aMessage
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
    "this message is sent by the runtime system (VM) when
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
     a message is not understood by some object (i.e. there
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
     is no method for that selector). The original message has
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
     been packed into aMessage (i.e. the receiver, selector and
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
     any arguments) and the original receiver is then sent the
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
     #doesNotUnderstand: message.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
     Here, we raise another signal which usually enters the debugger.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
     You can of course redefine #doesNotUnderstand: in your classes
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
     to implement message delegation, 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
     or handle the MessageNotUnderstoodSignal gracefully."
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
    <context: #return>
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
    |sel selStr errorString cls|
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
    sel := aMessage selector.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    selStr := sel printString.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    "/ Although sel should always be a symbol,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    "/ always use printStrings in the code below.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    "/ Non-symbol selector may happen when things go mad in a primitive, 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    48
    "/ or a method has been called by valueWithReceiver: with a wrong arg.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    49
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    50
    "/ handle the case of an error during early startup
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
    "/ (output streams not yet initialized)
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
    Stdout isNil ifTrue:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        Smalltalk fatalAbort:'error during init: ' , selStr , ' not understood'.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
    ].
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
    "/ extract the class that should have implemented the message.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
    "/ (in case of a super-send, this is not the receivers class)
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    60
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    61
    cls := thisContext sender searchClass.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    62
    cls isNil ifTrue:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
        "it was NOT a super or directed send ..."
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
        cls := self class
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
    ].
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
    cls notNil ifTrue:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
        "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
        "/ displayString is better than 'cls name',
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
        "/ since it appends (obsolete) for outdated classes.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
        "/ (this happens if you send messages to old instances
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
        "/  after changing a classes definition)
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
        "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
        errorString := cls displayString.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
    ] ifFalse:[    
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
        errorString := '(** nil-class **)'
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
    ].
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
    sel class ~~ Symbol ifTrue:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    79
        errorString := errorString , ' nonSymbol selector: ' , selStr , ' not understood'.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    80
    ] ifFalse:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    81
        errorString := errorString , ' does not understand: ' , selStr.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    82
    ].
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    83
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    84
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    85
    "/ this only happens, when YOU play around with my classvars ...
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    86
    "/ (or an error occurs during very early startup, when signals are not yet set)
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    87
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    88
    MessageNotUnderstood isNil ifTrue:[
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    89
        ^ MiniDebugger 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    90
            enterWithMessage:'oops - MessageNotUnderstoodSignal is gone (nil)'
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    91
            mayProceed:true.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    92
    ].
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    93
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    94
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    95
    "/ thats where we end up normally - raise a signal which (if unhandled) opens a debugger
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    96
    "/
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    97
    ^ MessageNotUnderstood
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    98
                raiseRequestWith:aMessage
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    99
                errorString:errorString
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   100
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   101
    "Modified: / 9.6.1999 / 17:46:17 / cg"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   102
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   103
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   104
*** WARNING
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   105
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   106
*** this method has been automatically created,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   107
*** since all nil-subclasses should respond to some minimum required
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   108
*** protocol.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   109
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   110
*** Inspection and/or debugging of instances may not be possible,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   111
*** if you remove/change this method. 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   112
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   113
! !
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   114
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   115
!ProtoObject methodsFor:'queries'!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   116
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   117
class
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   118
    "return the receivers class"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   119
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   120
%{  /* NOCONTEXT */
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   121
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   122
    RETURN ( __Class(self) );
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   123
%}
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   124
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   125
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   126
*** WARNING
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   127
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   128
*** this method has been automatically created,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   129
*** since all nil-subclasses should respond to some minimum required
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   130
*** protocol.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   131
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   132
*** Inspection and/or debugging of instances may not be possible,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   133
*** if you remove/change this method. 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   134
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   135
! !
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   136
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   137
!ProtoObject methodsFor:'testing'!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   138
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   139
isBehavior
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   140
    "return true, if the receiver is some kind of class (i.e. behavior);
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   141
     false is returned here - the method is only redefined in Behavior."
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   142
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   143
    ^ false
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   144
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   145
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
*** WARNING
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
*** this method has been automatically created,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   149
*** since all nil-subclasses should respond to some minimum required
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   150
*** protocol.
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   151
***
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
*** Inspection and/or debugging of instances may not be possible,
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
*** if you remove/change this method. 
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
"
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
! !
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   156
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   157
!ProtoObject class methodsFor:'documentation'!
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   158
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   159
version
6912
d2e78827a065 *** empty log message ***
Claus Gittinger <cg@exept.de>
parents: 6911
diff changeset
   160
    ^ '$Header: /cvs/stx/stx/libbasic/ProtoObject.st,v 1.5 2002-11-26 18:45:09 cg Exp $'
6844
75e52e680723 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   161
! !