Metaclass.st
author claus
Sat, 29 Oct 1994 15:41:47 +0100
changeset 195 515af3696a5c
parent 175 82ba8d2e3569
child 202 40ca7cc6fb9c
permissions -rw-r--r--
*** empty log message ***
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
     1
"
5
67342904af11 *** empty log message ***
claus
parents: 3
diff changeset
     2
 COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
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
Class subclass:#Metaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
    14
       instanceVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    15
       classVariableNames:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    16
       poolDictionaries:''
a27a279701f8 Initial revision
claus
parents:
diff changeset
    17
       category:'Kernel-Classes'
a27a279701f8 Initial revision
claus
parents:
diff changeset
    18
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    19
a27a279701f8 Initial revision
claus
parents:
diff changeset
    20
Metaclass comment:'
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    21
COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    22
	      All Rights Reserved
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
    23
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
    24
$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.17 1994-10-29 14:41:22 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    25
'!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    26
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    27
!Metaclass class methodsFor:'documentation'!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    28
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    29
copyright
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    30
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    31
 COPYRIGHT (c) 1988 by Claus Gittinger
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    32
	      All Rights Reserved
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    33
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    34
 This software is furnished under a license and may be used
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    35
 only in accordance with the terms of that license and with the
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    36
 inclusion of the above copyright notice.   This software may not
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    37
 be provided or otherwise made available to, or used by, any
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    38
 other person.  No title to or ownership of the software is
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    39
 hereby transferred.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    40
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    41
!
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    42
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    43
version
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    44
"
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
    45
$Header: /cvs/stx/stx/libbasic/Metaclass.st,v 1.17 1994-10-29 14:41:22 claus Exp $
88
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    46
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    47
!
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    48
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    49
documentation
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    50
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    51
    every classes class is a subclass of Metaclass.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    52
    Metaclass provides support for creating new (sub)classes and/or 
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    53
    changing the definition of an already existing class.
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    54
"
81dacba7a63a *** empty log message ***
claus
parents: 85
diff changeset
    55
! !
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    56
a27a279701f8 Initial revision
claus
parents:
diff changeset
    57
!Metaclass methodsFor:'creating classes'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
    58
a27a279701f8 Initial revision
claus
parents:
diff changeset
    59
name:newName inEnvironment:aSystemDictionary
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    60
	     subclassOf:aClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    61
	     instanceVariableNames:stringOfInstVarNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    62
	     variable:variableBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    63
	     words:wordsBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    64
	     pointers:pointersBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    65
	     classVariableNames:stringOfClassVarNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    66
	     poolDictionaries:stringOfPoolNames
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    67
	     category:categoryString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    68
	     comment:commentString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    69
	     changed:changed
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    70
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    71
    "this is the main workhorse for installing new classes - special care
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    72
     has to be taken, when changing an existing classes definition. In this
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    73
     case, some or all of the methods and subclasses methods have to be
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    74
     recompiled.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    75
     Also, the old class(es) are still kept (but not accessable as a global),
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    76
     to allow existing instances some life. 
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    77
     This might change in the future.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    78
    "
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    79
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    80
    |newClass newMetaclass nInstVars nameString classSymbol oldClass 
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
    81
     classVarChange instVarChange superClassChange newComment
10
claus
parents: 5
diff changeset
    82
     changeSet1 changeSet2 offset oldOffsets newOffsets addedNames
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
    83
     anyChange oldInstVars newInstVars oldClassVars newClassVars upd superFlags newFlags|
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    84
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    85
    "NOTICE:
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    86
     this method is too complex and should be splitted into managable pieces ...
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    87
     I dont like it anymore :-) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    88
     (However, its a good test for the compilers ability to handle big, complex methods ;-)
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
    89
    "
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    90
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    91
    newName = aClass name ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    92
	self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    93
	^ nil
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
    94
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
    95
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
    96
    "check for invalid subclassing of UndefinedObject and SmallInteger"
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
    97
    aClass canBeSubclassed ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
    98
	self error:('it is not possible to subclass ' , aClass name).
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
    99
	^ nil
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   100
    ].
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   101
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   102
    nInstVars := stringOfInstVarNames countWords.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   103
    nameString := newName asString.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   104
    classSymbol := newName asSymbol.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   105
    newComment := commentString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   106
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   107
    "look, if it already exists as a class"
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   108
    oldClass := aSystemDictionary at:classSymbol ifAbsent:[nil].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   109
    oldClass isBehavior ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   110
	oldClass := nil.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   111
    ] ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   112
	oldClass superclass notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   113
	    oldClass allSuperclasses do:[:cls |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   114
		cls name = nameString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   115
		    self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   116
		    ^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   117
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   118
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   119
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   120
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   121
	aClass superclass notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   122
	    aClass allSuperclasses do:[:cls |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   123
		cls name = nameString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   124
		    self error:'trying to create circular class definition'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   125
		    ^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   126
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   127
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   128
	].
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   129
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   130
	newComment isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   131
	    newComment := oldClass comment
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   132
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   133
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   134
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   135
	 warn, if it exists with different category and different instvars,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   136
	 and the existing is not an autoload class.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   137
	 Usually, this indicates that someone wants to create a new class with
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   138
	 a name, which already exists (it happened a few times to myself, while 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   139
	 I wanted to create a new class called ReturnNode ...).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   140
	 This will be much less of a problem, once multiple name spaces are
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   141
	 implemented and classes can be put into separate packages.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   142
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   143
	oldClass isLoaded ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   144
	    oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   145
		oldClass instanceVariableString asCollectionOfWords 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   146
		~= stringOfInstVarNames asCollectionOfWords ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   147
		    (self confirm:'a class named ' , oldClass name , ' already exists -
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   148
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   149
create (i.e. change) anyway ?' withCRs)
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   150
		    ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   151
			^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   152
		    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   153
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   154
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   155
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   156
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   157
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   158
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   159
     Check for some 'considered bad-style' things, like lower case names.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   160
     But only do these checks for new classes - 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   161
     - thus, once confirmed, the warnings will not come again and again.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   162
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   163
     NOTICE:
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   164
     I dont like the confirmers there - we need a notifying: argument, to give
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   165
     the outer codeview a chance to highlight the error.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   166
     (but thats how its defined in the book - maybe I will change anyway).
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   167
    "
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   168
    oldClass isNil ifTrue:[
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   169
	(self checkConventionsFor:newName 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   170
		    instVarNames:stringOfInstVarNames 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   171
		    classVarNames:stringOfClassVarNames) ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   172
	    ^ nil
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   173
	]
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   174
    ].
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   175
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   176
    "create the metaclass first"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   177
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   178
    newMetaclass setSuperclass:(aClass class).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   179
    newMetaclass instSize:(aClass class instSize).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   180
    newMetaclass setName:(nameString , 'class') asSymbol.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   181
    newMetaclass classVariableString:'' "stringOfClassVarNames".
a27a279701f8 Initial revision
claus
parents:
diff changeset
   182
    newMetaclass setComment:newComment category:categoryString.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   183
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   184
    "then let the new meta create the class"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   185
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   186
    newClass setSuperclass:aClass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   187
    newClass instSize:(aClass instSize + nInstVars).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   188
    newClass setName:classSymbol.
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   189
    newClass setComment:newComment category:categoryString.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   190
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   191
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   192
     Allowing non-booleans as variableBoolean
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   193
     is a hack for backward (ST-80) compatibility:
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   194
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   195
     ST-80 code will pass true or false as variableBoolean,
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   196
     while ST/X also calls it with symbols such as #float, #double etc.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   197
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   198
    (variableBoolean == true) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   199
	pointersBoolean ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   200
	    newFlags := Behavior flagPointers
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   201
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   202
	    wordsBoolean ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   203
		newFlags := Behavior flagWords
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   204
	    ] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   205
		newFlags := Behavior flagBytes
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   206
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   207
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   208
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   209
	(variableBoolean == #float) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   210
	    newFlags := Behavior flagFloats
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   211
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   212
	    (variableBoolean == #double) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   213
		newFlags := Behavior flagDoubles
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   214
	    ] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   215
		(variableBoolean == #long) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   216
		    newFlags := Behavior flagLongs
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   217
		] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   218
		    newFlags := Behavior flagNotIndexed   
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   219
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   220
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   221
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   222
    ].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   223
    superFlags := aClass flags bitAnd:(Behavior maskIndexType bitInvert). "preserve other bits"
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   224
    oldClass notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   225
	oldClass isBuiltInClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   226
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   227
	     special care when redefining Method, Block and other built-in classes,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   228
	     which might have other flag bits ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   229
	    "
