"====================================================================== | | Object Method Definitions | ======================================================================" "====================================================================== | | Copyright (C) 1988, 1989, 1990 Free Software Foundation, Inc. | Written by Steve Byrne. | | This file is part of GNU Smalltalk. | | GNU Smalltalk is free software; you can redistribute it and/or modify it | under the terms of the GNU General Public License as published by the Free | Software Foundation; either version 1, or (at your option) any later version. | | GNU Smalltalk is distributed in the hope that it will be useful, but WITHOUT | ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS | FOR A PARTICULAR PURPOSE. See the GNU General Public License for more | details. | | You should have received a copy of the GNU General Public License along with | GNU Smalltalk; see the file COPYING. If not, write to the Free Software | Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. | ======================================================================" " | Change Log | ============================================================================ | Author Date Change | | A. Grant 7 Nov 90 Fixed bug with addDependent: | | sbyrne 26 Apr 90 Fixed shallowCopy to send new messages to the | object's class instead of the object itself. | | sbyrne 19 Sep 89 Converted to use real method categories. | | sbyrne 4 Jul 89 Added support for dependence relationships. | (-: how appropriate: July 4 is when the US declared | its INdependence from England :-) | | sbyrne 25 Apr 89 created. | " Object comment: 'I am the root of the Smalltalk class system. All classes in the system are subclasses of me.' ! !Object methodsFor: 'Relational operators'! ~= anObject ^(self = anObject) == false ! ~~ anObject ^(self == anObject) == false ! isNil ^false ! notNil ^true !! !Object methodsFor: 'testing functionality'! isKindOf: aClass ^(self isMemberOf: aClass) or: [ self class inheritsFrom: aClass ] ! isMemberOf: aClass "Returns true if the receiver is an instance of the class 'aClass'" ^self class == aClass !! !Object methodsFor: 'copying'! copy ^self shallowCopy ! shallowCopy | class aCopy | class _ self class. class isVariable ifTrue: [ aCopy _ class basicNew: self basicSize ] ifFalse: [ aCopy _ class basicNew ]. " copy the instance variables (if any) " 1 to: class instSize do: [ :i | aCopy instVarAt: i put: (self instVarAt: i) ]. " copy the indexed variables (if any) " class isVariable ifTrue: [ 1 to: self basicSize do: [ :i | aCopy basicAt: i put: (self basicAt: i) ] ]. ^aCopy ! deepCopy | class aCopy | class _ self class. class isVariable ifTrue: [ aCopy _ class basicNew: self basicSize ] ifFalse: [ aCopy _ class basicNew ]. " copy the instance variables (if any) " 1 to: class instSize do: [ :i | aCopy instVarAt: i put: (self instVarAt: i) deepCopy ]. " copy the indexed variables (if any) " class isVariable ifTrue: [ 1 to: self basicSize do: [ :i | aCopy basicAt: i put: (self basicAt: i) deepCopy ] ]. ^aCopy !! !Object methodsFor: 'class type methods'! species ^self class ! yourself ^self !! !Object methodsFor: 'dependents access'! addDependent: anObject | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies isNil ifTrue: [ dependencies _ Set new. (Smalltalk at: #Dependencies) at: self put: dependencies ]. dependencies add: anObject ! removeDependent: anObject | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies notNil ifTrue: [ dependencies remove: anObject ifAbsent: [] ] ! dependents | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies isNil ifTrue: [ dependencies _ Set new ]. ^dependencies asOrderedCollection ! release " +++ I'm not sure that this is the right thing to do here; the book is so vague... " (Smalltalk at: #Dependencies) removeKey: self !! !Object methodsFor: 'change and update'! changed self changed: self ! changed: aParameter | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies notNil ifTrue: [ dependencies do: [ :dependent | dependent update: aParameter ] ] ! update: aParameter "Default behavior is to do nothing" ! broadcast: aSymbol | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies notNil ifTrue: [ dependencies do: [ :dependent | dependent perform: aSymbol ] ] ! broadcast: aSymbol with: anObject | dependencies | dependencies _ Smalltalk dependenciesAt: self. dependencies notNil ifTrue: [ dependencies do: [ :dependent | dependent perform: aSymbol with: anObject ] ] !! !Object methodsFor: 'printing'! printString | stream | stream _ WriteStream on: (String new: 0). self printOn: stream. ^stream contents ! printOn: aStream | article nameString | nameString _ self classNameString. article _ nameString first isVowel ifTrue: [ 'an ' ] ifFalse: [ 'a ' ]. article printOn: aStream. nameString printOn: aStream ! print self printOn: stdout ! printNl self print. Character nl print !! !Object methodsFor: 'storing'! storeString | stream | stream _ WriteStream on: (String new: 0). self storeOn: stream. ^stream contents ! storeOn: aStream | class hasSemi | class _ self class. aStream nextPut: $(. aStream nextPutAll: self classNameString. hasSemi _ false. class isVariable ifTrue: [ aStream nextPutAll: ' basicNew: '. self basicSize printOn: aStream ] ifFalse: [ aStream nextPutAll: ' basicNew' ]. 1 to: class instSize do: [ :i | aStream nextPutAll: ' instVarAt: '. i printOn: aStream. aStream nextPutAll: ' put: '. (self instVarAt: i) storeOn: aStream. aStream nextPut: $;. hasSemi _ true ]. class isVariable ifTrue: [ 1 to: self basicSize do: [ :i | aStream nextPutAll: ' basicAt: '. i printOn: aStream. aStream nextPutAll: ' put: '. (self basicAt: i) storeOn: aStream. aStream nextPut: $;. hasSemi _ true ] ]. hasSemi ifTrue: [ aStream nextPutAll: ' yourself' ]. aStream nextPut: $) ! store self storeOn: stdout ! storeNl self store. Character nl print !! !Object methodsFor: 'debugging'! inspect | class instVars instVal | class _ self class. instVars _ class instVarNames. 'An instance of ' print. class printNl. 1 to: instVars size do: [ :i | ' ' print. (instVars at: i) print. ': ' print. (self instVarAt: i) printNl ] !! !Object methodsFor: 'private'! classNameString | name | name _ self class name. name isNil ifTrue: [ name _ self name , ' class' ]. ^name !!