49
f1c2d75f2eb6 *** empty log message ***
claus
parents: 44
diff changeset
   230
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   231
	    newFlags := newFlags bitOr:(oldClass flags bitAnd:(Behavior maskIndexType bitInvert))
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   232
	]
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   233
    ].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   234
    newClass flags:(newFlags bitOr:superFlags). "preserve  inherited special bits"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   235
a27a279701f8 Initial revision
claus
parents:
diff changeset
   236
    (nInstVars ~~ 0) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   237
	newClass instanceVariableString:stringOfInstVarNames
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   238
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   239
    oldClass notNil ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   240
	"setting first will make new class clear obsolete classvars"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   241
	newClass setClassVariableString:(oldClass classVariableString)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   242
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   243
    newClass classVariableString:stringOfClassVarNames.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   244
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   245
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   246
     for new classes, we are almost done here
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   247
     (also for autoloaded classes)
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   248
    "
77
6c38ca59927f *** empty log message ***
claus
parents: 68
diff changeset
   249
    (oldClass isNil or:[oldClass isLoaded not]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   250
	oldClass isNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   251
	    self addChangeRecordForClass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   252
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   253
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   254
	commentString notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   255
	    newClass comment:commentString
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   256
	].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   257
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   258
	aSystemDictionary at:classSymbol put:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   259
	aSystemDictionary changed:#newClass with:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   260
	^ newClass
2
claus
parents: 1
diff changeset
   261
    ].
claus
parents: 1
diff changeset
   262
10
claus
parents: 5
diff changeset
   263
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   264
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   265
     here comes the hard part - we are actually changing the
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   266
     definition of an existing class ....
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   267
     Try hard to get away WITHOUT recompiling, since it makes all
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   268
     compiled code into interpreted ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   269
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   270
10
claus
parents: 5
diff changeset
   271
    oldInstVars := oldClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   272
    newInstVars := newClass instanceVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   273
    oldClassVars := oldClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   274
    newClassVars := newClass classVariableString asCollectionOfWords.
claus
parents: 5
diff changeset
   275
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   276
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   277
     we are on the bright side of life, if the instance layout and
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   278
     inheritance do not change.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   279
     In this case, we can go ahead and patch the class object.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   280
    "
2
claus
parents: 1
diff changeset
   281
    (oldClass superclass == newClass superclass) ifTrue:[
claus
parents: 1
diff changeset
   282
      (oldClass instSize == newClass instSize) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   283
	(oldClass flags == newClass flags) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   284
	  (oldClass name = newClass name) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   285
	    (oldInstVars = newInstVars) ifTrue:[
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   286
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   287
	      (newComment ~= oldClass comment) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   288
		  oldClass setComment:newComment.        "writes a change-chunk"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   289
		  oldClass changed:#comment with:oldClass comment.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   290
		  self addChangeRecordForClassComment:oldClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   291
	      ]. 
10
claus
parents: 5
diff changeset
   292
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   293
	      (oldClassVars = newClassVars) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   294
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   295
		 really no change (just comment and/or category)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   296
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   297
		anyChange := false.
10
claus
parents: 5
diff changeset
   298
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   299
		oldClass instanceVariableString:(newClass instanceVariableString).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   300
		oldClass setClassVariableString:(newClass classVariableString).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   301
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   302
		oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   303
		    oldClass category:categoryString. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   304
		    self addChangeRecordForClass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   305
		    "notify change of organization"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   306
		    aSystemDictionary changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   307
		].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   308
		"notify change of class"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   309
"/                oldClass changed.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   310
		^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   311
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   312
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   313
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   314
	       when we arrive here, class variables have changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   315
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   316
	      oldClass category ~= categoryString ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   317
		  "notify change of organization"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   318
		  oldClass category:categoryString. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   319
		  "notify change of organization"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   320
		  aSystemDictionary changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   321
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   322
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   323
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   324
	       set class variable string; 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   325
	       this also updates the set of class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   326
	       by creating new / deleting obsolete ones.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   327
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   328
	      oldClass classVariableString:stringOfClassVarNames.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   329
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   330
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   331
	       get the set of changed class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   332
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   333
	      changeSet1 := Set new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   334
	      oldClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   335
		  (newClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   336
		      changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   337
		  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   338
	      ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   339
	      newClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   340
		  (oldClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   341
		      changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   342
		  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   343
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   344
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   345
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   346
	       recompile all methods accessing set of changed classvars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   347
	       here and also in all subclasses ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   348
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   349
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   350
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   351
	       dont update change file for the recompilation
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   352
	      "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   353
	      upd := Class updateChanges:false.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   354
	      [
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   355
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   356
		  Transcript showCr:'recompiling class & inst methods accessing ' , changeSet1 printString.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   357
		  Transcript endEntry.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   358
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   359
		  oldClass withAllSubclasses do:[:aClass |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   360
		      aClass class recompileMethodsAccessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   361
		      aClass recompileMethodsAccessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   362
		  ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   363
	      ] valueNowOrOnUnwindDo:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   364
		  Class updateChanges:upd.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   365
	      ].
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   366
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   367
	      "notify change of class"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   368
	      self addChangeRecordForClass:oldClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   369
	      oldClass changed:#definition.
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   370
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   371
	      ^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   372
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   373
	  ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   374
	]
2
claus
parents: 1
diff changeset
   375
      ]
claus
parents: 1
diff changeset
   376
    ].
claus
parents: 1
diff changeset
   377
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   378
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   379
     here we enter the darkness of mordor ...
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   380
     since instance variable layout and/or inheritance has changed.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   381
    "
2
claus
parents: 1
diff changeset
   382
    (newComment ~= oldClass comment) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   383
	newClass comment:newComment
2
claus
parents: 1
diff changeset
   384
    ].
claus
parents: 1
diff changeset
   385
claus
parents: 1
diff changeset
   386
    superClassChange := oldClass superclass ~~ newClass superclass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   387
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   388
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   389
     dont allow built-in classes to be modified this way
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   390
    "
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   391
    (oldClass notNil and:[oldClass isBuiltInClass and:[superClassChange]]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   392
	self error:'the inheritance of this class is fixed - you cannot change it'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   393
	^ oldClass
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   394
    ].
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   395
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   396
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   397
     catch special case, where superclass changed its layout and thus
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   398
     forced redefinition of this class; 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   399
     only log if this is not the case.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   400
    "
2
claus
parents: 1
diff changeset
   401
    (superClassChange 
33
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   402
     and:[(oldClass superclass isNil or:[oldClass superclass name = newClass superclass name])
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   403
     and:[(oldClassVars = newClassVars) 
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   404
     and:[(oldInstVars = newInstVars)
50cf0f6bc0ad *** empty log message ***
claus
parents: 13
diff changeset
   405
     and:[newComment = oldClass comment]]]]) ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   406
	self addChangeRecordForClass:newClass.
2
claus
parents: 1
diff changeset
   407
    ].
claus
parents: 1
diff changeset
   408
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   409
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   410
     care for class methods ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   411
    "
2
claus
parents: 1
diff changeset
   412
    changeSet1 := Set new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   413
2
claus
parents: 1
diff changeset
   414
    classVarChange := false.
claus
parents: 1
diff changeset
   415
claus
parents: 1
diff changeset
   416
    superClassChange ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   417
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   418
	 superclass changed:
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   419
	 must recompile all class methods accessing ANY classvar
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   420
	 (
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   421
	  actually, we could be less strict and handle the case where
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   422
	  both the old and the new superclass have a common ancestor,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   423
	  and both have no new classvariables in between.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   424
	  This would speedup the case when a class is inserted into
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   425
	  the inheritance chain.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   426
	 )
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   427
	"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   428
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   429
	oldClass allClassVarNames do:[:nm | changeSet1 add:nm].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   430
	newClass allClassVarNames do:[:nm | changeSet1 add:nm].
2
claus
parents: 1
diff changeset
   431
claus
parents: 1
diff changeset
   432
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   433
	Transcript showCr:'recompiling class methods accessing any classvar'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   434
	Transcript endEntry.
2
claus
parents: 1
diff changeset
   435
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   436
	self copyInvalidatedMethodsFrom:(oldClass class) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   437
				    for:newMetaclass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   438
			   accessingAny:changeSet1
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   439
				orSuper:true.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   440
	newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
2
claus
parents: 1
diff changeset
   441
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   442
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   443
	 same superclass, find out which classvars have changed
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   444
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   445
	classVarChange := oldClassVars ~= newClassVars.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   446
	classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   447
	    oldClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   448
		(newClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   449
		    changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   450
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   451
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   452
	    newClassVars do:[:nm |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   453
		(oldClassVars includes:nm) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   454
		    changeSet1 add:nm
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   455
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   456
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   457
	].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   458
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   459
	classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   460
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   461
	     must recompile some class-methods
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   462
	    "
2
claus
parents: 1
diff changeset
   463
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   464
	    Transcript showCr:'recompiling class methods accessing ' , changeSet1 printString.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   465
	    Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   466
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   467
	    self copyInvalidatedMethodsFrom:(oldClass class) for:newMetaclass accessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   468
	    newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   469
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   470
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   471
	     class methods still work
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   472
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   473
	    self copyMethodsFrom:(oldClass class) for:newMetaclass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   474
	].
2
claus
parents: 1
diff changeset
   475
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   476
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   477
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   478
     care for instance methods ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   479
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   480
    changeSet2 := Set new.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   481
2
claus
parents: 1
diff changeset
   482
    superClassChange ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   483
	"superclass changed,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   484
	 must recompile all methods accessing any class or instvar.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   485
	 If number of instvars (i.e. the instances instSize) is the same,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   486
	 we can limit the set of recompiled instance methods to those methods,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   487
	 which refer to an instvar with a different inst-index
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   488
	"
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   489
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   490
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   491
	 collect the instvar-indices in the old and new class
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   492
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   493
	offset := 0. oldOffsets := Dictionary new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   494
	oldClass allInstVarNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   495
	offset := 0. newOffsets := Dictionary new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   496
	newClass allInstVarNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   497
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   498
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   499
	 the changeset consists of instance variables, 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   500
	 whith a different position
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   501
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   502
	oldOffsets associationsDo:[:a |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   503
	    |k|
2
claus
parents: 1
diff changeset
   504
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   505
	    k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   506
	    (newOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   507
		changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   508
	    ] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   509
		(a value ~~ (newOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   510
		    changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   511
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   512
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   513
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   514
	newOffsets associationsDo:[:a |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   515
	    |k|
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   516
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   517
	    k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   518
	    (oldOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   519
		changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   520
	    ] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   521
		(a value ~~ (oldOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   522
		    changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   523
		]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   524
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   525
	].
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   526
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   527
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   528
	 merge in the changed class variables
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   529
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   530
	changeSet1 do:[:nm | changeSet2 add:nm].
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   531
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   532
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   533
	Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   534
	Transcript endEntry.
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   535
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   536
	self copyInvalidatedMethodsFrom:oldClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   537
				    for:newClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   538
			   accessingAny:changeSet2
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   539
				orSuper:true.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   540
	newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   541
2
claus
parents: 1
diff changeset
   542
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   543
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   544
	 same inheritance ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   545
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   546
	instVarChange := oldInstVars ~= newInstVars.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   547
	instVarChange ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   548
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   549
	     same instance variables ...
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   550
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   551
	    classVarChange ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   552
		"recompile all inst methods accessing changed classvars"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   553
2
claus
parents: 1
diff changeset
   554
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   555
		Transcript showCr:'recompiling instance methods accessing ' , changeSet1 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   556
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   557
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   558
		self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet1.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   559
		newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   560
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   561
	] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   562
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   563
	     dont allow built-in classes to be modified
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   564
	    "
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   565
	    (oldClass notNil and:[oldClass isBuiltInClass and:[instVarChange]]) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   566
		self error:'the layout of this class is fixed - you cannot change it'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   567
		^ oldClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   568
	    ].
3
24d81bf47225 *** empty log message ***
claus
parents: 2
diff changeset
   569
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   570
	    ((oldInstVars size == 0) 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   571
	    or:[newInstVars startsWith:oldInstVars]) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   572
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   573
		 only new inst variable(s) has/have been added - 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   574
		 old methods still work (the existing inst-indices are still valid)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   575
		"
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   576
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   577
		Transcript showCr:'copying methods ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   578
		Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   579
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   580
		self copyMethodsFrom:oldClass for:newClass.
2
claus
parents: 1
diff changeset
   581
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   582
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   583
		 but: we have to recompile all methods accessing new instars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   584
		 (it might have been a classVar/global before ...)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   585
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   586
		addedNames := newInstVars select:[:nm | (oldInstVars includes:nm) not].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   587
		"merge in class variables"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   588
		changeSet1 do:[:nm | addedNames add:nm].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   589
2
claus
parents: 1
diff changeset
   590
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   591
		Transcript showCr:'recompiling instance methods accessing ' , addedNames printString ,  '...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   592
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   593
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   594
		newClass recompileMethodsAccessingAny:addedNames.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   595
	    ] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   596
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   597
		 collect the instvar-indices in the old and new class
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   598
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   599
		offset := 0. oldOffsets := Dictionary new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   600
		oldInstVars do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   601
		offset := 0. newOffsets := Dictionary new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   602
		newInstVars do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
2
claus
parents: 1
diff changeset
   603
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   604
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   605
		 the changeset consists of instance variables, 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   606
		 whith a different position
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   607
		"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   608
		oldOffsets associationsDo:[:a |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   609
		    |k|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   610
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   611
		    k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   612
		    (newOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   613
			changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   614
		    ] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   615
			(a value ~~ (newOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   616
			    changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   617
			]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   618
		    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   619
		].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   620
		newOffsets associationsDo:[:a |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   621
		    |k|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   622
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   623
		    k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   624
		    (oldOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   625
			changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   626
		    ] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   627
			(a value ~~ (oldOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   628
			    changeSet2 add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   629
			]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   630
		    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   631
		].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   632
		"merge in class variables"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   633
		changeSet1 do:[:nm | changeSet2 add:nm].
2
claus
parents: 1
diff changeset
   634
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   635
		Transcript showCr:'recompiling instance methods accessing ' , changeSet2 printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   636
		Transcript endEntry.
2
claus
parents: 1
diff changeset
   637
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   638
		self copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:changeSet2.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   639
		newClass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   640
	    ].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   641
	].
2
claus
parents: 1
diff changeset
   642
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   643
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   644
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   645
     WOW, everything done for this class
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   646
     what about subclasses ?
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   647
    "
2
claus
parents: 1
diff changeset
   648
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   649
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   650
     update superclass of immediate subclasses - 
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   651
     this forces recompilation (recursively) if needed
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   652
     (dont update change file for the subclass changes)
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   653
    "
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   654
    upd := Class updateChanges:false.
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   655
    [
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   656
	oldClass subclassesDo:[:aClass |
2
claus
parents: 1
diff changeset
   657
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   658
	    Transcript showCr:'changing superclass of:' , aClass name.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   659
	    Transcript endEntry.
2
claus
parents: 1
diff changeset
   660
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   661
	    aClass superclass:newClass
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   662
	]
13
62303f84ff5f *** empty log message ***
claus
parents: 10
diff changeset
   663
    ] valueNowOrOnUnwindDo:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   664
	Class updateChanges:upd.
2
claus
parents: 1
diff changeset
   665
    ].
claus
parents: 1
diff changeset
   666
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   667
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   668
     change category in oldClass - so we see immediately what it is ...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   669
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   670
    oldClass category:'obsolete'.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   671
    oldClass class category:'obsolete'.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   672
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   673
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   674
     and make the new class globally known
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   675
    "
2
claus
parents: 1
diff changeset
   676
    aSystemDictionary at:classSymbol put:newClass.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   677
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   678
    oldClass category ~= categoryString ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   679
	"notify change of organization"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   680
	aSystemDictionary changed
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   681
    ].
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   682
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   683
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   684
     Not becoming the old class creates some update problems;
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   685
     the browsers must check carefully - a simple identity compare is
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   686
     not enough ...
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   687
     QUESTION: is this a good idea ?
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   688
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   689
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   690
    newClass dependents:(oldClass dependents).
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   691
    newClass changed.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   692
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   693
    "just to make certain ... - tell dependents of oldClass, that something changed
85
claus
parents: 77
diff changeset
   694
     (systemBrowsers will react on this, and update their views)"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   695
    oldClass changed:#definition with:newClass.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   696
2
claus
parents: 1
diff changeset
   697
    ObjectMemory flushCaches.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   698
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   699
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   700
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   701
a27a279701f8 Initial revision
claus
parents:
diff changeset
   702
new
2
claus
parents: 1
diff changeset
   703
    "create & return a new metaclass (a classes class)"
claus
parents: 1
diff changeset
   704
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   705
    |newClass|
a27a279701f8 Initial revision
claus
parents:
diff changeset
   706
a27a279701f8 Initial revision
claus
parents:
diff changeset
   707
    newClass := self basicNew.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   708
    newClass setSuperclass:(Object class)
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   709
		 selectors:(Array new:0)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   710
		   methods:(Array new:0)
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   711
		  instSize:0
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   712
		     flags:(Behavior flagNotIndexed).
175
82ba8d2e3569 *** empty log message ***
claus
parents: 159
diff changeset
   713
"/    newClass setComment:(self comment) category:(self category).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   714
    ^ newClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   715
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   716
a27a279701f8 Initial revision
claus
parents:
diff changeset
   717
!Metaclass methodsFor:'class instance variables'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   718
a27a279701f8 Initial revision
claus
parents:
diff changeset
   719
instanceVariableNames:aString
a27a279701f8 Initial revision
claus
parents:
diff changeset
   720
    "changing / adding class-inst vars -
2
claus
parents: 1
diff changeset
   721
     this actually creates a new metaclass and class."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   722
a27a279701f8 Initial revision
claus
parents:
diff changeset
   723
    |newClass newMetaclass nClassInstVars oldClass 
2
claus
parents: 1
diff changeset
   724
     allSubclasses t oldVars
claus
parents: 1
diff changeset
   725
     oldNames newNames addedNames
claus
parents: 1
diff changeset
   726
     oldOffsets newOffsets offset changeSet delta
claus
parents: 1
diff changeset
   727
     oldToNew newSubMeta newSub oldSubMeta oldSuper|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   728
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   729
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   730
     cleanup needed here: extract common things with name:inEnvironment:...
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   731
     and restructure things ... currently way too complex.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   732
    "
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   733
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   734
    oldVars := self instanceVariableString.
2
claus
parents: 1
diff changeset
   735
    aString = oldVars ifTrue:[
claus
parents: 1
diff changeset
   736
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   737
	Transcript showCr:'no change (', oldVars , ') -> (', aString , ')'.
2
claus
parents: 1
diff changeset
   738
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   739
	^ self
2
claus
parents: 1
diff changeset
   740
    ].
claus
parents: 1
diff changeset
   741
claus
parents: 1
diff changeset
   742
    oldNames := oldVars asCollectionOfWords.
claus
parents: 1
diff changeset
   743
    newNames := aString asCollectionOfWords.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   744
2
claus
parents: 1
diff changeset
   745
    oldNames = newNames ifTrue:[
claus
parents: 1
diff changeset
   746
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   747
	Transcript showCr:'no real change'.
2
claus
parents: 1
diff changeset
   748
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   749
	"no real change (just formatting)"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   750
	self instanceVariableString:aString.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   751
	^ self
2
claus
parents: 1
diff changeset
   752
    ]. 
claus
parents: 1
diff changeset
   753
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   754
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   755
     let user confirm, if any name is no good (and was good before)
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   756
    "
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   757
    (oldNames inject:true
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   758
		into:[:okSoFar :word |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   759
			 okSoFar and:[word first isUppercase]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   760
		     ])
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   761
    ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   762
	"was ok before"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   763
	(newNames inject:true
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   764
		    into:[:okSoFar :word |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   765
			     okSoFar and:[word first isUppercase]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   766
			 ])
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   767
	ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   768
	    (self confirm:'class instance variable names should start with an uppercase letter
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   769
(by convention only)
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   770
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   771
install anyway ?' withCRs)
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   772
	    ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   773
		^ nil
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   774
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   775
	]
44
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   776
    ].
b262907c93ea *** empty log message ***
claus
parents: 33
diff changeset
   777
2
claus
parents: 1
diff changeset
   778
    nClassInstVars := newNames size.
claus
parents: 1
diff changeset
   779
claus
parents: 1
diff changeset
   780
"
claus
parents: 1
diff changeset
   781
    Transcript showCr:'create new class/metaclass'.
claus
parents: 1
diff changeset
   782
"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   783
a27a279701f8 Initial revision
claus
parents:
diff changeset
   784
    "create the new metaclass"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   785
    newMetaclass := Metaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   786
    newMetaclass setSuperclass:superclass.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   787
    newMetaclass instSize:(superclass instSize + nClassInstVars).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   788
    (nClassInstVars ~~ 0) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   789
	newMetaclass instanceVariableString:aString
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   790
    ].
93
e31220cb391f *** empty log message ***
claus
parents: 88
diff changeset
   791
    newMetaclass flags:(Behavior flagNotIndexed).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   792
    newMetaclass setName:name.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   793
    newMetaclass classVariableString:classvars.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   794
    newMetaclass category:category.
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
   795
    newMetaclass setComment:(self comment).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   796
a27a279701f8 Initial revision
claus
parents:
diff changeset
   797
    "find the class which is my sole instance"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   798
a27a279701f8 Initial revision
claus
parents:
diff changeset
   799
    t := Smalltalk allClasses select:[:element | element class == self].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   800
    (t size ~~ 1) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   801
	self error:'oops - I should have exactly one instance'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   802
	^ nil
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   803
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   804
    oldClass := t anElement.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   805
a27a279701f8 Initial revision
claus
parents:
diff changeset
   806
    "create a new class"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   807
    newClass := newMetaclass new.
a27a279701f8 Initial revision
claus
parents:
diff changeset
   808
    newClass setSuperclass:(oldClass superclass).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   809
    newClass instSize:(oldClass instSize).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   810
    newClass flags:(oldClass flags).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   811
    newClass setName:(oldClass name).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   812
    newClass instanceVariableString:(oldClass instanceVariableString).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   813
    newClass classVariableString:(oldClass classVariableString).
2
claus
parents: 1
diff changeset
   814
    newClass setComment:(oldClass comment).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   815
    newClass category:(oldClass category).
a27a279701f8 Initial revision
claus
parents:
diff changeset
   816
2
claus
parents: 1
diff changeset
   817
    offset := 0. oldOffsets := Dictionary new.
claus
parents: 1
diff changeset
   818
    oldNames do:[:nm | offset := offset + 1. oldOffsets at:nm put:offset].
claus
parents: 1
diff changeset
   819
    offset := 0. newOffsets := Dictionary new.
claus
parents: 1
diff changeset
   820
    newNames do:[:nm | offset := offset + 1. newOffsets at:nm put:offset].
claus
parents: 1
diff changeset
   821
    changeSet := Set new.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   822
2
claus
parents: 1
diff changeset
   823
    oldOffsets associationsDo:[:a |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   824
	|k|
10
claus
parents: 5
diff changeset
   825
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   826
	k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   827
	(newOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   828
	    changeSet add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   829
	] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   830
	    (a value ~~ (newOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   831
		changeSet add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   832
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   833
	]
2
claus
parents: 1
diff changeset
   834
    ].
claus
parents: 1
diff changeset
   835
    newOffsets associationsDo:[:a |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   836
	|k|
10
claus
parents: 5
diff changeset
   837
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   838
	k := a key.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   839
	(oldOffsets includesKey:k) ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   840
	    changeSet add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   841
	] ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   842
	    (a value ~~ (oldOffsets at:k)) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   843
		changeSet add:k
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   844
	    ]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   845
	]
2
claus
parents: 1
diff changeset
   846
    ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   847
2
claus
parents: 1
diff changeset
   848
    ((oldNames size == 0) 
claus
parents: 1
diff changeset
   849
    or:[newNames startsWith:oldNames]) ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   850
	"new variable(s) has/have been added - old methods still work"
2
claus
parents: 1
diff changeset
   851
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   852
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   853
	Transcript showCr:'copying methods ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   854
	Transcript endEntry.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   855
" "
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   856
	self copyMethodsFrom:self for:newMetaclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   857
	self copyMethodsFrom:oldClass for:newClass.
2
claus
parents: 1
diff changeset
   858
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   859
	"but have to recompile methods accessing stuff now defined
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   860
	 (it might have been a global before ...)"
2
claus
parents: 1
diff changeset
   861
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   862
	addedNames := newNames select:[:nm | (oldNames includes:nm) not].
2
claus
parents: 1
diff changeset
   863
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   864
	Transcript showCr:'recompiling methods accessing ' , addedNames printString ,  '...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   865
	Transcript endEntry.
2
claus
parents: 1
diff changeset
   866
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   867
	"recompile class-methods"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   868
	newMetaclass recompileMethodsAccessingAny:addedNames.
2
claus
parents: 1
diff changeset
   869
    ] ifFalse:[
claus
parents: 1
diff changeset
   870
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   871
	Transcript showCr:'recompiling methods accessing ' , changeSet printString , ' ...'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   872
	Transcript endEntry.
2
claus
parents: 1
diff changeset
   873
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   874
	"recompile class-methods"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   875
	self copyInvalidatedMethodsFrom:self for:newMetaclass accessingAny:changeSet.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   876
	newMetaclass recompileInvalidatedMethods:(Metaclass compiledMethodAt:#invalidMethod).
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   877
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   878
	self copyMethodsFrom:oldClass for:newClass.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   879
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   880
2
claus
parents: 1
diff changeset
   881
    delta := newNames size - oldNames size.
claus
parents: 1
diff changeset
   882
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   883
    "
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   884
     get list of all subclasses - do before superclass is changed
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   885
    "
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   886
    allSubclasses := oldClass allSubclasses.
2
claus
parents: 1
diff changeset
   887
    allSubclasses := allSubclasses asSortedCollection:[:a :b |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   888
				b isSubclassOf:a
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   889
		     ].
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   890
2
claus
parents: 1
diff changeset
   891
    oldToNew := IdentityDictionary new.
claus
parents: 1
diff changeset
   892
claus
parents: 1
diff changeset
   893
    "create a new class tree, based on new version"
claus
parents: 1
diff changeset
   894
claus
parents: 1
diff changeset
   895
    allSubclasses do:[:aSubclass |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   896
	oldSuper := aSubclass superclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   897
	oldSubMeta := aSubclass class.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   898
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   899
	newSubMeta := Metaclass new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   900
	oldSuper == oldClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   901
	    newSubMeta setSuperclass:newMetaclass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   902
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   903
	    newSubMeta setSuperclass:(oldToNew at:oldSuper) class.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   904
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   905
	newSubMeta instSize:(oldSubMeta instSize + delta).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   906
	newSubMeta flags:(oldSubMeta flags).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   907
	newSubMeta setName:(oldSubMeta name).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   908
	newSubMeta classVariableString:(oldSubMeta classVariableString).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   909
	newSubMeta setComment:(oldSubMeta comment).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   910
	newSubMeta category:(oldSubMeta category).
2
claus
parents: 1
diff changeset
   911
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   912
	newSub := newSubMeta new.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   913
	oldSuper == oldClass ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   914
	    newSub setSuperclass:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   915
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   916
	    newSub setSuperclass:(oldToNew at:oldSuper).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   917
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   918
	newSub setSelectorArray:(aSubclass selectorArray).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   919
	newSub setMethodArray:(aSubclass methodArray).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   920
	newSub setName:(aSubclass name).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   921
	newSub classVariableString:(aSubclass classVariableString).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   922
	newSub setComment:(aSubclass comment).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   923
	newSub category:(aSubclass category).
2
claus
parents: 1
diff changeset
   924
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   925
	oldToNew at:aSubclass put:newSub.
2
claus
parents: 1
diff changeset
   926
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   927
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   928
	aSubclass setName:(aSubclass name , '-old').
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   929
	aSubclass category:'obsolete classes'
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   930
"
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   931
	aSubclass category:'obsolete'.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   932
	aSubclass class category:'obsolete'.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   933
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   934
2
claus
parents: 1
diff changeset
   935
    "recompile what needs to be"
claus
parents: 1
diff changeset
   936
claus
parents: 1
diff changeset
   937
    delta == 0 ifTrue:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   938
	"only have to recompile class methods accessing 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   939
	 class instvars from changeset
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   940
	"
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   941
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   942
	allSubclasses do:[:aClass |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   943
	    aClass class recompileMethodsAccessingAny:changeSet.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   944
	]
2
claus
parents: 1
diff changeset
   945
    ] ifFalse:[
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   946
	"
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   947
	 have to recompile all class methods accessing class instvars
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   948
	"
2
claus
parents: 1
diff changeset
   949
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   950
	allSubclasses do:[:aClass |
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   951
	    |classInstVars|
2
claus
parents: 1
diff changeset
   952
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   953
	    classInstVars := aClass class allInstVarNames.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   954
	    aClass class recompileMethodsAccessingAny:classInstVars.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   955
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   956
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
   957
2
claus
parents: 1
diff changeset
   958
    self addChangeRecordForClassInstvars:newClass.
claus
parents: 1
diff changeset
   959
claus
parents: 1
diff changeset
   960
    "install all new classes"
claus
parents: 1
diff changeset
   961
claus
parents: 1
diff changeset
   962
    Smalltalk at:(oldClass name asSymbol) put:newClass.
claus
parents: 1
diff changeset
   963
    ObjectMemory flushCachesFor:oldClass.
claus
parents: 1
diff changeset
   964
    allSubclasses do:[:aClass |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   965
	Smalltalk at:(oldToNew at:aClass) name asSymbol put:(oldToNew at:aClass).
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   966
	ObjectMemory flushCachesFor:aClass.
2
claus
parents: 1
diff changeset
   967
    ].
claus
parents: 1
diff changeset
   968
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   969
    "tell dependents ..."
10
claus
parents: 5
diff changeset
   970
2
claus
parents: 1
diff changeset
   971
    oldClass changed.
claus
parents: 1
diff changeset
   972
    self changed.
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   973
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   974
    ^ newMetaclass
a27a279701f8 Initial revision
claus
parents:
diff changeset
   975
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   976
a27a279701f8 Initial revision
claus
parents:
diff changeset
   977
!Metaclass methodsFor:'queries'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   978
a27a279701f8 Initial revision
claus
parents:
diff changeset
   979
isMeta
a27a279701f8 Initial revision
claus
parents:
diff changeset
   980
    "return true, if the receiver is some kind of metaclass;
a27a279701f8 Initial revision
claus
parents:
diff changeset
   981
     true is returned here. Redefines isMeta in Object"
a27a279701f8 Initial revision
claus
parents:
diff changeset
   982
a27a279701f8 Initial revision
claus
parents:
diff changeset
   983
    ^ true
a27a279701f8 Initial revision
claus
parents:
diff changeset
   984
! !
a27a279701f8 Initial revision
claus
parents:
diff changeset
   985
a27a279701f8 Initial revision
claus
parents:
diff changeset
   986
!Metaclass methodsFor:'private'!
a27a279701f8 Initial revision
claus
parents:
diff changeset
   987
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   988
invalidMethod
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   989
    "When recompiling classes after a definition-change, all
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   990
     uncompilable methods will be bound to this method here,
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   991
     so that evaluating such an uncompilable method will trigger an error.
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   992
     Can also happen when Compiler/runtime system is broken."
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   993
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   994
    self error:'invalid method - this method failed to compile when the class was changed'
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   995
!
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
   996
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
   997
copyMethodsFrom:oldClass for:newClass
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   998
    "copy all methods from oldClass to newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
   999
     This is used for class-methods when a class has changed, but metaclass is 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1000
     unaffected (i.e. classVars/inheritance have not changed) so there is no need
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1001
     to recompile the class methods."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1002
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1003
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1004
	       methods:(oldClass methodArray copy)
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1005
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1006
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1007
copyInvalidatedMethodsFrom:oldClass for:newClass
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1008
    "copy all methods from oldClass to newClass and change their code
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1009
     to a trap method reporting an error.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1010
     This is used when a class has been changed its layout or inheritance,
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1011
     for all methods; before recompilation is attempted.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1012
     This allows us to keep the source while trapping uncompilable (due to
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1013
     now undefined instvars) methods. Compilation of these methods will show
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1014
     an error on the transcript and lead to the debugger once called."
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1015
2
claus
parents: 1
diff changeset
  1016
    |trap trapCode trapByteCode newMethod oldMethodArray newMethodArray|
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1017
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1018
    trap := Metaclass compiledMethodAt:#invalidMethod.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1019
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1020
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1021
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1022
    oldMethodArray := oldClass methodArray.
2
claus
parents: 1
diff changeset
  1023
    newMethodArray := Array new:(oldMethodArray size).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1024
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1025
	       methods:newMethodArray.
2
claus
parents: 1
diff changeset
  1026
    1 to:oldMethodArray size do:[:i |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1027
	newMethod := (oldMethodArray at:i) copy.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1028
	newMethod code:trapCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1029
	newMethod literals:nil.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1030
	newMethod byteCode:trapByteCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1031
	newMethodArray at:i put:newMethod
2
claus
parents: 1
diff changeset
  1032
    ]
claus
parents: 1
diff changeset
  1033
!
claus
parents: 1
diff changeset
  1034
claus
parents: 1
diff changeset
  1035
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames
claus
parents: 1
diff changeset
  1036
    "copy all methods from oldClass to newClass. Those methods accessing
claus
parents: 1
diff changeset
  1037
     a variable in setOfNames will be copied as invalid method, leading to
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1038
     a trap when its executed. This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1039
     layout for all methods which are affected by the change."
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1040
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1041
    self copyInvalidatedMethodsFrom:oldClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1042
				for:newClass 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1043
		       accessingAny:setOfNames 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1044
			    orSuper:false 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1045
!
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1046
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1047
copyInvalidatedMethodsFrom:oldClass for:newClass accessingAny:setOfNames orSuper:superBoolean
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1048
    "copy all methods from oldClass to newClass. 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1049
     Those methods accessing a variable in setOfNames will be copied as invalid method, 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1050
     leading to a trap when its executed. If superBoolean is true, this is also done
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1051
     for methods accessing super.  This is used when a class has changed its
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1052
     layout for all methods which are affected by the change."
2
claus
parents: 1
diff changeset
  1053
claus
parents: 1
diff changeset
  1054
    |trap trapCode trapByteCode p oldMethod newMethod oldMethodArray newMethodArray|
claus
parents: 1
diff changeset
  1055
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1056
    trap := Metaclass compiledMethodAt:#invalidMethod.
2
claus
parents: 1
diff changeset
  1057
    trapCode := trap code.
claus
parents: 1
diff changeset
  1058
    trapByteCode := trap byteCode.
claus
parents: 1
diff changeset
  1059
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1060
    oldMethodArray := oldClass methodArray.
2
claus
parents: 1
diff changeset
  1061
    newMethodArray := Array new:(oldMethodArray size).
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1062
    newClass selectors:(oldClass selectorArray copy) 
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1063
	       methods:newMethodArray.
2
claus
parents: 1
diff changeset
  1064
    1 to:oldMethodArray size do:[:i |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1065
	oldMethod := oldMethodArray at:i.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1066
	p := Parser parseMethod:(oldMethod source) in:newClass.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1067
	(p isNil 
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1068
	 or:[(p usedVars notNil and:[p usedVars includesAny:setOfNames])
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1069
	 or:[superBoolean and:[p usesSuper]]]) ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1070
	    newMethod := oldMethod copy.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1071
	    newMethod code:trapCode.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1072
	    newMethod literals:nil.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1073
	    newMethod byteCode:trapByteCode
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1074
	] ifFalse:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1075
	    newMethod := oldMethod.
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1076
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1077
	newMethodArray at:i put:newMethod
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1078
    ]
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1079
!
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1080
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1081
anyInvalidatedMethodsIn:aClass
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1082
    "return true, if aClass has any invalidated methods in it"
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1083
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1084
    |trap trapCode trapByteCode|
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1085
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1086
    trap := Metaclass compiledMethodAt:#invalidMethod.
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1087
    trapCode := trap code.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1088
    trapByteCode := trap byteCode.
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1089
68
59faa75185ba *** empty log message ***
claus
parents: 49
diff changeset
  1090
    aClass methodArray do:[:aMethod |
159
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1091
	trapCode notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1092
	    (aMethod code == trapCode) ifTrue:[^ true]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1093
	].
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1094
	trapByteCode notNil ifTrue:[
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1095
	    (aMethod byteCode == trapByteCode) ifTrue:[^ true]
514c749165c3 *** empty log message ***
claus
parents: 93
diff changeset
  1096
	]
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1097
    ].
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1098
    ^ false
195
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1099
!
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1100
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1101
checkConventionsFor:className instVarNames:instVarNameString classVarNames:classVarNameString
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1102
    "Check for some 'considered bad-style' things, like lower case names.
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1103
     NOTICE:
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1104
     I dont like the confirmers below - we need a notifying: argument, to give
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1105
     the outer codeview a chance to highlight the error.
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1106
     (but thats how its defined in the book - maybe I will change it anyway).
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1107
    "
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1108
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1109
    "let user confirm, if the classname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1110
    className first isUppercase ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1111
	(self confirm:'classenames should start with an uppercase letter
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1112
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1113
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1114
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1115
	    ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1116
		^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1117
	    ]
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1118
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1119
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1120
    "let user confirm, if any instvarname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1121
    (instVarNameString asCollectionOfWords 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1122
    findFirst:[:word | word first isUppercase]) ~~ 0 ifTrue:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1123
	(self confirm:'instance variable names should start with a lowercase letter
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1124
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1125
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1126
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1127
	ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1128
	    ^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1129
	]
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1130
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1131
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1132
    "let user confirm, if any classvarname is no good"
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1133
    (classVarNameString asCollectionOfWords 
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1134
    findFirst:[:word | word first isLowercase]) ~~ 0 ifTrue:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1135
	(self confirm:'class variable names should start with an uppercase letter
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1136
(by convention only)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1137
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1138
install anyway ?' withCRs)
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1139
	ifFalse:[
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1140
	    ^ false
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1141
	].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1142
    ].
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1143
515af3696a5c *** empty log message ***
claus
parents: 175
diff changeset
  1144
    ^ true
1
a27a279701f8 Initial revision
claus
parents:
diff changeset
  1145
! !